diff --git a/CHANGELOG.md b/CHANGELOG.md index a4e7d3965c..d4085ff5e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,10 @@ # Changelog -## Unreleased 0.76.0 +## Unreleased 0.77.0 ### 🚨 Breaking changes -- [](https://github.com/vegaprotocol/vega/issues/xxxxx) +- [](https://github.com/vegaprotocol/vega/issues/xxx) ### 🗑️ Deprecation @@ -12,11 +12,94 @@ ### 🛠 Improvements -- [](https://github.com/vegaprotocol/vega/issues/xxxxx) +- [](https://github.com/vegaprotocol/vega/issues/xxx) ### 🐛 Fixes -- [](https://github.com/vegaprotocol/vega/issues/xxxxx) +- [](https://github.com/vegaprotocol/vega/issues/xxx) + + +## 0.76.0 + +### 🚨 Breaking changes + +- [11079](https://github.com/vegaprotocol/vega/issues/11079) - rename decimal places fields for spots governance. + +### 🛠 Improvements + +- [10926](https://github.com/vegaprotocol/vega/issues/10926) - Backport governance proposal to change market name for spots +- [906](https://github.com/vegaprotocol/core-test-coverage/issues/906) - Add coverage for `0068-MATC-060` +- [907](https://github.com/vegaprotocol/core-test-coverage/issues/907) - Add coverage for `0068-MATC-061` +- [908](https://github.com/vegaprotocol/core-test-coverage/issues/908) - Add coverage for `0068-MATC-062` +- [909](https://github.com/vegaprotocol/core-test-coverage/issues/909) - Add coverage for `0068-MATC-063` +- [910](https://github.com/vegaprotocol/core-test-coverage/issues/910) - Add coverage for `0068-MATC-064` +- [911](https://github.com/vegaprotocol/core-test-coverage/issues/911) - Add coverage for `0068-MATC-065` +- [742](https://github.com/vegaprotocol/core-test-coverage/issues/742) - Add coverage for `0044-LIME-029` +- [10994](https://github.com/vegaprotocol/vega/pull/10994) - `rewards.team.minEpochsInTeam` can now be set to `0` +- [11061](https://github.com/vegaprotocol/vega/issues/11061) - `SLA` snapshot now loads current parameters and not pending ones. +- [11009](https://github.com/vegaprotocol/vega/issues/11009) - Relax market decimals validation in governance. +- [11036](https://github.com/vegaprotocol/vega/issues/11036) - Cross-margin mode: use max(order price, auction price) for margin calculation in auction +- [10998](https://github.com/vegaprotocol/vega/issues/10998) - Ensure reward totals are carried over across epochs in database. +- [1102](https://github.com/vegaprotocol/core-test-coverage/issues/1102) - Add coverage for `0042-LIQF-084` +- [11121](https://github.com/vegaprotocol/vega/issues/11121) - Remove auction trigger staleness functionality +- [11127](https://github.com/vegaprotocol/vega/issues/11127) - Price monitoring engine should record all observations with the same weight +- [10995](https://github.com/vegaprotocol/vega/issues/10995) - Liquidation range defined by its own parameter. +- [11167](https://github.com/vegaprotocol/vega/issues/11167) - Add realised return reward metric. +- [11165](https://github.com/vegaprotocol/vega/issues/11165) - Include negative returns in relative returns reward metric. +- [11151](https://github.com/vegaprotocol/vega/issues/11151) - Remove name field from the spot markets. +- [11170](https://github.com/vegaprotocol/vega/issues/11170) - Add transfer interval support. +- [11143](https://github.com/vegaprotocol/vega/issues/11143) - Add support for new asset proposal in batch governance proposal. +- [11184](https://github.com/vegaprotocol/vega/issues/11184) - relax the transfer restriction of 'same transfer' to match the full dispatch strategy. +- [11185](https://github.com/vegaprotocol/vega/issues/11185) - distinguish between zero and none metric for rewards. +- [11158](https://github.com/vegaprotocol/vega/issues/11158) - resolve the quote asset for fee estimation in spot market. +- [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. + +### 🐛 Fixes + +- [10946](https://github.com/vegaprotocol/vega/issues/10945) - Save dispatch strategy for recurring governance transfer in the database. +- [11000](https://github.com/vegaprotocol/vega/issues/11000) - Vesting summary events are now sorted properly before sending. +- [11065](https://github.com/vegaprotocol/vega/issues/11065) - `SLA` commitment state is reset properly at the end of an epoch +- [10960](https://github.com/vegaprotocol/vega/issues/10960) - Only the owner of a referral set can update it. +- [10970](https://github.com/vegaprotocol/vega/issues/10970) - Logic for whether a team member joined more than `rewards.team.minEpochsInTeam` is fixed. +- [10943](https://github.com/vegaprotocol/vega/issues/10943) - Fix error message format when node vote is sent again. +- [10928](https://github.com/vegaprotocol/vega/issues/10928) - Fix `collateralIncreaseEstimate` for limit orders in isolated margin mode +- [10952](https://github.com/vegaprotocol/vega/issues/10952) - Fix bug that caused spot markets to get stuck in opening auction. +- [10950](https://github.com/vegaprotocol/vega/issues/10950) - Fix bug that caused cancelled liquidity provisions to stick around after opening auction. +- [10975](https://github.com/vegaprotocol/vega/issues/10975) - Fix marshaller for stop order rejection error. +- [10973](https://github.com/vegaprotocol/vega/issues/10973) - Avoid entering an auction or doing mark-to-market before market entered opening auction or after it is in a terminal state. +- [10969](https://github.com/vegaprotocol/vega/issues/10969) - Ensure teams statistics are computed from team rewards. +- [10962](https://github.com/vegaprotocol/vega/issues/10962) - Fix `lastFeeDistribution` time in snapshot. +- [10974](https://github.com/vegaprotocol/vega/issues/10974) - Target stake for spot should not consider position factor. +- [10980](https://github.com/vegaprotocol/vega/issues/10980) - Make `gRPC` message size limit configurable, default to 20MB. +- [10984](https://github.com/vegaprotocol/vega/issues/10984) - Save has traded flag from spot to snapshot. +- [10997](https://github.com/vegaprotocol/vega/issues/10997) - Handle cases where leaving opening auction triggers monitoring auction. +- [11010](https://github.com/vegaprotocol/vega/issues/11010) - Release bond in spot market when market is terminated. +- [11033](https://github.com/vegaprotocol/vega/issues/11033) - Do not track positions for spots in datanode. +- [11016](https://github.com/vegaprotocol/vega/issues/11016) - Update holding account when amending order with cancel/replace on remaining funds. +- [11038](https://github.com/vegaprotocol/vega/issues/11038) - Simplify price ranges state. +- [11042](https://github.com/vegaprotocol/vega/issues/11042) - Add missing value to enum. +- [11059](https://github.com/vegaprotocol/vega/issues/11059) - Disambiguate `vega_time` in order clause. +- [11052](https://github.com/vegaprotocol/vega/pull/11052) - Add missing rejection reason in GraphQL schema for proposals +- [11073](https://github.com/vegaprotocol/vega/issues/11073) - Handle properly price factor < 1. +- [11047](https://github.com/vegaprotocol/vega/issues/11047) - Add missing migration for recreating stop order views after the new fields were added. +- [11090](https://github.com/vegaprotocol/vega/issues/11090) - Games API should only use the current team members. +- [11089](https://github.com/vegaprotocol/vega/issues/11089) - Add tests for proto `enums` persisted to database. +- [11105](https://github.com/vegaprotocol/vega/issues/11105) - Include all paid fees in reward cap. +- [1109](https://github.com/vegaprotocol/core-test-coverage/issues/1109) - Correctly label acceptance coverage for `0042-LIQF-091`. +- [11130](https://github.com/vegaprotocol/vega/issues/11130) - Add missing initialisation for max stop orders in spots. +- [11133](https://github.com/vegaprotocol/vega/issues/11133) - Fix spot product resolver +- [11154](https://github.com/vegaprotocol/vega/issues/11154) - Fix spot risk model resolver. +- [11159](https://github.com/vegaprotocol/vega/issues/11159) - Reject stop orders with size override position for spot product. +- [11161](https://github.com/vegaprotocol/vega/issues/11161) - Add validation for time in force GFA in stop order submission. +- [11177](https://github.com/vegaprotocol/vega/issues/11177) - Adjust the formulas for reduced position to the spec update and fix handling of closed out position. +- [11193](https://github.com/vegaprotocol/vega/issues/11193) - Fix loading of liquidation strategy from proto with missing data. +- [11200](https://github.com/vegaprotocol/vega/issues/11200) - Make sure a party can afford the trades before they are submitted to the book. +- [11205](https://github.com/vegaprotocol/vega/issues/11205) - Evaluate transfer interval correctly. +- [10374](https://github.com/vegaprotocol/vega/issues/10374) - Add transfer ID to recurring governance transfer ledger entries. +- [11221](https://github.com/vegaprotocol/vega/issues/11221) - Fix for `totalRewardsEarned` being twice the `rewardEarned`. + ## 0.75.0 @@ -88,6 +171,9 @@ - [10904](https://github.com/vegaprotocol/vega/issues/10904) - Balance changes API should validate date range properly. - [10911](https://github.com/vegaprotocol/vega/issues/10911) - Fix `unregistration` of spot market state var. - [10915](https://github.com/vegaprotocol/vega/issues/10915) - Fix duplicate deposit entries, add new `STATUS_DUPLICATE_REJECTED` status. +- [11047](https://github.com/vegaprotocol/vega/issues/11047) - Fix proto conversion for stop orders. +- [11041](https://github.com/vegaprotocol/vega/issues/11041) - Add validation for genesis asset quantum. +- [11011](https://github.com/vegaprotocol/vega/issues/11011) - Make spot fees best effort. ## 0.74.3 @@ -121,12 +207,11 @@ - [10683](https://github.com/vegaprotocol/vega/issues/10683) - Fix GraphQL does not correctly marshal transfers status in filter. - [10685](https://github.com/vegaprotocol/vega/issues/10685) - Fix list transfers returns too much data.. - [10691](https://github.com/vegaprotocol/vega/issues/10691) - Fix team stats include rewards from individual games -- [10647](https://github.com/vegaprotocol/vega/issues/10647) Add filter by game ID to transfers API. +- [10647](https://github.com/vegaprotocol/vega/issues/10647) Add filter by game ID to transfers API. - [10649](https://github.com/vegaprotocol/vega/issues/10649) - Ensure markets do not get stuck in liquidity auction after protocol upgrade. - [10696](https://github.com/vegaprotocol/vega/issues/10696) - Fix position updates to undo positions changes on isolated margin failure. - [10712](https://github.com/vegaprotocol/vega/issues/10712) - Fix the unit of auction extension and leave check auction early if governance auction has been extended. - ## 0.74.1 ### 🐛 Fixes @@ -223,6 +308,9 @@ - [10517](https://github.com/vegaprotocol/vega/issues/10517) - Add optional cap to metric based rewards. - [10246](https://github.com/vegaprotocol/vega/issues/10246) - Add quantum volumes to teams statistics API. - [10550](https://github.com/vegaprotocol/vega/issues/10550) - Update network parameters with default values. +- [10612](https://github.com/vegaprotocol/vega/issues/10612) - Convert all assets to be associated to the configured Ethereum chain. +- [10624](https://github.com/vegaprotocol/vega/issues/10624) - Ensure chain event are not duplicated when chain identifier is missing. +- [10623](https://github.com/vegaprotocol/vega/issues/10623) - Introduce secondary Ethereum client ### 🐛 Fixes diff --git a/Makefile b/Makefile index 1d884e7fbb..34a3bb47ce 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ integrationtest: ## run integration tests, showing ledger movements and full sce .PHONY: gqlgen gqlgen: - cd datanode/gateway/graphql && go run github.com/99designs/gqlgen@v0.17.20 --config=gqlgen.yml + cd datanode/gateway/graphql && go run github.com/99designs/gqlgen@v0.17.45 --config=gqlgen.yml .PHONY: race race: ## Run data race detector diff --git a/cmd/data-node/commands/networkhistory/networkhistory.go b/cmd/data-node/commands/networkhistory/networkhistory.go index 6a8af1c761..2048b0d5a1 100644 --- a/cmd/data-node/commands/networkhistory/networkhistory.go +++ b/cmd/data-node/commands/networkhistory/networkhistory.go @@ -70,7 +70,7 @@ func NetworkHistory(_ context.Context, parser *flags.Parser) error { } func getDatanodeClient(cfg config.Config) (v2.TradingDataServiceClient, *grpc.ClientConn, error) { - return networkhistory.GetDatanodeClientFromIPAndPort(cfg.API.IP, cfg.API.Port) + return networkhistory.GetDatanodeClientFromIPAndPort(cfg.API.IP, cfg.API.Port, cfg.API.MaxMsgSize) } func getDatanodeAdminClient(log *logging.Logger, cfg config.Config) *admin.Client { diff --git a/cmd/vega/commands/announce_node.go b/cmd/vega/commands/announce_node.go index 1fb5420445..ecdd7beb01 100644 --- a/cmd/vega/commands/announce_node.go +++ b/cmd/vega/commands/announce_node.go @@ -38,6 +38,7 @@ import ( "github.com/jessevdk/go-flags" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) type AnnounceNodeCmd struct { @@ -203,8 +204,7 @@ func getNodeWalletCommander(log *logging.Logger, registryPass string, vegaPaths return nil, nil, nil, fmt.Errorf("couldn't initialise ABCI client: %w", err) } - coreClient, err := getCoreClient( - net.JoinHostPort(cfg.API.IP, strconv.Itoa(cfg.API.Port))) + coreClient, err := getCoreClient(net.JoinHostPort(cfg.API.IP, strconv.Itoa(cfg.API.Port))) if err != nil { return nil, nil, nil, fmt.Errorf("couldn't connect to node: %w", err) } @@ -232,7 +232,7 @@ func (h heightProvider) Height() uint64 { } func getCoreClient(address string) (api.CoreServiceClient, error) { - tdconn, err := grpc.Dial(address, grpc.WithInsecure()) + tdconn, err := grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { return nil, err } diff --git a/cmd/vega/commands/bridge/erc20.go b/cmd/vega/commands/bridge/erc20.go index 7d59f8ef25..89c10d0a23 100644 --- a/cmd/vega/commands/bridge/erc20.go +++ b/cmd/vega/commands/bridge/erc20.go @@ -33,8 +33,8 @@ import ( type ERC20Cmd struct { config.VegaHomeFlag config.PassphraseFlag - Config nodewallets.Config - PrivateKey string `description:"A ethereum private key to be use to sign the messages" long:"private-key" required:"false"` + PrivateKey string `description:"A ethereum private key to be use to sign the messages" long:"private-key" required:"false"` + ChainID string `description:"The chain-id of the EVM bridge. Not required if generating signatures for the Ethereum bridge" long:"chain-id" required:"false"` AddSigner ERC20AddSignerCmd `command:"add_signer" description:"Create signature to add a new signer to the erc20 bridge"` RemoveSigner ERC20RemoveSignerCmd `command:"remove_signer" description:"Create signature to remove a signer from the erc20 bridge"` @@ -59,38 +59,36 @@ type ERC20Cmd struct { var erc20Cmd *ERC20Cmd func (e *ERC20Cmd) GetSigner() (bridges.Signer, error) { - vegaPaths := paths.New(e.VegaHome) - - _, conf, err := config.EnsureNodeConfig(vegaPaths) - if err != nil { - return nil, err - } - - e.Config = conf.NodeWallet - - var s bridges.Signer if len(e.PrivateKey) <= 0 { pass, err := erc20Cmd.PassphraseFile.Get("node wallet", false) if err != nil { return nil, err } - s, err = nodewallets.GetEthereumWallet(vegaPaths, pass) - if err != nil { - return nil, fmt.Errorf("couldn't get Ethereum node wallet: %w", err) + vegaPaths := paths.New(e.VegaHome) + + if _, _, err := config.EnsureNodeConfig(vegaPaths); err != nil { + return nil, err } - } else { - s, err = NewPrivKeySigner(e.PrivateKey) + + s, err := nodewallets.GetEthereumWallet(vegaPaths, pass) if err != nil { - return nil, fmt.Errorf("couldn't load private key: %w", err) + return nil, fmt.Errorf("couldn't get Ethereum node wallet: %w", err) } + + return s, nil } + + s, err := NewPrivKeySigner(e.PrivateKey) + if err != nil { + return nil, fmt.Errorf("couldn't load private key: %w", err) + } + return s, nil } func ERC20() *ERC20Cmd { erc20Cmd = &ERC20Cmd{ - Config: nodewallets.NewDefaultConfig(), AddSigner: ERC20AddSignerCmd{}, RemoveSigner: ERC20RemoveSignerCmd{}, SetThreshold: ERC20SetThresholdCmd{}, @@ -144,7 +142,7 @@ func (opts *ERC20WithdrawAssetCmd) Execute(_ []string) error { creation := time.Unix(opts.Creation, 0) - erc20Logic := bridges.NewERC20Logic(w, opts.BridgeAddress) + erc20Logic := bridges.NewERC20Logic(w, opts.BridgeAddress, erc20Cmd.ChainID, erc20Cmd.ChainID == "") bundle, err := erc20Logic.WithdrawAsset( opts.TokenAddress, amount, opts.ReceiverAddress, creation, nonce, ) @@ -191,7 +189,7 @@ func (opts *ERC20VerifyWithdrawAssetCmd) Execute(_ []string) error { return errors.New("invalid signatures format") } - erc20Logic := bridges.NewERC20Logic(nil, opts.BridgeAddress) + erc20Logic := bridges.NewERC20Logic(nil, opts.BridgeAddress, erc20Cmd.ChainID, erc20Cmd.ChainID == "") addresses, err := erc20Logic.VerifyWithdrawAsset( opts.TokenAddress, amount, opts.ReceiverAddress, creation, nonce, opts.Signatures, ) @@ -238,7 +236,7 @@ func (opts *ERC20ListAssetCmd) Execute(_ []string) error { return errors.New("invalid withdraw-threshold, needs to be base 10") } - erc20Logic := bridges.NewERC20Logic(w, opts.BridgeAddress) + erc20Logic := bridges.NewERC20Logic(w, opts.BridgeAddress, erc20Cmd.ChainID, erc20Cmd.ChainID == "") bundle, err := erc20Logic.ListAsset( opts.TokenAddress, opts.VegaAssetID, lifetimeLimit, withdrawThreshod, nonce, ) @@ -286,7 +284,7 @@ func (opts *ERC20VerifyListAssetCmd) Execute(_ []string) error { return errors.New("invalid signatures format") } - erc20Logic := bridges.NewERC20Logic(nil, opts.BridgeAddress) + erc20Logic := bridges.NewERC20Logic(nil, opts.BridgeAddress, erc20Cmd.ChainID, erc20Cmd.ChainID == "") addresses, err := erc20Logic.VerifyListAsset( opts.TokenAddress, opts.VegaAssetID, lifetimeLimit, withdrawThreshod, nonce, opts.Signatures, ) @@ -322,7 +320,7 @@ func (opts *ERC20RemoveAssetCmd) Execute(_ []string) error { return errors.New("invalid nonce, needs to be base 10") } - erc20Logic := bridges.NewERC20Logic(w, opts.BridgeAddress) + erc20Logic := bridges.NewERC20Logic(w, opts.BridgeAddress, erc20Cmd.ChainID, erc20Cmd.ChainID == "") bundle, err := erc20Logic.RemoveAsset( opts.TokenAddress, nonce, ) @@ -355,7 +353,7 @@ func (opts *ERC20AddSignerCmd) Execute(_ []string) error { return errors.New("invalid nonce, needs to be base 10") } - multiSigControl := bridges.NewERC20MultiSigControl(w) + multiSigControl := bridges.NewERC20MultiSigControl(w, erc20Cmd.ChainID, erc20Cmd.ChainID == "") bundle, err := multiSigControl.AddSigner( opts.NewSigner, opts.Submitter, nonce, ) @@ -388,7 +386,7 @@ func (opts *ERC20RemoveSignerCmd) Execute(_ []string) error { return errors.New("invalid nonce, needs to be base 10") } - multiSigControl := bridges.NewERC20MultiSigControl(w) + multiSigControl := bridges.NewERC20MultiSigControl(w, erc20Cmd.ChainID, erc20Cmd.ChainID == "") bundle, err := multiSigControl.RemoveSigner( opts.OldSigner, opts.Submitter, nonce, ) @@ -425,7 +423,7 @@ func (opts *ERC20SetThresholdCmd) Execute(_ []string) error { return errors.New("invalid nonce, needs to be base 10 and not overflow") } - multiSigControl := bridges.NewERC20MultiSigControl(w) + multiSigControl := bridges.NewERC20MultiSigControl(w, erc20Cmd.ChainID, erc20Cmd.ChainID == "") bundle, err := multiSigControl.SetThreshold( opts.NewThreshold, opts.Submitter, nonce, ) @@ -457,7 +455,7 @@ func (opts *ERC20BurnNonceCmd) Execute(_ []string) error { return errors.New("invalid nonce, needs to be base 10 and not overflow") } - multiSigControl := bridges.NewERC20MultiSigControl(w) + multiSigControl := bridges.NewERC20MultiSigControl(w, erc20Cmd.ChainID, erc20Cmd.ChainID == "") bundle, err := multiSigControl.BurnNonce(opts.Submitter, nonce) if err != nil { return fmt.Errorf("unable to generate signature: %w", err) @@ -488,7 +486,7 @@ func (opts *ERC20SetBridgeAddressCmd) Execute(_ []string) error { return errors.New("invalid nonce, needs to be base 10") } - erc20Logic := bridges.NewERC20AssetPool(w, opts.AssetPoolAddress) + erc20Logic := bridges.NewERC20AssetPool(w, opts.AssetPoolAddress, erc20Cmd.ChainID, erc20Cmd.ChainID == "") bundle, err := erc20Logic.SetBridgeAddress( opts.NewAddress, nonce, ) @@ -521,7 +519,7 @@ func (opts *ERC20SetMultisigControlCmd) Execute(_ []string) error { return errors.New("invalid nonce, needs to be base 10") } - erc20Logic := bridges.NewERC20AssetPool(w, opts.AssetPoolAddress) + erc20Logic := bridges.NewERC20AssetPool(w, opts.AssetPoolAddress, erc20Cmd.ChainID, erc20Cmd.ChainID == "") bundle, err := erc20Logic.SetMultiSigControl( opts.NewAddress, nonce, ) @@ -553,7 +551,7 @@ func (opts *ERC20GlobalStopCmd) Execute(_ []string) error { return errors.New("invalid nonce, needs to be base 10 and not overflow") } - erc20 := bridges.NewERC20Logic(w, opts.BridgeAddress) + erc20 := bridges.NewERC20Logic(w, opts.BridgeAddress, erc20Cmd.ChainID, erc20Cmd.ChainID == "") bundle, err := erc20.GlobalStop( nonce, ) @@ -585,7 +583,7 @@ func (opts *ERC20GlobalResumeCmd) Execute(_ []string) error { return errors.New("invalid nonce, needs to be base 10 and not overflow") } - erc20 := bridges.NewERC20Logic(w, opts.BridgeAddress) + erc20 := bridges.NewERC20Logic(w, opts.BridgeAddress, erc20Cmd.ChainID, erc20Cmd.ChainID == "") bundle, err := erc20.GlobalResume( nonce, ) @@ -621,7 +619,7 @@ func (opts *ERC20VerifyGlobalResumeCmd) Execute(_ []string) error { return errors.New("invalid signatures format") } - erc20 := bridges.NewERC20Logic(nil, opts.BridgeAddress) + erc20 := bridges.NewERC20Logic(nil, opts.BridgeAddress, erc20Cmd.ChainID, erc20Cmd.ChainID == "") signers, err := erc20.VerifyGlobalResume( nonce, opts.Signatures, ) @@ -634,8 +632,6 @@ func (opts *ERC20VerifyGlobalResumeCmd) Execute(_ []string) error { fmt.Printf("%v\n", v) } return nil - - return nil } type ERC20SetAssetLimitsCmd struct { @@ -671,7 +667,7 @@ func (opts *ERC20SetAssetLimitsCmd) Execute(_ []string) error { return errors.New("invalid deposit-lifetime-maximum needs to be base 10 and not overflow") } - erc20 := bridges.NewERC20Logic(w, opts.BridgeAddress) + erc20 := bridges.NewERC20Logic(w, opts.BridgeAddress, erc20Cmd.ChainID, erc20Cmd.ChainID == "") bundle, err := erc20.SetAssetLimits( opts.TokenAddress, depositLifetime, threshold, nonce, ) @@ -720,7 +716,7 @@ func (opts *ERC20VerifySetAssetLimitsCmd) Execute(_ []string) error { return errors.New("invalid signatures format") } - erc20 := bridges.NewERC20Logic(nil, opts.BridgeAddress) + erc20 := bridges.NewERC20Logic(nil, opts.BridgeAddress, erc20Cmd.ChainID, erc20Cmd.ChainID == "") signers, err := erc20.VerifySetAssetLimits( opts.TokenAddress, depositLifetime, threshold, nonce, opts.Signatures, ) @@ -756,7 +752,7 @@ func (opts *ERC20SetWithdrawDelayCmd) Execute(_ []string) error { return errors.New("invalid nonce, needs to be base 10 and not overflow") } - erc20 := bridges.NewERC20Logic(w, opts.BridgeAddress) + erc20 := bridges.NewERC20Logic(w, opts.BridgeAddress, erc20Cmd.ChainID, erc20Cmd.ChainID == "") bundle, err := erc20.SetWithdrawDelay( opts.Delay, nonce, ) @@ -793,7 +789,7 @@ func (opts *ERC20VerifySetWithdrawDelayCmd) Execute(_ []string) error { return errors.New("invalid signatures format") } - erc20Logic := bridges.NewERC20Logic(nil, opts.BridgeAddress) + erc20Logic := bridges.NewERC20Logic(nil, opts.BridgeAddress, erc20Cmd.ChainID, erc20Cmd.ChainID == "") addresses, err := erc20Logic.VerifyWithdrawDelay( opts.Delay, nonce, opts.Signatures, ) diff --git a/cmd/vega/commands/node/node.go b/cmd/vega/commands/node/node.go index 2b9e7740f1..b48cd487a2 100644 --- a/cmd/vega/commands/node/node.go +++ b/cmd/vega/commands/node/node.go @@ -70,9 +70,13 @@ type Command struct { vegaPaths paths.Paths - ethClient *ethclient.Client - ethConfirmations *ethclient.EthereumConfirmations - l2Clients *ethclient.L2Clients + primaryEthClient *ethclient.PrimaryClient + primaryEthConfirmations *ethclient.EthereumConfirmations + + secondaryEthClient *ethclient.SecondaryClient + secondaryEthConfirmations *ethclient.EthereumConfirmations + + l2Clients *ethclient.L2Clients abciApp *appW protocol *protocol.Protocol @@ -108,7 +112,7 @@ func (n *Command) Run( } if err := n.loadNodeWallets(); err != nil { - return err + return fmt.Errorf("could not load the node wallets: %w", err) } if err := n.startBlockchainClients(); err != nil { @@ -125,8 +129,10 @@ func (n *Command) Run( n.cancel, n.stopBlockchain, n.nodeWallets, - n.ethClient, - n.ethConfirmations, + n.primaryEthClient, + n.secondaryEthClient, + n.primaryEthConfirmations, + n.secondaryEthConfirmations, n.blockchainClient, vegaPaths, n.stats, @@ -450,7 +456,7 @@ func (n *Command) startBlockchainClients() error { // We may not need ethereum client initialized when we have not // provided the ethereum endpoint. We skip creating client here // when RPCEnpoint is empty and the nullchain present. - if len(n.conf.Ethereum.RPCEndpoint) < 1 && n.conf.Blockchain.ChainProvider == blockchain.ProviderNullChain { + if n.conf.IsNullChain() && !n.conf.HaveEthClient() { return nil } @@ -460,11 +466,23 @@ func (n *Command) startBlockchainClients() error { return fmt.Errorf("could not instantiate ethereum l2 clients: %w", err) } - n.ethClient, err = ethclient.Dial(n.ctx, n.conf.Ethereum) + n.primaryEthClient, err = ethclient.PrimaryDial(n.ctx, n.conf.Ethereum) + if err != nil { + return fmt.Errorf("could not instantiate primary ethereum client: %w", err) + } + + n.secondaryEthClient, err = ethclient.SecondaryDial(n.ctx, n.conf.Ethereum) if err != nil { - return fmt.Errorf("could not instantiate ethereum client: %w", err) + return fmt.Errorf("could not instantiate secondary ethereum client: %w", err) } - n.ethConfirmations = ethclient.NewEthereumConfirmations(n.conf.Ethereum, n.ethClient, nil) + + 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) return nil } diff --git a/cmd/vega/commands/verify/genesis.go b/cmd/vega/commands/verify/genesis.go index 5f58f6a852..3eef423116 100644 --- a/cmd/vega/commands/verify/genesis.go +++ b/cmd/vega/commands/verify/genesis.go @@ -55,6 +55,7 @@ type asset struct { ContractAddress string `json:"contract_address"` LifetimeLimit string `json:"lifetime_limit"` WithdrawThreshold string `json:"withdraw_threshold"` + ChainID string `json:"chain_id"` } `json:"erc20,omitempty"` } } @@ -89,8 +90,8 @@ func verifyAssets(r *reporter, assets map[string]asset) { } for k, v := range assets { - if _, failed := num.UintFromString(v.Quantum, 10); failed { - r.Err("app_state.assets[%s].quantum not a valid number: %s", k, v.Quantum) + if n, failed := num.UintFromString(v.Quantum, 10); failed || n.IsNegative() || n.IsZero() { + r.Err("app_state.assets[%s].quantum not a valid positive number: %s", k, v.Quantum) } switch { diff --git a/cmd/vega/commands/verify/genesis_test.go b/cmd/vega/commands/verify/genesis_test.go index d8f9b77a35..d68e88cbeb 100644 --- a/cmd/vega/commands/verify/genesis_test.go +++ b/cmd/vega/commands/verify/genesis_test.go @@ -100,6 +100,7 @@ func testVerifyERC20Assets(t *testing.T) { Source: &assets.Source{ Erc20: &assets.Erc20{ ContractAddress: "0xBC944ba38753A6fCAdd634Be98379330dbaB3Eb8", + ChainID: "1", }, }, } @@ -112,6 +113,7 @@ func testVerifyERC20Assets(t *testing.T) { Source: &assets.Source{ Erc20: &assets.Erc20{ ContractAddress: "invalid", + ChainID: "1", }, }, } @@ -124,6 +126,7 @@ func testVerifyERC20Assets(t *testing.T) { Source: &assets.Source{ Erc20: &assets.Erc20{ ContractAddress: "0xF0a9b5d3a00b53362F9b73892124743BAaE526c4", + ChainID: "1", }, }, } diff --git a/commands/batch_proposal_submission.go b/commands/batch_proposal_submission.go index 4415d1a510..4b6f1004be 100644 --- a/commands/batch_proposal_submission.go +++ b/commands/batch_proposal_submission.go @@ -117,6 +117,8 @@ func checkBatchProposalChanges(terms *protoTypes.BatchProposalTermsChange) Error errs.Merge(checkNetworkParameterUpdateBatchChanges(c)) case *protoTypes.BatchProposalTermsChange_UpdateAsset: errs.Merge(checkUpdateAssetBatchChanges(c)) + case *protoTypes.BatchProposalTermsChange_NewAsset: + errs.Merge(checkNewAssetBatchChanges(c)) case *protoTypes.BatchProposalTermsChange_NewFreeform: errs.Merge(checkNewFreeformBatchChanges(c)) case *protoTypes.BatchProposalTermsChange_NewTransfer: @@ -208,6 +210,16 @@ func checkUpdateAssetBatchChanges(change *protoTypes.BatchProposalTermsChange_Up return checkUpdateAsset(change.UpdateAsset).AddPrefix("batch_proposal_submission.terms.changes.") } +func checkNewAssetBatchChanges(change *protoTypes.BatchProposalTermsChange_NewAsset) Errors { + errs := NewErrors() + + if change.NewAsset == nil { + return errs.FinalAddForProperty("batch_proposal_submission.terms.changes.new_asset", ErrIsRequired) + } + + return checkBatchNewAssetChanges(change).AddPrefix("batch_proposal_submission.terms.changes.") +} + func checkNewFreeformBatchChanges(change *protoTypes.BatchProposalTermsChange_NewFreeform) Errors { errs := NewErrors() diff --git a/commands/issue_signatures.go b/commands/issue_signatures.go index 5e39e636a1..85e782d5cd 100644 --- a/commands/issue_signatures.go +++ b/commands/issue_signatures.go @@ -45,5 +45,9 @@ func checkIssueSignatures(cmd *commandspb.IssueSignatures) Errors { errs.AddForProperty("issue_signatures.kind", ErrIsNotValid) } + if len(cmd.ChainId) == 0 { + errs.AddForProperty("issue_signatures.chain_id", ErrIsRequired) + } + return errs } diff --git a/commands/proposal_submission.go b/commands/proposal_submission.go index 414fb2e00c..917ca2d934 100644 --- a/commands/proposal_submission.go +++ b/commands/proposal_submission.go @@ -52,6 +52,7 @@ var validTransfers = map[protoTypes.AccountType]map[protoTypes.AccountType]struc protoTypes.AccountType_ACCOUNT_TYPE_REWARD_RELATIVE_RETURN: {}, protoTypes.AccountType_ACCOUNT_TYPE_REWARD_RETURN_VOLATILITY: {}, protoTypes.AccountType_ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING: {}, + protoTypes.AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN: {}, }, protoTypes.AccountType_ACCOUNT_TYPE_INSURANCE: { protoTypes.AccountType_ACCOUNT_TYPE_GENERAL: {}, @@ -67,6 +68,7 @@ var validTransfers = map[protoTypes.AccountType]map[protoTypes.AccountType]struc protoTypes.AccountType_ACCOUNT_TYPE_REWARD_RELATIVE_RETURN: {}, protoTypes.AccountType_ACCOUNT_TYPE_REWARD_RETURN_VOLATILITY: {}, protoTypes.AccountType_ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING: {}, + protoTypes.AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN: {}, }, protoTypes.AccountType_ACCOUNT_TYPE_GLOBAL_INSURANCE: { protoTypes.AccountType_ACCOUNT_TYPE_GENERAL: {}, @@ -81,6 +83,7 @@ var validTransfers = map[protoTypes.AccountType]map[protoTypes.AccountType]struc protoTypes.AccountType_ACCOUNT_TYPE_REWARD_RELATIVE_RETURN: {}, protoTypes.AccountType_ACCOUNT_TYPE_REWARD_RETURN_VOLATILITY: {}, protoTypes.AccountType_ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING: {}, + protoTypes.AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN: {}, }, } @@ -284,6 +287,48 @@ func checkNewAssetChanges(change *protoTypes.ProposalTerms_NewAsset) Errors { return errs } +func checkBatchNewAssetChanges(change *protoTypes.BatchProposalTermsChange_NewAsset) Errors { + errs := NewErrors() + + if change.NewAsset == nil { + return errs.FinalAddForProperty("proposal_submission.terms.change.new_asset", ErrIsRequired) + } + + if change.NewAsset.Changes == nil { + return errs.FinalAddForProperty("proposal_submission.terms.change.new_asset.changes", ErrIsRequired) + } + + if len(change.NewAsset.Changes.Name) == 0 { + errs.AddForProperty("proposal_submission.terms.change.new_asset.changes.name", ErrIsRequired) + } + if len(change.NewAsset.Changes.Symbol) == 0 { + errs.AddForProperty("proposal_submission.terms.change.new_asset.changes.symbol", ErrIsRequired) + } + + if len(change.NewAsset.Changes.Quantum) <= 0 { + errs.AddForProperty("proposal_submission.terms.change.new_asset.changes.quantum", ErrIsRequired) + } else if quantum, err := num.DecimalFromString(change.NewAsset.Changes.Quantum); err != nil { + errs.AddForProperty("proposal_submission.terms.change.new_asset.changes.quantum", ErrIsNotValidNumber) + } else if quantum.LessThanOrEqual(num.DecimalZero()) { + errs.AddForProperty("proposal_submission.terms.change.new_asset.changes.quantum", ErrMustBePositive) + } + + if change.NewAsset.Changes.Source == nil { + return errs.FinalAddForProperty("proposal_submission.terms.change.new_asset.changes.source", ErrIsRequired) + } + + switch s := change.NewAsset.Changes.Source.(type) { + case *protoTypes.AssetDetails_BuiltinAsset: + errs.Merge(checkBuiltinAssetSource(s)) + case *protoTypes.AssetDetails_Erc20: + errs.Merge(checkERC20AssetSource(s)) + default: + return errs.FinalAddForProperty("proposal_submission.terms.change.new_asset.changes.source", ErrIsNotValid) + } + + return errs +} + func CheckNewFreeformChanges(change *protoTypes.ProposalTerms_NewFreeform) Errors { errs := NewErrors() @@ -638,7 +683,8 @@ func checkNewTransferConfiguration(changes *vegapb.NewTransferConfiguration) Err changes.DestinationType == vega.AccountType_ACCOUNT_TYPE_REWARD_AVERAGE_POSITION || changes.DestinationType == vega.AccountType_ACCOUNT_TYPE_REWARD_RELATIVE_RETURN || changes.DestinationType == vega.AccountType_ACCOUNT_TYPE_REWARD_RETURN_VOLATILITY || - changes.DestinationType == vega.AccountType_ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING { + changes.DestinationType == vega.AccountType_ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING || + changes.DestinationType == vega.AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN { errs.AddForProperty("new_transfer.changes.destination_type", ErrIsNotValid) } if oneoff.DeliverOn < 0 { @@ -698,6 +744,10 @@ func checkERC20AssetSource(s *protoTypes.AssetDetails_Erc20) Errors { asset := s.Erc20 + if len(asset.ChainId) == 0 { + errs.AddForProperty("proposal_submission.terms.change.new_asset.changes.source.erc20.chain_id", ErrIsRequired) + } + if len(asset.ContractAddress) == 0 { errs.AddForProperty("proposal_submission.terms.change.new_asset.changes.source.erc20.contract_address", ErrIsRequired) } @@ -846,11 +896,11 @@ func checkNewSpotMarketConfiguration(changes *vegapb.NewSpotMarketConfiguration) if !isCorrectProduct { return errs.FinalAddForProperty("new_spot_market.changes.instrument.product", ErrIsMismatching) } - if changes.DecimalPlaces >= 150 { + if changes.PriceDecimalPlaces >= 150 { errs.AddForProperty("new_spot_market.changes.decimal_places", ErrMustBeLessThan150) } - if changes.PositionDecimalPlaces >= 7 || changes.PositionDecimalPlaces <= -7 { + if changes.SizeDecimalPlaces >= 7 || changes.SizeDecimalPlaces <= -7 { errs.AddForProperty("new_spot_market.changes.position_decimal_places", ErrMustBeWithinRange7) } errs.Merge(checkPriceMonitoring(changes.PriceMonitoringParameters, "new_spot_market.changes")) @@ -859,6 +909,7 @@ func checkNewSpotMarketConfiguration(changes *vegapb.NewSpotMarketConfiguration) errs.Merge(checkNewSpotRiskParameters(changes)) errs.Merge(checkSLAParams(changes.SlaParams, "new_spot_market.changes.sla_params")) errs.Merge(checkTickSize(changes.TickSize, "new_spot_market.changes")) + errs.Merge(checkLiquidityFeeSettings(changes.LiquidityFeeSettings, "new_spot_market.changes.liquidity_fee_settings")) return errs } @@ -1013,11 +1064,13 @@ func checkUpdateSpotMarket(updateSpotMarket *vegapb.UpdateSpotMarket) Errors { } changes := updateSpotMarket.Changes + errs.Merge(checkUpdateSpotInstrument(changes.Instrument).AddPrefix("proposal_submission.terms.change.")) errs.Merge(checkPriceMonitoring(changes.PriceMonitoringParameters, "update_spot_market.changes")) errs.Merge(checkTargetStakeParams(changes.TargetStakeParameters, "update_spot_market.changes")) errs.Merge(checkUpdateSpotRiskParameters(changes)) errs.Merge(checkSLAParams(changes.SlaParams, "update_spot_market.changes.sla_params")) errs.Merge(checkTickSize(changes.TickSize, "update_spot_market.changes")) + errs.Merge(checkLiquidityFeeSettings(changes.LiquidityFeeSettings, "update_spot_market.changes.liquidity_fee_settings")) return errs } @@ -1077,6 +1130,10 @@ func checkLiquidationStrategy(params *protoTypes.LiquidationStrategy, parent str } else if params.DisposalTimeStep > 3600 { errs.AddForProperty(fmt.Sprintf("%s.liquidation_strategy.disposal_time_step", parent), ErrMustBeAtMost3600) } + slippage, err := num.DecimalFromString(params.DisposalSlippageRange) + if err != nil || slippage.IsNegative() || slippage.IsZero() { + errs.AddForProperty(fmt.Sprintf("%s.liquidation_strategy.disposal_slippage_range", parent), ErrMustBePositive) + } return errs } @@ -1147,6 +1204,21 @@ func checkNewInstrument(instrument *protoTypes.InstrumentConfiguration, parent s return errs } +func checkUpdateSpotInstrument(instrument *protoTypes.UpdateSpotInstrumentConfiguration) Errors { + errs := NewErrors() + if instrument == nil { + return errs.FinalAddForProperty("update_spot_market.changes.instrument", ErrIsRequired) + } + if len(instrument.Code) == 0 { + errs.AddForProperty("update_spot_market.changes.instrument.code", ErrIsRequired) + } + + if len(instrument.Name) == 0 { + errs.AddForProperty("update_spot_market.changes.instrument.name", ErrIsRequired) + } + return errs +} + func checkUpdateInstrument(instrument *protoTypes.UpdateInstrumentConfiguration) Errors { errs := NewErrors() @@ -1327,9 +1399,7 @@ func checkNewSpot(spot *protoTypes.SpotProduct) Errors { if spot.BaseAsset == spot.QuoteAsset { errs.AddForProperty("new_spot_market.changes.instrument.product.spot.quote_asset", ErrIsNotValid) } - if len(spot.Name) == 0 { - errs.AddForProperty("new_spot_market.changes.instrument.product.spot.name", ErrIsRequired) - } + return errs } diff --git a/commands/proposal_submission_new_asset_test.go b/commands/proposal_submission_new_asset_test.go index 43102ab502..7b31e94266 100644 --- a/commands/proposal_submission_new_asset_test.go +++ b/commands/proposal_submission_new_asset_test.go @@ -42,6 +42,7 @@ func TestCheckProposalSubmissionForNewAsset(t *testing.T) { t.Run("Submitting an built-in asset change with max faucet amount succeeds", testNewBuiltInAssetChangeSubmissionWithMaxFaucetAmountMintSucceeds) t.Run("Submitting an built-in asset change with not-a-number max faucet amount fails", testNewBuiltInAssetChangeSubmissionWithNaNMaxFaucetAmountMintFails) t.Run("Submitting an ERC20 asset change without ERC20 asset fails", testNewERC20AssetChangeSubmissionWithoutErc20AssetFails) + t.Run("Submitting an ERC20 asset change without chain id fails", testNewERC20AssetChangeSubmissionWithoutChainIDFails) t.Run("Submitting an ERC20 asset change without contract address fails", testNewERC20AssetChangeSubmissionWithoutContractAddressFails) t.Run("Submitting an ERC20 asset change with contract address succeeds", testNewERC20AssetChangeSubmissionWithContractAddressSucceeds) t.Run("Submitting an ERC20 asset change with invalid lifetime limit fails", testNewERC20AssetChangeSubmissionWithInvalidLifetimeLimitFails) @@ -358,6 +359,26 @@ func testNewERC20AssetChangeSubmissionWithoutErc20AssetFails(t *testing.T) { assert.Contains(t, err.Get("proposal_submission.terms.change.new_asset.changes.source.erc20"), commands.ErrIsRequired) } +func testNewERC20AssetChangeSubmissionWithoutChainIDFails(t *testing.T) { + err := checkProposalSubmission(&commandspb.ProposalSubmission{ + Terms: &types.ProposalTerms{ + Change: &types.ProposalTerms_NewAsset{ + NewAsset: &types.NewAsset{ + Changes: &types.AssetDetails{ + Source: &types.AssetDetails_Erc20{ + Erc20: &types.ERC20{ + ChainId: "", + }, + }, + }, + }, + }, + }, + }) + + assert.Contains(t, err.Get("proposal_submission.terms.change.new_asset.changes.source.erc20.chain_id"), commands.ErrIsRequired) +} + func testNewERC20AssetChangeSubmissionWithoutContractAddressFails(t *testing.T) { err := checkProposalSubmission(&commandspb.ProposalSubmission{ Terms: &types.ProposalTerms{ diff --git a/commands/proposal_submission_new_market_test.go b/commands/proposal_submission_new_market_test.go index 689f21a16e..461e5e9a10 100644 --- a/commands/proposal_submission_new_market_test.go +++ b/commands/proposal_submission_new_market_test.go @@ -186,6 +186,7 @@ func TestCheckProposalSubmissionForNewMarket(t *testing.T) { t.Run("Submitting a new market with invalid hysteresis epochs fails", testNewMarketChangeSubmissionWithInvalidPerformanceHysteresisEpochsFails) t.Run("Submitting a new market with valid hysteresis epochs succeeds", testNewMarketChangeSubmissionWithValidPerformanceHysteresisEpochsSucceeds) t.Run("Submitting a new market with invalid liquidity fee settings", testLiquidityFeeSettings) + 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) } @@ -5998,6 +5999,97 @@ func testLiquidityFeeSettings(t *testing.T) { } } +func testLiquidityFeeSettingsSpot(t *testing.T) { + cases := []struct { + lfs *vega.LiquidityFeeSettings + field string + err error + }{ + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_METHOD_MARGINAL_COST, + FeeConstant: ptr.From("0.1"), + }, + field: "method", + err: commands.ErrIsNotValid, + }, + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_METHOD_WEIGHTED_AVERAGE, + FeeConstant: ptr.From("0.1"), + }, + field: "method", + err: commands.ErrIsNotValid, + }, + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_METHOD_CONSTANT, + FeeConstant: nil, + }, + field: "fee_constant", + err: commands.ErrIsRequired, + }, + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_METHOD_CONSTANT, + FeeConstant: ptr.From("hello"), + }, + field: "fee_constant", + err: commands.ErrIsNotValidNumber, + }, + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_METHOD_CONSTANT, + FeeConstant: ptr.From("-0.1"), // (0042-LIQF-072) + }, + field: "fee_constant", + err: commands.ErrMustBePositiveOrZero, + }, + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_METHOD_CONSTANT, + FeeConstant: ptr.From("1.1"), // (0042-LIQF-072) + }, + field: "fee_constant", + err: commands.ErrMustBeWithinRange01, + }, + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_METHOD_UNSPECIFIED, + }, + field: "method", + err: commands.ErrIsRequired, + }, + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_Method(int32(100)), + }, + field: "method", + err: commands.ErrIsNotValid, + }, + } + + for _, c := range cases { + err := checkProposalSubmission(&commandspb.ProposalSubmission{ + Terms: &vegapb.ProposalTerms{ + Change: &vegapb.ProposalTerms_NewSpotMarket{ + NewSpotMarket: &vegapb.NewSpotMarket{ + Changes: &vegapb.NewSpotMarketConfiguration{ + Instrument: &vegapb.InstrumentConfiguration{ + Product: &vegapb.InstrumentConfiguration_Spot{ + Spot: &vegapb.SpotProduct{}, + }, + }, + LiquidityFeeSettings: c.lfs, + }, + }, + }, + }, + }) + assert.Contains(t, err.Get("proposal_submission.terms.change.new_spot_market.changes.liquidity_fee_settings."+c.field), c.err) + } +} + func testFutureMarketSubmissionWithValidLiquidationStrategySucceeds(t *testing.T) { pubKey := []*dstypes.Signer{ dstypes.CreateSignerFromString("bd069246503a57271375f1995c46e03db88c4e1a564077b33a9872f905650dc4", dstypes.SignerTypePubKey), @@ -6060,10 +6152,11 @@ func testFutureMarketSubmissionWithValidLiquidationStrategySucceeds(t *testing.T }, }, LiquidationStrategy: &vegapb.LiquidationStrategy{ - DisposalTimeStep: 20, - DisposalFraction: "0.05", - FullDisposalSize: 20, - MaxFractionConsumed: "0.01", + DisposalTimeStep: 20, + DisposalFraction: "0.05", + FullDisposalSize: 20, + MaxFractionConsumed: "0.01", + DisposalSlippageRange: "0.1", }, }, }, @@ -6074,6 +6167,7 @@ func testFutureMarketSubmissionWithValidLiquidationStrategySucceeds(t *testing.T assert.Empty(t, err.Get("proposal_submission.terms.change.new_market.changes.liquidation_strategy.disposal_fraction")) assert.Empty(t, err.Get("proposal_submission.terms.change.new_market.changes.liquidation_strategy.max_fraction_consumed")) assert.Empty(t, err.Get("proposal_submission.terms.change.new_market.changes.liquidation_strategy.disposal_time_step")) + assert.Empty(t, err.Get("proposal_submission.terms.change.new_market.changes.liquidation_strategy.disposal_slippage_range")) } type compositePriceConfigCase struct { @@ -6495,10 +6589,11 @@ func testFutureMarketSubmissionWithInvalidLiquidationStrategyFails(t *testing.T) }, }, LiquidationStrategy: &vegapb.LiquidationStrategy{ - DisposalTimeStep: 20, - DisposalFraction: "0.05", - FullDisposalSize: 20, - MaxFractionConsumed: "0.01", + DisposalTimeStep: 20, + DisposalFraction: "0.05", + FullDisposalSize: 20, + MaxFractionConsumed: "0.01", + DisposalSlippageRange: "0.1", }, }, }, @@ -6512,28 +6607,41 @@ func testFutureMarketSubmissionWithInvalidLiquidationStrategyFails(t *testing.T) }{ "proposal_submission.terms.change.new_market.changes.liquidation_strategy.disposal_fraction": { ls: &vegapb.LiquidationStrategy{ - DisposalTimeStep: 20, - DisposalFraction: "123", - FullDisposalSize: 20, - MaxFractionConsumed: "0.01", + DisposalTimeStep: 20, + DisposalFraction: "123", + FullDisposalSize: 20, + MaxFractionConsumed: "0.01", + DisposalSlippageRange: "0.1", }, err: commands.ErrMustBeBetween01, }, "proposal_submission.terms.change.new_market.changes.liquidation_strategy.max_fraction_consumed": { ls: &vegapb.LiquidationStrategy{ - DisposalTimeStep: 20, - DisposalFraction: "0.1", - FullDisposalSize: 20, - MaxFractionConsumed: "-0.1", + DisposalTimeStep: 20, + DisposalFraction: "0.1", + FullDisposalSize: 20, + MaxFractionConsumed: "-0.1", + DisposalSlippageRange: "100", // large values are fine }, err: commands.ErrMustBeBetween01, }, "proposal_submission.terms.change.new_market.changes.liquidation_strategy.disposal_time_step": { ls: &vegapb.LiquidationStrategy{ - DisposalTimeStep: 0, - DisposalFraction: "0.1", - FullDisposalSize: 20, - MaxFractionConsumed: "0.1", + DisposalTimeStep: 0, + DisposalFraction: "0.1", + FullDisposalSize: 20, + MaxFractionConsumed: "0.1", + DisposalSlippageRange: "0.5", + }, + err: commands.ErrMustBePositive, + }, + "proposal_submission.terms.change.new_market.changes.liquidation_strategy.disposal_slippage_range": { + ls: &vegapb.LiquidationStrategy{ + DisposalTimeStep: 5, + DisposalFraction: "0.1", + FullDisposalSize: 20, + MaxFractionConsumed: "0.1", + DisposalSlippageRange: "-0.5", }, err: commands.ErrMustBePositive, }, @@ -6542,6 +6650,7 @@ func testFutureMarketSubmissionWithInvalidLiquidationStrategyFails(t *testing.T) "proposal_submission.terms.change.new_market.changes.liquidation_strategy.disposal_fraction", "proposal_submission.terms.change.new_market.changes.liquidation_strategy.max_fraction_consumed", "proposal_submission.terms.change.new_market.changes.liquidation_strategy.disposal_time_step", + "proposal_submission.terms.change.new_market.changes.liquidation_strategy.disposal_slippage_range", } for ec, exp := range data { nm := submission.Terms.GetNewMarket() @@ -6567,31 +6676,44 @@ func testFutureMarketSubmissionWithInvalidLiquidationStrategyFails(t *testing.T) }{ "proposal_submission.terms.change.new_market.changes.liquidation_strategy.disposal_fraction": { ls: &vegapb.LiquidationStrategy{ - DisposalTimeStep: 20, - DisposalFraction: "-2", - FullDisposalSize: 20, - MaxFractionConsumed: "0.01", + DisposalTimeStep: 20, + DisposalFraction: "-2", + FullDisposalSize: 20, + MaxFractionConsumed: "0.01", + DisposalSlippageRange: "0.5", }, err: commands.ErrMustBeBetween01, }, "proposal_submission.terms.change.new_market.changes.liquidation_strategy.max_fraction_consumed": { ls: &vegapb.LiquidationStrategy{ - DisposalTimeStep: 20, - DisposalFraction: "0.1", - FullDisposalSize: 20, - MaxFractionConsumed: "2", + DisposalTimeStep: 20, + DisposalFraction: "0.1", + FullDisposalSize: 20, + MaxFractionConsumed: "2", + DisposalSlippageRange: "0.5", }, err: commands.ErrMustBeBetween01, }, "proposal_submission.terms.change.new_market.changes.liquidation_strategy.disposal_time_step": { ls: &vegapb.LiquidationStrategy{ - DisposalTimeStep: 3601, - DisposalFraction: "0.1", - FullDisposalSize: 20, - MaxFractionConsumed: "0.1", + DisposalTimeStep: 3601, + DisposalFraction: "0.1", + FullDisposalSize: 20, + MaxFractionConsumed: "0.1", + DisposalSlippageRange: "0.5", }, err: commands.ErrMustBeAtMost3600, }, + "proposal_submission.terms.change.new_market.changes.liquidation_strategy.disposal_slippage_range": { + ls: &vegapb.LiquidationStrategy{ + DisposalTimeStep: 5, + DisposalFraction: "0.1", + FullDisposalSize: 20, + MaxFractionConsumed: "0.1", + DisposalSlippageRange: "0", // zero or missing values fail, too + }, + err: commands.ErrMustBePositive, + }, } for ec, exp := range data { nm := submission.Terms.GetNewMarket() diff --git a/commands/proposal_submission_new_spot_market_test.go b/commands/proposal_submission_new_spot_market_test.go index 2a3d5f8480..8d8229199c 100644 --- a/commands/proposal_submission_new_spot_market_test.go +++ b/commands/proposal_submission_new_spot_market_test.go @@ -86,8 +86,6 @@ func TestCheckProposalSubmissionForNewSpotMarket(t *testing.T) { t.Run("Submitting a new spot market with spot product definition succeeds", testNewSpotMarketMarketChangeSubmissionWithSpotSucceeds) t.Run("Submitting a new spot market without base or quote asset fails", testNewSpotMarketMarketChangeSubmissionWithoutEitherAssetFails) t.Run("Submitting a new spot market with base and quote asset succeeds", testNewSpotMarketMarketChangeSubmissionWithBaseAndQuoteAssetsSucceeds) - t.Run("Submitting a new spot market without a name fails ", testNewSpotMarketMarketChangeSubmissionWithoutNameFails) - t.Run("Submitting a new spot market with a name succeeds", testNewSpotMarketMarketChangeSubmissionWithQuoteNameSucceeds) t.Run("Submitting a new spot market with price monitoring without triggers succeeds", testSpotPriceMonitoringChangeSubmissionWithoutTriggersSucceeds) t.Run("Submitting a new spot market with price monitoring with triggers succeeds", testSpotPriceMonitoringChangeSubmissionWithTriggersSucceeds) t.Run("Submitting a new spot market with price monitoring with probability succeeds", testSpotMarketPriceMonitoringChangeSubmissionWithRightTriggerProbabilitySucceeds) @@ -172,7 +170,7 @@ func testNewSpotMarketChangeSubmissionWithDecimalPlacesEqualTo0Succeeds(t *testi Change: &protoTypes.ProposalTerms_NewSpotMarket{ NewSpotMarket: &protoTypes.NewSpotMarket{ Changes: &protoTypes.NewSpotMarketConfiguration{ - DecimalPlaces: 0, + PriceDecimalPlaces: 0, }, }, }, @@ -205,7 +203,7 @@ func testNewSpotMarketChangeSubmissionWithDecimalPlacesAboveOrEqualTo150Fails(t Instrument: &protoTypes.InstrumentConfiguration{ Product: &protoTypes.InstrumentConfiguration_Spot{}, }, - DecimalPlaces: tc.value, + PriceDecimalPlaces: tc.value, }, }, }, @@ -223,7 +221,7 @@ func testNewSpotMarketChangeSubmissionWithDecimalPlacesBelow150Succeeds(t *testi Change: &protoTypes.ProposalTerms_NewSpotMarket{ NewSpotMarket: &protoTypes.NewSpotMarket{ Changes: &protoTypes.NewSpotMarketConfiguration{ - DecimalPlaces: test.RandomPositiveU64Before(150), + PriceDecimalPlaces: test.RandomPositiveU64Before(150), }, }, }, @@ -240,7 +238,7 @@ func testNewSpotMarketChangeSubmissionWithPositionDecimalPlacesEqualTo0Succeeds( Change: &protoTypes.ProposalTerms_NewSpotMarket{ NewSpotMarket: &protoTypes.NewSpotMarket{ Changes: &protoTypes.NewSpotMarketConfiguration{ - PositionDecimalPlaces: 0, + SizeDecimalPlaces: 0, }, }, }, @@ -282,7 +280,7 @@ func testNewSpotMarketChangeSubmissionWithPositionDecimalPlacesAboveOrEqualTo7Fa Instrument: &protoTypes.InstrumentConfiguration{ Product: &protoTypes.InstrumentConfiguration_Spot{}, }, - PositionDecimalPlaces: tc.value, + SizeDecimalPlaces: tc.value, }, }, }, @@ -300,7 +298,7 @@ func testNewSpotMarketChangeSubmissionWithPositionDecimalPlacesBelow7Succeeds(t Change: &protoTypes.ProposalTerms_NewSpotMarket{ NewSpotMarket: &protoTypes.NewSpotMarket{ Changes: &protoTypes.NewSpotMarketConfiguration{ - PositionDecimalPlaces: test.RandomPositiveI64Before(7), + SizeDecimalPlaces: test.RandomPositiveI64Before(7), }, }, }, @@ -1022,50 +1020,6 @@ func testNewSpotMarketMarketChangeSubmissionWithBaseAndQuoteAssetsSucceeds(t *te assert.NotContains(t, err.Get("proposal_submission.terms.change.new_spot_market.changes.instrument.product.spot.quote_asset"), commands.ErrIsRequired) } -func testNewSpotMarketMarketChangeSubmissionWithoutNameFails(t *testing.T) { - err := checkProposalSubmission(&commandspb.ProposalSubmission{ - Terms: &protoTypes.ProposalTerms{ - Change: &protoTypes.ProposalTerms_NewSpotMarket{ - NewSpotMarket: &protoTypes.NewSpotMarket{ - Changes: &protoTypes.NewSpotMarketConfiguration{ - Instrument: &protoTypes.InstrumentConfiguration{ - Product: &protoTypes.InstrumentConfiguration_Spot{ - Spot: &protoTypes.SpotProduct{ - Name: "", - }, - }, - }, - }, - }, - }, - }, - }) - - assert.Contains(t, err.Get("proposal_submission.terms.change.new_spot_market.changes.instrument.product.spot.name"), commands.ErrIsRequired) -} - -func testNewSpotMarketMarketChangeSubmissionWithQuoteNameSucceeds(t *testing.T) { - err := checkProposalSubmission(&commandspb.ProposalSubmission{ - Terms: &protoTypes.ProposalTerms{ - Change: &protoTypes.ProposalTerms_NewSpotMarket{ - NewSpotMarket: &protoTypes.NewSpotMarket{ - Changes: &protoTypes.NewSpotMarketConfiguration{ - Instrument: &protoTypes.InstrumentConfiguration{ - Product: &protoTypes.InstrumentConfiguration_Spot{ - Spot: &protoTypes.SpotProduct{ - Name: "BTC/USDT", - }, - }, - }, - }, - }, - }, - }, - }) - - assert.NotContains(t, err.Get("proposal_submission.terms.change.new_spot_market.changes.instrument.product.spot.quote_name"), commands.ErrIsRequired) -} - func testNewSpotSimpleRiskParametersChangeSubmissionWithoutSimpleRiskParametersFails(t *testing.T) { err := checkProposalSubmission(&commandspb.ProposalSubmission{ Terms: &protoTypes.ProposalTerms{ diff --git a/commands/proposal_submission_new_transfer_test.go b/commands/proposal_submission_new_transfer_test.go index ab2de826d9..941e001c14 100644 --- a/commands/proposal_submission_new_transfer_test.go +++ b/commands/proposal_submission_new_transfer_test.go @@ -65,6 +65,7 @@ func testInvalidDestForMetric(t *testing.T) { types.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, types.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, types.DispatchMetric_DISPATCH_METRIC_VALIDATOR_RANKING, + types.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, }, types.AccountType_ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES: { types.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED, @@ -74,6 +75,7 @@ func testInvalidDestForMetric(t *testing.T) { types.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, types.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, types.DispatchMetric_DISPATCH_METRIC_VALIDATOR_RANKING, + types.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, }, types.AccountType_ACCOUNT_TYPE_REWARD_MAKER_RECEIVED_FEES: { types.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED, @@ -83,6 +85,7 @@ func testInvalidDestForMetric(t *testing.T) { types.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, types.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, types.DispatchMetric_DISPATCH_METRIC_VALIDATOR_RANKING, + types.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, }, types.AccountType_ACCOUNT_TYPE_REWARD_MARKET_PROPOSERS: { types.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED, @@ -92,6 +95,7 @@ func testInvalidDestForMetric(t *testing.T) { types.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, types.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, types.DispatchMetric_DISPATCH_METRIC_VALIDATOR_RANKING, + types.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, }, types.AccountType_ACCOUNT_TYPE_REWARD_AVERAGE_POSITION: { types.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED, @@ -101,6 +105,7 @@ func testInvalidDestForMetric(t *testing.T) { types.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, types.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, types.DispatchMetric_DISPATCH_METRIC_VALIDATOR_RANKING, + types.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, }, types.AccountType_ACCOUNT_TYPE_REWARD_RELATIVE_RETURN: { types.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED, @@ -110,6 +115,7 @@ func testInvalidDestForMetric(t *testing.T) { types.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, types.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, types.DispatchMetric_DISPATCH_METRIC_VALIDATOR_RANKING, + types.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, }, types.AccountType_ACCOUNT_TYPE_REWARD_RETURN_VOLATILITY: { types.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED, @@ -119,6 +125,7 @@ func testInvalidDestForMetric(t *testing.T) { types.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, types.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, types.DispatchMetric_DISPATCH_METRIC_VALIDATOR_RANKING, + types.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, }, types.AccountType_ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING: { types.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED, @@ -128,6 +135,17 @@ func testInvalidDestForMetric(t *testing.T) { types.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, types.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, types.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, + types.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, + }, + types.AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN: { + types.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED, + types.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_PAID, + types.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_RECEIVED, + types.DispatchMetric_DISPATCH_METRIC_MARKET_VALUE, + types.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, + types.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, + types.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, + types.DispatchMetric_DISPATCH_METRIC_VALIDATOR_RANKING, }, } @@ -171,6 +189,7 @@ func testInvalidAssetForMetric(t *testing.T) { types.AccountType_ACCOUNT_TYPE_REWARD_AVERAGE_POSITION, types.AccountType_ACCOUNT_TYPE_REWARD_RELATIVE_RETURN, types.AccountType_ACCOUNT_TYPE_REWARD_RETURN_VOLATILITY, + types.AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN, } for _, inv := range invalidTypes { @@ -242,6 +261,7 @@ func testRecurringWithDispatchInvalidTypes(t *testing.T) { delete(invalidTypes, types.AccountType_ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING) delete(invalidTypes, types.AccountType_ACCOUNT_TYPE_REWARD_RETURN_VOLATILITY) delete(invalidTypes, types.AccountType_ACCOUNT_TYPE_REWARD_RELATIVE_RETURN) + delete(invalidTypes, types.AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN) delete(invalidTypes, types.AccountType_ACCOUNT_TYPE_REWARD_AVERAGE_POSITION) delete(invalidTypes, types.AccountType_ACCOUNT_TYPE_INSURANCE) delete(invalidTypes, types.AccountType_ACCOUNT_TYPE_GENERAL) @@ -580,7 +600,7 @@ func testNewTransferChangeSubmissionInvalidDestinationTypeFails(t *testing.T) { delete(allAccountTypes, int32(types.AccountType_ACCOUNT_TYPE_REWARD_RELATIVE_RETURN)) delete(allAccountTypes, int32(types.AccountType_ACCOUNT_TYPE_REWARD_RETURN_VOLATILITY)) delete(allAccountTypes, int32(types.AccountType_ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING)) - + delete(allAccountTypes, int32(types.AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN)) delete(allAccountTypes, int32(types.AccountType_ACCOUNT_TYPE_UNSPECIFIED)) for at := range allAccountTypes { diff --git a/commands/proposal_submission_update_market_test.go b/commands/proposal_submission_update_market_test.go index bc04495c54..2539561c0a 100644 --- a/commands/proposal_submission_update_market_test.go +++ b/commands/proposal_submission_update_market_test.go @@ -26,6 +26,7 @@ import ( dstypes "code.vegaprotocol.io/vega/core/datasource/common" "code.vegaprotocol.io/vega/libs/ptr" "code.vegaprotocol.io/vega/libs/test" + "code.vegaprotocol.io/vega/protos/vega" protoTypes "code.vegaprotocol.io/vega/protos/vega" vegapb "code.vegaprotocol.io/vega/protos/vega" commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" @@ -137,6 +138,7 @@ func TestCheckProposalSubmissionForUpdateMarket(t *testing.T) { t.Run("Submitting a market update with invalid mark price configuration ", testUpdateMarketCompositePriceConfiguration) 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) } func testUpdateMarketTickSize(t *testing.T) { @@ -3829,3 +3831,90 @@ func testUpdatePerpsMarketChangeSubmissionProductParameters(t *testing.T) { }) } } + +func testUpdateLiquidityFeeSettingsSpot(t *testing.T) { + cases := []struct { + lfs *vega.LiquidityFeeSettings + field string + err error + }{ + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_METHOD_MARGINAL_COST, + FeeConstant: ptr.From("0.1"), + }, + field: "method", + err: commands.ErrIsNotValid, + }, + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_METHOD_WEIGHTED_AVERAGE, + FeeConstant: ptr.From("0.1"), + }, + field: "method", + err: commands.ErrIsNotValid, + }, + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_METHOD_CONSTANT, + FeeConstant: nil, + }, + field: "fee_constant", + err: commands.ErrIsRequired, + }, + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_METHOD_CONSTANT, + FeeConstant: ptr.From("hello"), + }, + field: "fee_constant", + err: commands.ErrIsNotValidNumber, + }, + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_METHOD_CONSTANT, + FeeConstant: ptr.From("-0.1"), // (0042-LIQF-072) + }, + field: "fee_constant", + err: commands.ErrMustBePositiveOrZero, + }, + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_METHOD_CONSTANT, + FeeConstant: ptr.From("1.1"), // (0042-LIQF-072) + }, + field: "fee_constant", + err: commands.ErrMustBeWithinRange01, + }, + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_METHOD_UNSPECIFIED, + }, + field: "method", + err: commands.ErrIsRequired, + }, + { + lfs: &vega.LiquidityFeeSettings{ + Method: vegapb.LiquidityFeeSettings_Method(int32(100)), + }, + field: "method", + err: commands.ErrIsNotValid, + }, + } + + for _, c := range cases { + err := checkProposalSubmission(&commandspb.ProposalSubmission{ + Terms: &vegapb.ProposalTerms{ + Change: &vegapb.ProposalTerms_UpdateSpotMarket{ + UpdateSpotMarket: &vegapb.UpdateSpotMarket{ + Changes: &vegapb.UpdateSpotMarketConfiguration{ + Instrument: &vegapb.UpdateSpotInstrumentConfiguration{}, + LiquidityFeeSettings: c.lfs, + }, + }, + }, + }, + }) + assert.Contains(t, err.Get("proposal_submission.terms.change.update_spot_market.changes.liquidity_fee_settings."+c.field), c.err) + } +} diff --git a/commands/proposal_submission_update_spot_market_test.go b/commands/proposal_submission_update_spot_market_test.go index 9a57892174..d8bf1e2c5b 100644 --- a/commands/proposal_submission_update_spot_market_test.go +++ b/commands/proposal_submission_update_spot_market_test.go @@ -78,6 +78,7 @@ func TestCheckProposalSubmissionForUpdateSpotMarket(t *testing.T) { t.Run("Submitting a spot market update with invalid hysteresis epochs fails", testUpdateSpotMarketChangeSubmissionWithInvalidPerformanceHysteresisEpochsFails) t.Run("Submitting a spot market update with valid hysteresis epochs succeeds", testUpdateSpotMarketChangeSubmissionWithValidPerformanceHysteresisEpochsSucceeds) t.Run("Submitting a spot market update with invalid tick size fails and valid tick size succeeds", testUpdateSpotMarketTickSize) + t.Run("Submitting a spot market update without instrument name or code fails", testUpdateSpotMarketChangeSubmissionWithoutInstrumentNameFails) } func testUpdateSpotMarketTickSize(t *testing.T) { @@ -1241,3 +1242,30 @@ func testUpdateSpotMarketChangeSubmissionWithValidPerformanceHysteresisEpochsSuc }) assert.NotContains(t, err.Get("proposal_submission.terms.change.update_spot_market.changes.sla_params.performance_hysteresis_epochs"), commands.ErrMustBePositive) } + +func testUpdateSpotMarketChangeSubmissionWithoutInstrumentNameFails(t *testing.T) { + err := checkProposalSubmission(&commandspb.ProposalSubmission{ + Terms: &protoTypes.ProposalTerms{ + Change: &protoTypes.ProposalTerms_UpdateSpotMarket{ + UpdateSpotMarket: &protoTypes.UpdateSpotMarket{ + Changes: &protoTypes.UpdateSpotMarketConfiguration{}, + }, + }, + }, + }) + assert.NotContains(t, err.Get("proposal_submission.terms.change.update_spot_market.changes.instrument"), commands.ErrIsRequired) + + err = checkProposalSubmission(&commandspb.ProposalSubmission{ + Terms: &protoTypes.ProposalTerms{ + Change: &protoTypes.ProposalTerms_UpdateSpotMarket{ + UpdateSpotMarket: &protoTypes.UpdateSpotMarket{ + Changes: &protoTypes.UpdateSpotMarketConfiguration{ + Instrument: &protoTypes.UpdateSpotInstrumentConfiguration{}, + }, + }, + }, + }, + }) + assert.NotContains(t, err.Get("proposal_submission.terms.change.update_spot_market.changes.instrument.code"), commands.ErrIsRequired) + assert.NotContains(t, err.Get("proposal_submission.terms.change.update_spot_market.changes.instrument.name"), commands.ErrIsRequired) +} diff --git a/commands/stop_order_submission_test.go b/commands/stop_order_submission_test.go index 0d09444650..3ec15e4792 100644 --- a/commands/stop_order_submission_test.go +++ b/commands/stop_order_submission_test.go @@ -203,25 +203,6 @@ func TestCheckStopOrdersStubmission(t *testing.T) { }, errStr: "order_submission (is required)", }, - { - submission: commandspb.StopOrdersSubmission{ - RisesAbove: &commandspb.StopOrderSetup{ - OrderSubmission: &commandspb.OrderSubmission{ - MarketId: "f9982447fb4128f9968f9981612c5ea85d19b62058ec2636efc812dcbbc745ca", - Side: vega.Side_SIDE_BUY, - Size: 100, - TimeInForce: vega.Order_TIME_IN_FORCE_IOC, - Type: vega.Order_TYPE_MARKET, - }, - ExpiresAt: ptr.From(int64(1000)), - ExpiryStrategy: ptr.From(vega.StopOrder_EXPIRY_STRATEGY_CANCELS), - Trigger: &commandspb.StopOrderSetup_TrailingPercentOffset{ - TrailingPercentOffset: "0.1", - }, - }, - }, - errStr: "stop_orders_submission.rises_below.order_submission.reduce_only (must be reduce only)", - }, { submission: commandspb.StopOrdersSubmission{ RisesAbove: &commandspb.StopOrderSetup{ @@ -453,6 +434,46 @@ func TestCheckStopOrdersStubmission(t *testing.T) { }, errStr: "stop_orders_submission.falls_below.size_override_value (must be between 0 (excluded) and 1 (included))", }, + { + submission: commandspb.StopOrdersSubmission{ + RisesAbove: &commandspb.StopOrderSetup{ + OrderSubmission: &commandspb.OrderSubmission{ + MarketId: "f9982447fb4128f9968f9981612c5ea85d19b62058ec2636efc812dcbbc745ca", + Side: vega.Side_SIDE_BUY, + Size: 100, + TimeInForce: vega.Order_TIME_IN_FORCE_GFA, + Type: vega.Order_TYPE_MARKET, + ReduceOnly: true, + }, + ExpiresAt: ptr.From(int64(1000)), + ExpiryStrategy: ptr.From(vega.StopOrder_EXPIRY_STRATEGY_CANCELS), + Trigger: &commandspb.StopOrderSetup_TrailingPercentOffset{ + TrailingPercentOffset: "0.1", + }, + }, + }, + errStr: commands.ErrIsNotValid.Error(), + }, + { + submission: commandspb.StopOrdersSubmission{ + FallsBelow: &commandspb.StopOrderSetup{ + OrderSubmission: &commandspb.OrderSubmission{ + MarketId: "f9982447fb4128f9968f9981612c5ea85d19b62058ec2636efc812dcbbc745ca", + Side: vega.Side_SIDE_BUY, + Size: 100, + TimeInForce: vega.Order_TIME_IN_FORCE_GFA, + Type: vega.Order_TYPE_MARKET, + ReduceOnly: true, + }, + ExpiresAt: ptr.From(int64(1000)), + ExpiryStrategy: ptr.From(vega.StopOrder_EXPIRY_STRATEGY_CANCELS), + Trigger: &commandspb.StopOrderSetup_TrailingPercentOffset{ + TrailingPercentOffset: "0.1", + }, + }, + }, + errStr: commands.ErrIsNotValid.Error(), + }, } for n, c := range cases { diff --git a/commands/stop_orders_submission.go b/commands/stop_orders_submission.go index da7661eac0..2591292aed 100644 --- a/commands/stop_orders_submission.go +++ b/commands/stop_orders_submission.go @@ -107,10 +107,10 @@ func checkStopOrderSetup( ) { if err := checkOrderSubmission(setup.OrderSubmission); !err.Empty() { errs.Merge(err) - } else { - if !setup.OrderSubmission.ReduceOnly { - errs.AddForProperty(fmt.Sprintf("%s.order_submission.reduce_only", fieldName), ErrMustBeReduceOnly) - } + } + + if setup.OrderSubmission != nil && setup.OrderSubmission.TimeInForce == types.Order_TIME_IN_FORCE_GFA { + errs.AddForProperty(fmt.Sprintf("%s.order_submission.time_in_force", fieldName), ErrIsNotValid) } if setup.ExpiresAt != nil { diff --git a/commands/transfer_funds.go b/commands/transfer_funds.go index 8dbd2d255c..ee17c2e685 100644 --- a/commands/transfer_funds.go +++ b/commands/transfer_funds.go @@ -108,6 +108,7 @@ func checkTransfer(cmd *commandspb.Transfer) (e Errors) { cmd.ToAccountType == vega.AccountType_ACCOUNT_TYPE_REWARD_AVERAGE_POSITION || cmd.ToAccountType == vega.AccountType_ACCOUNT_TYPE_REWARD_RELATIVE_RETURN || cmd.ToAccountType == vega.AccountType_ACCOUNT_TYPE_REWARD_RETURN_VOLATILITY || + cmd.ToAccountType == vega.AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN || cmd.ToAccountType == vega.AccountType_ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING { errs.AddForProperty("transfer.account.to", errors.New("transfers to metric-based reward accounts must be recurring transfers that specify a distribution metric")) } @@ -137,6 +138,7 @@ func checkTransfer(cmd *commandspb.Transfer) (e Errors) { cmd.ToAccountType == vega.AccountType_ACCOUNT_TYPE_REWARD_MARKET_PROPOSERS || cmd.ToAccountType == vega.AccountType_ACCOUNT_TYPE_REWARD_AVERAGE_POSITION || cmd.ToAccountType == vega.AccountType_ACCOUNT_TYPE_REWARD_RELATIVE_RETURN || + cmd.ToAccountType == vega.AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN || cmd.ToAccountType == vega.AccountType_ACCOUNT_TYPE_REWARD_RETURN_VOLATILITY || cmd.ToAccountType == vega.AccountType_ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING { if k.Recurring.DispatchStrategy == nil { @@ -168,6 +170,7 @@ func validateDispatchStrategy(toAccountType vega.AccountType, dispatchStrategy * toAccountType != vega.AccountType_ACCOUNT_TYPE_REWARD_MARKET_PROPOSERS && toAccountType != vega.AccountType_ACCOUNT_TYPE_REWARD_AVERAGE_POSITION && toAccountType != vega.AccountType_ACCOUNT_TYPE_REWARD_RELATIVE_RETURN && + toAccountType != vega.AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN && toAccountType != vega.AccountType_ACCOUNT_TYPE_REWARD_RETURN_VOLATILITY && toAccountType != vega.AccountType_ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING { errs.AddForProperty(destinationPrefixErr, ErrIsNotValid) @@ -201,6 +204,9 @@ func validateDispatchStrategy(toAccountType vega.AccountType, dispatchStrategy * if toAccountType == vega.AccountType_ACCOUNT_TYPE_REWARD_RELATIVE_RETURN && dispatchStrategy.Metric != vega.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN { errs.AddForProperty(prefix+".dispatch_metric", mismatchingAccountTypeError(toAccountType, dispatchStrategy.Metric)) } + if toAccountType == vega.AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN && dispatchStrategy.Metric != vega.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN { + errs.AddForProperty(prefix+".dispatch_metric", mismatchingAccountTypeError(toAccountType, dispatchStrategy.Metric)) + } if toAccountType == vega.AccountType_ACCOUNT_TYPE_REWARD_RETURN_VOLATILITY && dispatchStrategy.Metric != vega.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY { errs.AddForProperty(prefix+".dispatch_metric", mismatchingAccountTypeError(toAccountType, dispatchStrategy.Metric)) } @@ -270,7 +276,7 @@ func validateDispatchStrategy(toAccountType vega.AccountType, dispatchStrategy * errs.AddForProperty(prefix+".window_length", errors.New("should not be set for "+vega.AccountType_ACCOUNT_TYPE_REWARD_MARKET_PROPOSERS.String())) } if dispatchStrategy.WindowLength == 0 && toAccountType != vega.AccountType_ACCOUNT_TYPE_REWARD_MARKET_PROPOSERS { - errs.AddForProperty(prefix+".window_length", errors.New("must bet between 1 and 100")) + errs.AddForProperty(prefix+".window_length", errors.New("must be between 1 and 100")) } if dispatchStrategy.WindowLength > 100 { errs.AddForProperty(prefix+".window_length", ErrMustBeAtMost100) @@ -302,4 +308,8 @@ func validateDispatchStrategy(toAccountType vega.AccountType, dispatchStrategy * } } } + + if dispatchStrategy.TransferInterval != nil && (*dispatchStrategy.TransferInterval <= 0 || *dispatchStrategy.TransferInterval > 100) { + errs.AddForProperty(prefix+".transfer_interval", errors.New("must be between 1 and 100")) + } } diff --git a/commands/transfer_funds_test.go b/commands/transfer_funds_test.go index 4268d41d82..566cdeaa23 100644 --- a/commands/transfer_funds_test.go +++ b/commands/transfer_funds_test.go @@ -43,6 +43,10 @@ func TestTransferFunds(t *testing.T) { capNegative := "-1" capZero := "0" + tooLongTransferInterval := int32(101) + zeroTransferInterval := int32(0) + negativeTransferInterval := int32(-1) + cases := []struct { transfer commandspb.Transfer errString string @@ -1199,7 +1203,7 @@ func TestTransferFunds(t *testing.T) { Amount: "1", Reference: "testing", }, - errString: "transfer.kind.dispatch_strategy.window_length (must bet between 1 and 100)", + errString: "transfer.kind.dispatch_strategy.window_length (must be between 1 and 100)", }, { transfer: commandspb.Transfer{ @@ -1299,6 +1303,84 @@ func TestTransferFunds(t *testing.T) { Reference: "testing", }, }, + { + transfer: commandspb.Transfer{ + FromAccountType: vega.AccountType_ACCOUNT_TYPE_GENERAL, + ToAccountType: vega.AccountType_ACCOUNT_TYPE_REWARD_AVERAGE_POSITION, + Kind: &commandspb.Transfer_Recurring{ + Recurring: &commandspb.RecurringTransfer{ + StartEpoch: 10, + EndEpoch: ptr.From(uint64(11)), + Factor: "1", + DispatchStrategy: &vega.DispatchStrategy{ + AssetForMetric: "", + Metric: vega.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, + EntityScope: vega.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vega.IndividualScope_INDIVIDUAL_SCOPE_IN_TEAM, + WindowLength: 100, + TransferInterval: &tooLongTransferInterval, + }, + }, + }, + To: "84e2b15102a8d6c1c6b4bdf40af8a0dc21b040eaaa1c94cd10d17604b75fdc35", + Asset: "080538b7cc2249de568cb4272a17f4d5e0b0a69a1a240acbf5119d816178daff", + Amount: "1", + Reference: "testing", + }, + errString: "transfer.kind.dispatch_strategy.transfer_interval (must be between 1 and 100)", + }, + { + transfer: commandspb.Transfer{ + FromAccountType: vega.AccountType_ACCOUNT_TYPE_GENERAL, + ToAccountType: vega.AccountType_ACCOUNT_TYPE_REWARD_AVERAGE_POSITION, + Kind: &commandspb.Transfer_Recurring{ + Recurring: &commandspb.RecurringTransfer{ + StartEpoch: 10, + EndEpoch: ptr.From(uint64(11)), + Factor: "1", + DispatchStrategy: &vega.DispatchStrategy{ + AssetForMetric: "", + Metric: vega.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, + EntityScope: vega.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vega.IndividualScope_INDIVIDUAL_SCOPE_IN_TEAM, + WindowLength: 100, + TransferInterval: &zeroTransferInterval, + }, + }, + }, + To: "84e2b15102a8d6c1c6b4bdf40af8a0dc21b040eaaa1c94cd10d17604b75fdc35", + Asset: "080538b7cc2249de568cb4272a17f4d5e0b0a69a1a240acbf5119d816178daff", + Amount: "1", + Reference: "testing", + }, + errString: "transfer.kind.dispatch_strategy.transfer_interval (must be between 1 and 100)", + }, + { + transfer: commandspb.Transfer{ + FromAccountType: vega.AccountType_ACCOUNT_TYPE_GENERAL, + ToAccountType: vega.AccountType_ACCOUNT_TYPE_REWARD_AVERAGE_POSITION, + Kind: &commandspb.Transfer_Recurring{ + Recurring: &commandspb.RecurringTransfer{ + StartEpoch: 10, + EndEpoch: ptr.From(uint64(11)), + Factor: "1", + DispatchStrategy: &vega.DispatchStrategy{ + AssetForMetric: "", + Metric: vega.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, + EntityScope: vega.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vega.IndividualScope_INDIVIDUAL_SCOPE_IN_TEAM, + WindowLength: 100, + TransferInterval: &negativeTransferInterval, + }, + }, + }, + To: "84e2b15102a8d6c1c6b4bdf40af8a0dc21b040eaaa1c94cd10d17604b75fdc35", + Asset: "080538b7cc2249de568cb4272a17f4d5e0b0a69a1a240acbf5119d816178daff", + Amount: "1", + Reference: "testing", + }, + errString: "transfer.kind.dispatch_strategy.transfer_interval (must be between 1 and 100)", + }, } invalidAccountTypesForOneOff := []vega.AccountType{ @@ -1320,6 +1402,7 @@ func TestTransferFunds(t *testing.T) { vega.AccountType_ACCOUNT_TYPE_REWARD_RELATIVE_RETURN, vega.AccountType_ACCOUNT_TYPE_REWARD_RETURN_VOLATILITY, vega.AccountType_ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING, + vega.AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN, } for _, at := range invalidAccountTypesForOneOff { diff --git a/core/api/core.go b/core/api/core.go index c2e9aba9fc..56fc2872b6 100644 --- a/core/api/core.go +++ b/core/api/core.go @@ -103,7 +103,7 @@ func (s *coreService) updateConfig(conf Config) { func (s *coreService) LastBlockHeight( ctx context.Context, - req *protoapi.LastBlockHeightRequest, + _ *protoapi.LastBlockHeightRequest, ) (*protoapi.LastBlockHeightResponse, error) { defer metrics.StartAPIRequestAndTimeGRPC("LastBlockHeight")() diff --git a/core/assets/assets.go b/core/assets/assets.go index a8e09a7f1a..727a6fb31f 100644 --- a/core/assets/assets.go +++ b/core/assets/assets.go @@ -34,12 +34,14 @@ import ( ) var ( - ErrAssetInvalid = errors.New("asset invalid") - ErrAssetDoesNotExist = errors.New("asset does not exist") - ErrUnknownAssetSource = errors.New("unknown asset source") + ErrAssetDoesNotExist = errors.New("asset does not exist") + ErrUnknownAssetSource = errors.New("unknown asset source") + ErrErc20AddressAlreadyInUse = errors.New("erc20 address already in use") + ErrUnknownChainID = errors.New("erc20 chain-id does not correspond to a bridge") ) //go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/core/assets ERC20BridgeView,Notary + type ERC20BridgeView interface { FindAsset(asset *types.AssetDetails) error } @@ -68,30 +70,39 @@ type Service struct { pendingAssetUpdates map[string]*Asset ethWallet nweth.EthereumWallet - ethClient erc20.ETHClient - notary Notary - ass *assetsSnapshotState + + primaryEthChainID string + primaryEthClient erc20.ETHClient + primaryBridgeView ERC20BridgeView + + secondaryEthChainID string + secondaryEthClient erc20.ETHClient + secondaryBridgeView ERC20BridgeView + + notary Notary + ass *assetsSnapshotState ethToVega map[string]string isValidator bool - - bridgeView ERC20BridgeView } func New( + ctx context.Context, log *logging.Logger, cfg Config, nw nweth.EthereumWallet, - ethClient erc20.ETHClient, + primaryEthClient erc20.ETHClient, + secondaryEthClient erc20.ETHClient, broker broker.Interface, - bridgeView ERC20BridgeView, + primaryBridgeView ERC20BridgeView, + secondaryBridgeView ERC20BridgeView, notary Notary, isValidator bool, -) *Service { +) (*Service, error) { log = log.Named(namedLogger) log.SetLevel(cfg.Level.Get()) - return &Service{ + s := &Service{ log: log, cfg: cfg, broker: broker, @@ -99,13 +110,31 @@ func New( pendingAssets: map[string]*Asset{}, pendingAssetUpdates: map[string]*Asset{}, ethWallet: nw, - ethClient: ethClient, + primaryEthClient: primaryEthClient, + secondaryEthClient: secondaryEthClient, notary: notary, ass: &assetsSnapshotState{}, isValidator: isValidator, ethToVega: map[string]string{}, - bridgeView: bridgeView, + primaryBridgeView: primaryBridgeView, + secondaryBridgeView: secondaryBridgeView, + } + + if isValidator { + primaryChainID, err := s.primaryEthClient.ChainID(ctx) + if err != nil { + return nil, fmt.Errorf("could not fetch chain ID from the primary ethereum client: %w", err) + } + s.primaryEthChainID = primaryChainID.String() + + secondaryChainID, err := s.secondaryEthClient.ChainID(ctx) + if err != nil { + return nil, fmt.Errorf("could not fetch chain ID from the secondary ethereum client: %w", err) + } + s.secondaryEthChainID = secondaryChainID.String() } + + return s, nil } // ReloadConf updates the internal configuration. @@ -167,23 +196,39 @@ func (s *Service) EnactPendingAsset(id string) { s.notary.StartAggregate(id, types.NodeSignatureKindAssetNew, signature) } -func (s *Service) ExistsForEthereumAddress(address string) bool { +// ValidateEthereumAddress checks that the given ERC20 address and chainID corresponds to one of Vega's bridges +// and isn't the address of an asset that already exists. +func (s *Service) ValidateEthereumAddress(address, chainID string) error { + if chainID != s.primaryEthChainID && chainID != s.secondaryEthChainID { + return ErrUnknownChainID + } + for _, a := range s.assets { if source, ok := a.ERC20(); ok { + if source.ChainID() != chainID { + // asset is on a different chain, definitely is not a dupe of it + continue + } + if strings.EqualFold(source.Address(), address) { - return true + return ErrErc20AddressAlreadyInUse } } } for _, a := range s.pendingAssets { if source, ok := a.ERC20(); ok { + if source.ChainID() != chainID { + // asset is on a different chain, definitely is not a dupe of it + continue + } + if strings.EqualFold(source.Address(), address) { - return true + return ErrErc20AddressAlreadyInUse } } } - return false + return nil } // SetPendingListing update the state of an asset from proposed @@ -230,7 +275,18 @@ func (s *Service) IsEnabled(assetID string) bool { return ok } -func (s *Service) OnTick(ctx context.Context, _ time.Time) { +// SetBridgeChainID sets the chain-ids for the bridge once we have processed the network parameters +// this is necessary so that non-validator nodes (which cannot just ask the eth-client) can know what they +// are. +func (s *Service) SetBridgeChainID(chainID string, primary bool) { + if primary { + s.primaryEthChainID = chainID + return + } + s.secondaryEthChainID = chainID +} + +func (s *Service) OnTick(_ context.Context, _ time.Time) { s.notary.OfferSignatures(types.NodeSignatureKindAssetNew, s.offerERC20NotarySignatures) } @@ -261,19 +317,23 @@ func (s *Service) assetFromDetails(assetID string, assetDetails *types.AssetDeta builtin.New(assetID, assetDetails), }, nil case *types.AssetDetailsErc20: - // TODO(): fix once the ethereum wallet and client are not required - // anymore to construct assets - var ( - asset *erc20.ERC20 - err error - ) + var asset *erc20.ERC20 if s.isValidator { - asset, err = erc20.New(assetID, assetDetails, s.ethWallet, s.ethClient) + client, err := s.ethClientByChainID(assetDetails.GetERC20().ChainID) + if err != nil { + return nil, err + } + a, err := erc20.New(assetID, assetDetails, s.ethWallet, client) + if err != nil { + return nil, err + } + asset = a } else { - asset, err = erc20.New(assetID, assetDetails, nil, nil) - } - if err != nil { - return nil, err + a, err := erc20.New(assetID, assetDetails, nil, nil) + if err != nil { + return nil, err + } + asset = a } return &Asset{asset}, nil default: @@ -281,23 +341,33 @@ func (s *Service) assetFromDetails(assetID string, assetDetails *types.AssetDeta } } -func (s *Service) buildAssetFromProto(asset *types.Asset) (*Asset, error) { +func (s *Service) buildAssetUpdateFromProto(asset *types.Asset) (*Asset, error) { switch asset.Details.Source.(type) { case *types.AssetDetailsBuiltinAsset: return &Asset{ builtin.New(asset.ID, asset.Details), }, nil case *types.AssetDetailsErc20: - // TODO(): fix once the ethereum wallet and client are not required - // anymore to construct assets var ( erc20Asset *erc20.ERC20 err error ) if s.isValidator { - erc20Asset, err = erc20.New(asset.ID, asset.Details, s.ethWallet, s.ethClient) + client, err := s.ethClientByChainID(asset.Details.GetERC20().ChainID) + if err != nil { + return nil, err + } + a, err := erc20.New(asset.ID, asset.Details, s.ethWallet, client) + if err != nil { + return nil, err + } + erc20Asset = a } else { - erc20Asset, err = erc20.New(asset.ID, asset.Details, nil, nil) + a, err := erc20.New(asset.ID, asset.Details, nil, nil) + if err != nil { + return nil, err + } + erc20Asset = a } if err != nil { return nil, err @@ -331,7 +401,7 @@ func (s *Service) StageAssetUpdate(updatedAssetProto *types.Asset) error { return ErrAssetDoesNotExist } - updatedAsset, err := s.buildAssetFromProto(updatedAssetProto) + updatedAsset, err := s.buildAssetUpdateFromProto(updatedAssetProto) if err != nil { return fmt.Errorf("couldn't update asset: %w", err) } @@ -451,14 +521,39 @@ func (s *Service) ValidateAsset(assetID string) error { } func (s *Service) validateAsset(a *Asset) error { - var err error - if erc20, ok := a.ERC20(); ok { - err = s.bridgeView.FindAsset(erc20.Type().Details.DeepClone()) - // no error, our asset exists on chain - if err == nil { - erc20.SetValid() + if erc20Asset, ok := a.ERC20(); ok { + details := erc20Asset.Type().Details + bridgeView, err := s.bridgeViewByChainID(details.GetERC20().ChainID) + if err != nil { + return err + } + if err := bridgeView.FindAsset(details); err != nil { + return err } + // no error, our asset exists on chain + erc20Asset.SetValid() } + return nil +} - return err +func (s *Service) ethClientByChainID(chainID string) (erc20.ETHClient, error) { + switch chainID { + case s.primaryEthChainID: + return s.primaryEthClient, nil + case s.secondaryEthChainID: + return s.secondaryEthClient, nil + default: + return nil, fmt.Errorf("chain id %q is not supported", chainID) + } +} + +func (s *Service) bridgeViewByChainID(chainID string) (ERC20BridgeView, error) { + switch chainID { + case s.primaryEthChainID: + return s.primaryBridgeView, nil + case s.secondaryEthChainID: + return s.secondaryBridgeView, nil + default: + return nil, fmt.Errorf("chain id %q is not supported", chainID) + } } diff --git a/core/assets/assets_test.go b/core/assets/assets_test.go index 0380e7aba6..057ac7da83 100644 --- a/core/assets/assets_test.go +++ b/core/assets/assets_test.go @@ -18,6 +18,7 @@ package assets_test import ( "context" "encoding/hex" + "math/big" "testing" "time" @@ -37,37 +38,26 @@ import ( type testService struct { *assets.Service - broker *bmocks.MockInterface - bridgeView *mocks.MockERC20BridgeView - notary *mocks.MockNotary - ctrl *gomock.Controller - ethClient *erc20mocks.MockETHClient - ethWallet *nwethmocks.MockEthereumWallet + broker *bmocks.MockInterface + primaryBridgeView *mocks.MockERC20BridgeView + secondaryBridgeView *mocks.MockERC20BridgeView + notary *mocks.MockNotary + ctrl *gomock.Controller + primaryEthClient *erc20mocks.MockETHClient + ethWallet *nwethmocks.MockEthereumWallet + secondaryEthClient *erc20mocks.MockETHClient } func TestAssets(t *testing.T) { t.Run("Staging asset update for unknown asset fails", testStagingAssetUpdateForUnknownAssetFails) t.Run("Offers signature on tick success", testOffersSignaturesOnTickSuccess) + t.Run("Checking an assets address when chain id is unknown", testValidateUnknownChainID) } func testOffersSignaturesOnTickSuccess(t *testing.T) { service := getTestService(t) assetID := hex.EncodeToString([]byte("asset_id")) - nodeSignature := []byte("node_signature") - - service.broker.EXPECT().Send(gomock.Any()).Times(2) - service.ethClient.EXPECT().CollateralBridgeAddress().Times(1) - service.ethWallet.EXPECT().Algo().Times(1) - service.ethWallet.EXPECT().Sign(gomock.Any()).Return(nodeSignature, nil).Times(1) - - service.notary.EXPECT(). - OfferSignatures(gomock.Any(), gomock.Any()).DoAndReturn( - func(kind types.NodeSignatureKind, f func(id string) []byte) { - require.Equal(t, kind, types.NodeSignatureKindAssetNew) - require.Equal(t, nodeSignature, f(assetID)) - }, - ) assetDetails := &types.AssetDetails{ Name: vgrand.RandomStr(5), @@ -79,18 +69,31 @@ func testOffersSignaturesOnTickSuccess(t *testing.T) { ContractAddress: vgrand.RandomStr(5), LifetimeLimit: num.NewUint(42), WithdrawThreshold: num.NewUint(84), + ChainID: "1", }, }, } ctx := context.Background() + service.broker.EXPECT().Send(gomock.Any()).Times(1) _, err := service.NewAsset(ctx, assetID, assetDetails) require.NoError(t, err) - err = service.Enable(ctx, assetID) - require.NoError(t, err) + service.broker.EXPECT().Send(gomock.Any()).Times(1) + require.NoError(t, service.Enable(ctx, assetID)) + nodeSignature := []byte("node_signature") + service.notary.EXPECT(). + OfferSignatures(gomock.Any(), gomock.Any()).DoAndReturn( + func(kind types.NodeSignatureKind, f func(id string) []byte) { + require.Equal(t, kind, types.NodeSignatureKindAssetNew) + require.Equal(t, nodeSignature, f(assetID)) + }, + ) + service.primaryEthClient.EXPECT().CollateralBridgeAddress().Times(1) + service.ethWallet.EXPECT().Algo().Times(1) + service.ethWallet.EXPECT().Sign(gomock.Any()).Return(nodeSignature, nil).Times(1) service.OnTick(ctx, time.Now()) } @@ -110,6 +113,7 @@ func testStagingAssetUpdateForUnknownAssetFails(t *testing.T) { ContractAddress: vgrand.RandomStr(5), LifetimeLimit: num.NewUint(42), WithdrawThreshold: num.NewUint(84), + ChainID: "1", }, }, }, @@ -122,25 +126,41 @@ func testStagingAssetUpdateForUnknownAssetFails(t *testing.T) { require.ErrorIs(t, err, assets.ErrAssetDoesNotExist) } +func testValidateUnknownChainID(t *testing.T) { + service := getTestService(t) + + require.NoError(t, service.ValidateEthereumAddress(vgrand.RandomStr(5), "1")) + require.NoError(t, service.ValidateEthereumAddress(vgrand.RandomStr(5), "2")) + require.ErrorIs(t, service.ValidateEthereumAddress(vgrand.RandomStr(5), "666"), assets.ErrUnknownChainID) +} + func getTestService(t *testing.T) *testService { t.Helper() conf := assets.NewDefaultConfig() logger := logging.NewTestLogger() ctrl := gomock.NewController(t) - ethClient := erc20mocks.NewMockETHClient(ctrl) + primaryEthClient := erc20mocks.NewMockETHClient(ctrl) + primaryEthClient.EXPECT().ChainID(gomock.Any()).AnyTimes().Return(big.NewInt(1), nil) + primaryEthClient.EXPECT().IsEthereum().AnyTimes().Return(true) + secondaryEthClient := erc20mocks.NewMockETHClient(ctrl) + secondaryEthClient.EXPECT().ChainID(gomock.Any()).AnyTimes().Return(big.NewInt(2), nil) + secondaryEthClient.EXPECT().IsEthereum().AnyTimes().Return(false) broker := bmocks.NewMockInterface(ctrl) - bridgeView := mocks.NewMockERC20BridgeView(ctrl) + primaryBridgeView := mocks.NewMockERC20BridgeView(ctrl) + secondaryBridgeView := mocks.NewMockERC20BridgeView(ctrl) notary := mocks.NewMockNotary(ctrl) ethWallet := nwethmocks.NewMockEthereumWallet(ctrl) - service := assets.New(logger, conf, ethWallet, ethClient, broker, bridgeView, notary, true) + service, _ := assets.New(context.Background(), logger, conf, ethWallet, primaryEthClient, secondaryEthClient, broker, primaryBridgeView, secondaryBridgeView, notary, true) return &testService{ - Service: service, - broker: broker, - ctrl: ctrl, - bridgeView: bridgeView, - notary: notary, - ethClient: ethClient, - ethWallet: ethWallet, + Service: service, + broker: broker, + ctrl: ctrl, + primaryBridgeView: primaryBridgeView, + secondaryBridgeView: secondaryBridgeView, + notary: notary, + primaryEthClient: primaryEthClient, + secondaryEthClient: secondaryEthClient, + ethWallet: ethWallet, } } diff --git a/core/assets/erc20/erc20.go b/core/assets/erc20/erc20.go index 1de1ccfbc8..7377f16418 100644 --- a/core/assets/erc20/erc20.go +++ b/core/assets/erc20/erc20.go @@ -35,14 +35,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" ) -var ( - ErrUnableToFindDeposit = errors.New("unable to find erc20 deposit event") - ErrUnableToFindWithdrawal = errors.New("unable to find erc20 withdrawal event") - ErrUnableToFindERC20AssetList = errors.New("unable to find erc20 asset list event") - ErrUnableToFindERC20AssetLimitsUpdated = errors.New("unable to find ERC20 asset limits updated event") - ErrMissingConfirmations = errors.New("missing confirmation from ethereum") - ErrNotAnErc20Asset = errors.New("not an erc20 asset") -) +var ErrNotAnErc20Asset = errors.New("not an erc20 asset") //go:generate go run github.com/golang/mock/mockgen -destination mocks/eth_client_mock.go -package mocks code.vegaprotocol.io/vega/core/assets/erc20 ETHClient type ETHClient interface { @@ -51,11 +44,14 @@ type ETHClient interface { CollateralBridgeAddress() ethcommon.Address CurrentHeight(context.Context) (uint64, error) ConfirmationsRequired() uint64 + ChainID(ctx context.Context) (*big.Int, error) + IsEthereum() bool } type ERC20 struct { asset *types.Asset address string + chainID string ok bool wallet ethnw.EthereumWallet ethClient ETHClient @@ -78,6 +74,7 @@ func New( Details: asset, Status: types.AssetStatusProposed, }, + chainID: source.ChainID, address: source.ContractAddress, wallet: w, ethClient: ethClient, @@ -96,6 +93,13 @@ func (e *ERC20) SetEnabled() { e.asset.Status = types.AssetStatusEnabled } +// SetChainID sets the chain-id on the ERC20. This should only be used during the migration from 0.75. +func (e *ERC20) SetChainID(chainID string) { + e.chainID = chainID + source := e.asset.Details.Source.(*types.AssetDetailsErc20) + source.ERC20.ChainID = chainID +} + func (e *ERC20) Update(updatedAsset *types.Asset) { e.asset = updatedAsset } @@ -112,6 +116,10 @@ func (e ERC20) Type() *types.Asset { return e.asset.DeepClone() } +func (e ERC20) ChainID() string { + return e.chainID +} + func (e *ERC20) GetAssetClass() common.AssetClass { return common.ERC20 } @@ -137,7 +145,7 @@ func (e *ERC20) SignListAsset() (msg []byte, sig []byte, err error) { } source := e.asset.Details.GetERC20() - bundle, err := bridges.NewERC20Logic(e.wallet, bridgeAddress). + bundle, err := bridges.NewERC20Logic(e.wallet, bridgeAddress, e.chainID, e.ethClient.IsEthereum()). ListAsset(e.address, e.asset.ID, source.LifetimeLimit, source.WithdrawThreshold, nonce) if err != nil { return nil, nil, err @@ -148,7 +156,7 @@ func (e *ERC20) SignListAsset() (msg []byte, sig []byte, err error) { func (e *ERC20) SignSetAssetLimits(nonce *num.Uint, lifetimeLimit *num.Uint, withdrawThreshold *num.Uint) (msg []byte, sig []byte, err error) { bridgeAddress := e.ethClient.CollateralBridgeAddress().Hex() - bundle, err := bridges.NewERC20Logic(e.wallet, bridgeAddress). + bundle, err := bridges.NewERC20Logic(e.wallet, bridgeAddress, e.chainID, e.ethClient.IsEthereum()). SetAssetLimits(e.address, lifetimeLimit, withdrawThreshold, nonce) if err != nil { return nil, nil, err @@ -165,7 +173,7 @@ func (e *ERC20) SignWithdrawal( ) (msg []byte, sig []byte, err error) { nonce, _ := num.UintFromBig(withdrawRef) bridgeAddress := e.ethClient.CollateralBridgeAddress().Hex() - bundle, err := bridges.NewERC20Logic(e.wallet, bridgeAddress). + bundle, err := bridges.NewERC20Logic(e.wallet, bridgeAddress, e.chainID, e.ethClient.IsEthereum()). WithdrawAsset(e.address, amount, ethPartyAddress, now, nonce) if err != nil { return nil, nil, err diff --git a/core/assets/erc20/erc20_test.go b/core/assets/erc20/erc20_test.go index 86aa8f0144..252dd637af 100644 --- a/core/assets/erc20/erc20_test.go +++ b/core/assets/erc20/erc20_test.go @@ -55,6 +55,7 @@ var token = &types.AssetDetails{ ContractAddress: "0x1FaA74E181092A97Fecc923015293ce57eE1208A", WithdrawThreshold: num.NewUint(1000), LifetimeLimit: num.NewUint(42), + ChainID: "1", }, }, } @@ -126,6 +127,14 @@ func (testEthClient) HeaderByNumber(context.Context, *big.Int) (*ethtypes.Header return nil, nil } +func (testEthClient) ChainID(context.Context) (*big.Int, error) { + return big.NewInt(1), nil +} + +func (testEthClient) IsEthereum() bool { + return true +} + func (testEthClient) CollateralBridgeAddress() ethcommon.Address { return ethcommon.HexToAddress(bridgeAddress) } diff --git a/core/assets/erc20/mocks/eth_client_mock.go b/core/assets/erc20/mocks/eth_client_mock.go index bf0ca67a3c..1e886d6723 100644 --- a/core/assets/erc20/mocks/eth_client_mock.go +++ b/core/assets/erc20/mocks/eth_client_mock.go @@ -53,6 +53,21 @@ func (mr *MockETHClientMockRecorder) CallContract(arg0, arg1, arg2 interface{}) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CallContract", reflect.TypeOf((*MockETHClient)(nil).CallContract), arg0, arg1, arg2) } +// ChainID mocks base method. +func (m *MockETHClient) ChainID(arg0 context.Context) (*big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainID", arg0) + ret0, _ := ret[0].(*big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainID indicates an expected call of ChainID. +func (mr *MockETHClientMockRecorder) ChainID(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainID", reflect.TypeOf((*MockETHClient)(nil).ChainID), arg0) +} + // CodeAt mocks base method. func (m *MockETHClient) CodeAt(arg0 context.Context, arg1 common.Address, arg2 *big.Int) ([]byte, error) { m.ctrl.T.Helper() @@ -156,6 +171,20 @@ func (mr *MockETHClientMockRecorder) HeaderByNumber(arg0, arg1 interface{}) *gom return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeaderByNumber", reflect.TypeOf((*MockETHClient)(nil).HeaderByNumber), arg0, arg1) } +// IsEthereum mocks base method. +func (m *MockETHClient) IsEthereum() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsEthereum") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsEthereum indicates an expected call of IsEthereum. +func (mr *MockETHClientMockRecorder) IsEthereum() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsEthereum", reflect.TypeOf((*MockETHClient)(nil).IsEthereum)) +} + // PendingCodeAt mocks base method. func (m *MockETHClient) PendingCodeAt(arg0 context.Context, arg1 common.Address) ([]byte, error) { m.ctrl.T.Helper() diff --git a/core/assets/genesis_state.go b/core/assets/genesis_state.go index e5879b947e..009b665c3a 100644 --- a/core/assets/genesis_state.go +++ b/core/assets/genesis_state.go @@ -43,6 +43,7 @@ type Erc20 struct { ContractAddress string `json:"contract_address"` LifetimeLimit string `json:"lifetime_limit"` WithdrawThreshold string `json:"withdraw_threshold"` + ChainID string `json:"chain_id"` } func (a *AssetDetails) IntoProto() (*types.AssetDetails, error) { @@ -75,6 +76,7 @@ func (a *AssetDetails) IntoProto() (*types.AssetDetails, error) { ContractAddress: a.Source.Erc20.ContractAddress, WithdrawThreshold: a.Source.Erc20.WithdrawThreshold, LifetimeLimit: a.Source.Erc20.LifetimeLimit, + ChainId: a.Source.Erc20.ChainID, }, } } diff --git a/core/assets/snapshot.go b/core/assets/snapshot.go index 296f947ce3..8b2dfef1c8 100644 --- a/core/assets/snapshot.go +++ b/core/assets/snapshot.go @@ -19,7 +19,9 @@ import ( "context" "code.vegaprotocol.io/vega/core/types" + vgcontext "code.vegaprotocol.io/vega/libs/context" "code.vegaprotocol.io/vega/libs/proto" + "code.vegaprotocol.io/vega/logging" ) var ( @@ -99,7 +101,6 @@ func (s *Service) serialiseK(serialFunc func() ([]byte, error), dataField *[]byt return data, nil } -// get the serialised form and hash of the given key. func (s *Service) serialise(k string) ([]byte, error) { switch k { case activeKey: @@ -122,7 +123,7 @@ func (s *Service) LoadState(ctx context.Context, p *types.Payload) ([]types.Stat if s.Namespace() != p.Data.Namespace() { return nil, types.ErrInvalidSnapshotNamespace } - // see what we're reloading + switch pl := p.Data.(type) { case *types.PayloadActiveAssets: return nil, s.restoreActive(ctx, pl.ActiveAssets, p) @@ -139,17 +140,14 @@ func (s *Service) restoreActive(ctx context.Context, active *types.ActiveAssets, var err error s.assets = map[string]*Asset{} for _, p := range active.Assets { + s.applyMigrations(ctx, p) if _, err = s.NewAsset(ctx, p.ID, p.Details); err != nil { return err } pa, _ := s.Get(p.ID) - if s.isValidator { - if err = s.validateAsset(pa); err != nil { - return err - } - } - // at this point asset is always valid + + // at this point asset is always valid because we've loaded from a snapshot and have validated it when it was proposed pa.SetValid() if err = s.Enable(ctx, p.ID); err != nil { @@ -165,6 +163,7 @@ func (s *Service) restorePending(ctx context.Context, pending *types.PendingAsse var err error s.pendingAssets = map[string]*Asset{} for _, p := range pending.Assets { + s.applyMigrations(ctx, p) assetID, err := s.NewAsset(ctx, p.ID, p.Details) if err != nil { return err @@ -180,10 +179,11 @@ func (s *Service) restorePending(ctx context.Context, pending *types.PendingAsse return err } -func (s *Service) restorePendingUpdates(_ context.Context, pending *types.PendingAssetUpdates, p *types.Payload) error { +func (s *Service) restorePendingUpdates(ctx context.Context, pending *types.PendingAssetUpdates, p *types.Payload) error { var err error s.pendingAssetUpdates = map[string]*Asset{} for _, p := range pending.Assets { + s.applyMigrations(ctx, p) if err = s.StageAssetUpdate(p); err != nil { return err } @@ -192,3 +192,69 @@ func (s *Service) restorePendingUpdates(_ context.Context, pending *types.Pendin return err } + +func (s *Service) OnStateLoaded(ctx context.Context) error { + if !vgcontext.InProgressUpgrade(ctx) || s.isValidator { + return nil + } + + // note that non-validator nodes do not know the chain-id for the bridges until the network parameters are propagated, but also *validator* nodes need to + // restore assets before the network parameters. So for the non-validator nodes only, we have to do the migration to include the chain-id here, after everything + // else is restored. + s.log.Info("migrating chain-id in existing active assets for non-validator nodes") + for k, a := range s.assets { + eth, ok := a.ERC20() + if !ok || eth.ChainID() != "" { + continue + } + s.log.Info("setting chain-id for active asset", + logging.String("asset-id", k), + logging.String("chain-id", s.primaryEthChainID), + ) + eth.SetChainID(s.primaryEthChainID) + } + + s.log.Info("migrating chain-id in existing pending assets for non-validator nodes") + for k, p := range s.pendingAssets { + eth, ok := p.ERC20() + if !ok || eth.ChainID() != "" { + continue + } + s.log.Info("setting chain-id for pending asset", + logging.String("asset-id", k), + logging.String("chain-id", s.primaryEthChainID), + ) + eth.SetChainID(s.primaryEthChainID) + } + + s.log.Info("migrating chain-id in existing update-pending assets for non-validator nodes") + for k, pu := range s.pendingAssetUpdates { + eth, ok := pu.ERC20() + if !ok || eth.ChainID() != "" { + continue + } + s.log.Info("setting chain-id for pending update asset", + logging.String("asset-id", k), + logging.String("chain-id", s.primaryEthChainID), + ) + eth.SetChainID(s.primaryEthChainID) + } + + return nil +} + +func (s *Service) applyMigrations(ctx context.Context, p *types.Asset) { + // TODO when we know what versions we are upgrading from we can put in a upgrade from tag + if vgcontext.InProgressUpgrade(ctx) && s.isValidator { + // Prior the introduction of the second bridge, existing assets did not track + // the chain ID they originated from. So, when loaded, assets without a chain + // ID are automatically considered to originate from Ethereum Mainnet. + if erc20 := p.Details.GetERC20(); erc20 != nil && erc20.ChainID == "" { + s.log.Info("migrating chain-id in existin asset for validator nodes", + logging.String("asset-id", p.ID), + logging.String("chain-id", s.primaryEthChainID), + ) + erc20.ChainID = s.primaryEthChainID + } + } +} diff --git a/core/banking/asset_action.go b/core/banking/asset_action.go index 750ea4f751..ae53725912 100644 --- a/core/banking/asset_action.go +++ b/core/banking/asset_action.go @@ -18,6 +18,7 @@ package banking import ( "context" "errors" + "fmt" "sync/atomic" "code.vegaprotocol.io/vega/core/assets" @@ -37,6 +38,7 @@ type assetAction struct { blockHeight uint64 logIndex uint64 txHash string + chainID string // all deposit related types builtinD *types.BuiltinAssetDeposit @@ -74,6 +76,10 @@ func (t *assetAction) GetType() types.NodeVoteType { } } +func (t *assetAction) GetChainID() string { + return t.chainID +} + func (t *assetAction) IsBuiltinAssetDeposit() bool { return t.builtinD != nil } @@ -117,23 +123,23 @@ func (t *assetAction) ERC20AssetList() *types.ERC20AssetList { func (t *assetAction) String() string { switch { case t.IsBuiltinAssetDeposit(): - return t.builtinD.String() + return fmt.Sprintf("builtinAssetDeposit(%s)", t.builtinD.String()) case t.IsERC20Deposit(): - return t.erc20D.String() + return fmt.Sprintf("erc20Deposit(%s)", t.erc20D.String()) case t.IsERC20AssetList(): - return t.erc20AL.String() + return fmt.Sprintf("erc20AssetList(%s)", t.erc20AL.String()) case t.IsERC20AssetLimitsUpdated(): - return t.erc20AssetLimitsUpdated.String() + return fmt.Sprintf("erc20AssetLimitsUpdated(%s)", t.erc20AssetLimitsUpdated.String()) case t.IsERC20BridgeStopped(): - return t.erc20BridgeStopped.String() + return fmt.Sprintf("erc20BridgeStopped(%s)", t.erc20BridgeStopped.String()) case t.IsERC20BridgeResumed(): - return t.erc20BridgeResumed.String() + return fmt.Sprintf("erc20BridgeResumed(%s)", t.erc20BridgeResumed.String()) default: return "" } } -func (t *assetAction) Check(ctx context.Context) error { +func (t *assetAction) Check(_ context.Context) error { switch { case t.IsBuiltinAssetDeposit(): return t.checkBuiltinAssetDeposit() @@ -189,15 +195,15 @@ func (t *assetAction) getRef() snapshot.TxRef { case t.IsBuiltinAssetDeposit(): return snapshot.TxRef{Asset: string(common.Builtin), BlockNr: 0, Hash: t.txHash, LogIndex: 0} case t.IsERC20Deposit(): - return snapshot.TxRef{Asset: string(common.ERC20), BlockNr: t.blockHeight, Hash: t.txHash, LogIndex: t.logIndex} + return snapshot.TxRef{Asset: string(common.ERC20), BlockNr: t.blockHeight, Hash: t.txHash, LogIndex: t.logIndex, ChainId: t.chainID} case t.IsERC20AssetList(): - return snapshot.TxRef{Asset: string(common.ERC20), BlockNr: t.blockHeight, Hash: t.txHash, LogIndex: t.logIndex} + return snapshot.TxRef{Asset: string(common.ERC20), BlockNr: t.blockHeight, Hash: t.txHash, LogIndex: t.logIndex, ChainId: t.chainID} case t.IsERC20AssetLimitsUpdated(): - return snapshot.TxRef{Asset: string(common.ERC20), BlockNr: t.blockHeight, Hash: t.txHash, LogIndex: t.logIndex} + return snapshot.TxRef{Asset: string(common.ERC20), BlockNr: t.blockHeight, Hash: t.txHash, LogIndex: t.logIndex, ChainId: t.chainID} case t.IsERC20BridgeStopped(): - return snapshot.TxRef{Asset: string(common.ERC20), BlockNr: t.blockHeight, Hash: t.txHash, LogIndex: t.logIndex} + return snapshot.TxRef{Asset: string(common.ERC20), BlockNr: t.blockHeight, Hash: t.txHash, LogIndex: t.logIndex, ChainId: t.chainID} case t.IsERC20BridgeResumed(): - return snapshot.TxRef{Asset: string(common.ERC20), BlockNr: t.blockHeight, Hash: t.txHash, LogIndex: t.logIndex} + return snapshot.TxRef{Asset: string(common.ERC20), BlockNr: t.blockHeight, Hash: t.txHash, LogIndex: t.logIndex, ChainId: t.chainID} default: return snapshot.TxRef{} // this is basically unreachable } diff --git a/core/banking/bridge_stop_resume.go b/core/banking/bridge_stop_resume.go index 2712e9a077..e84ada2c8f 100644 --- a/core/banking/bridge_stop_resume.go +++ b/core/banking/bridge_stop_resume.go @@ -21,33 +21,33 @@ import ( "code.vegaprotocol.io/vega/core/types" ) -func (e *Engine) BridgeStopped( - ctx context.Context, - stopped bool, - id string, - block, logIndex uint64, - ethTxHash string, -) error { +func (e *Engine) BridgeStopped(_ context.Context, stopped bool, id string, block uint64, logIndex uint64, ethTxHash string, chainID string) error { + bridgeView, err := e.bridgeViewForChainID(chainID) + if err != nil { + return err + } + aa := &assetAction{ id: id, state: newPendingState(), - erc20BridgeStopped: &types.ERC20EventBridgeStopped{BridgeStopped: stopped}, blockHeight: block, logIndex: logIndex, txHash: ethTxHash, - bridgeView: e.bridgeView, + chainID: chainID, + erc20BridgeStopped: &types.ERC20EventBridgeStopped{BridgeStopped: stopped}, + bridgeView: bridgeView, } - e.assetActs[aa.id] = aa + + e.assetActions[aa.id] = aa return e.witness.StartCheck(aa, e.onCheckDone, e.timeService.GetTimeNow().Add(defaultValidationDuration)) } -func (e *Engine) BridgeResumed( - ctx context.Context, - resumed bool, - id string, - block, logIndex uint64, - ethTxHash string, -) error { +func (e *Engine) BridgeResumed(_ context.Context, resumed bool, id string, block uint64, logIndex uint64, ethTxHash string, chainID string) error { + bridgeView, err := e.bridgeViewForChainID(chainID) + if err != nil { + return err + } + aa := &assetAction{ id: id, state: newPendingState(), @@ -55,9 +55,10 @@ func (e *Engine) BridgeResumed( blockHeight: block, logIndex: logIndex, txHash: ethTxHash, - bridgeView: e.bridgeView, + chainID: chainID, + bridgeView: bridgeView, } - e.assetActs[aa.id] = aa + e.assetActions[aa.id] = aa return e.witness.StartCheck(aa, e.onCheckDone, e.timeService.GetTimeNow().Add(defaultValidationDuration)) } @@ -66,7 +67,7 @@ type bridgeState struct { active bool // last block + log index we received an update from the bridge // this will be used later to verify no new state of the bridge is processed - // in a wrong orderi + // in a wrong order. block, logIndex uint64 } diff --git a/core/banking/builtin_assets.go b/core/banking/builtin_assets.go index 8b53fae840..d26636033a 100644 --- a/core/banking/builtin_assets.go +++ b/core/banking/builtin_assets.go @@ -88,7 +88,7 @@ func (e *Engine) DepositBuiltinAsset( asset: asset, txHash: hex.EncodeToString(vgcrypto.Hash(b)), } - e.assetActs[aa.id] = aa + e.assetActions[aa.id] = aa e.deposits[dep.ID] = dep return e.witness.StartCheck(aa, e.onCheckDone, e.timeService.GetTimeNow().Add(defaultValidationDuration)) } diff --git a/core/banking/checkpoint.go b/core/banking/checkpoint.go index a058b9db4f..97ba825e86 100644 --- a/core/banking/checkpoint.go +++ b/core/banking/checkpoint.go @@ -17,6 +17,7 @@ package banking import ( "context" + "fmt" "sort" "sync/atomic" @@ -31,6 +32,7 @@ import ( eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" "github.com/emirpasic/gods/sets/treeset" + "go.uber.org/zap" ) func (e *Engine) Name() types.CheckpointName { @@ -41,19 +43,21 @@ func (e *Engine) Checkpoint() ([]byte, error) { msg := &checkpoint.Banking{ TransfersAtTime: e.getScheduledTransfers(), RecurringTransfers: e.getRecurringTransfers(), + PrimaryBridgeState: e.getPrimaryBridgeState(), + LastSeenPrimaryEthBlock: e.lastSeenPrimaryEthBlock, GovernanceTransfersAtTime: e.getScheduledGovernanceTransfers(), RecurringGovernanceTransfers: e.getRecurringGovernanceTransfers(), - BridgeState: e.getBridgeState(), - LastSeenEthBlock: e.lastSeenEthBlock, + SecondaryBridgeState: e.getSecondaryBridgeState(), + LastSeenSecondaryEthBlock: e.lastSeenSecondaryEthBlock, } - msg.SeenRefs = make([]string, 0, e.seen.Size()) - iter := e.seen.Iterator() + msg.SeenRefs = make([]string, 0, e.seenAssetActions.Size()) + iter := e.seenAssetActions.Iterator() for iter.Next() { msg.SeenRefs = append(msg.SeenRefs, iter.Value().(string)) } - msg.AssetActions = make([]*checkpoint.AssetAction, 0, len(e.assetActs)) + msg.AssetActions = make([]*checkpoint.AssetAction, 0, len(e.assetActions)) for _, aa := range e.getAssetActions() { msg.AssetActions = append(msg.AssetActions, aa.IntoProto()) } @@ -81,25 +85,34 @@ func (e *Engine) Load(ctx context.Context, data []byte) error { evts = append(evts, e.loadScheduledGovernanceTransfers(ctx, b.GovernanceTransfersAtTime)...) evts = append(evts, e.loadRecurringGovernanceTransfers(ctx, b.RecurringGovernanceTransfers)...) - e.loadBridgeState(b.BridgeState) + e.loadPrimaryBridgeState(b.PrimaryBridgeState) + e.loadSecondaryBridgeState(b.SecondaryBridgeState) - e.seen = treeset.NewWithStringComparator() + e.seenAssetActions = treeset.NewWithStringComparator() for _, v := range b.SeenRefs { - e.seen.Add(v) + e.seenAssetActions.Add(v) } - e.lastSeenEthBlock = b.LastSeenEthBlock - if e.lastSeenEthBlock != 0 { - e.log.Info("restoring collateral bridge starting block", logging.Uint64("block", e.lastSeenEthBlock)) - e.ethEventSource.UpdateCollateralStartingBlock(e.lastSeenEthBlock) + 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.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) } aa := make([]*types.AssetAction, 0, len(b.AssetActions)) for _, a := range b.AssetActions { aa = append(aa, types.AssetActionFromProto(a)) } - e.loadAssetActions(aa) - for _, aa := range e.assetActs { + if err := e.loadAssetActions(aa); err != nil { + return fmt.Errorf("could not load asset actions: %w", err) + } + for _, aa := range e.assetActions { e.witness.StartCheck(aa, e.onCheckDone, e.timeService.GetTimeNow().Add(defaultValidationDuration)) } @@ -110,7 +123,7 @@ func (e *Engine) Load(ctx context.Context, data []byte) error { return nil } -func (e *Engine) loadAssetActions(aa []*types.AssetAction) { +func (e *Engine) loadAssetActions(aa []*types.AssetAction) error { for _, v := range aa { var ( err error @@ -136,6 +149,19 @@ func (e *Engine) loadAssetActions(aa []*types.AssetAction) { bridgeResumed = &types.ERC20EventBridgeResumed{BridgeResumed: true} } + // This handle old asset actions that are not associated to a chain ID + // yet, that are likely asset actions that should be associated to the + // primary bridge. + var bridgeView ERC20BridgeView + if v.ChainID == "" { + bridgeView = e.primaryBridgeView + } else { + bridgeView, err = e.bridgeViewForChainID(v.ChainID) + if err != nil { + return err + } + } + state := &atomic.Uint32{} state.Store(v.State) aa := &assetAction{ @@ -145,6 +171,7 @@ func (e *Engine) loadAssetActions(aa []*types.AssetAction) { asset: asset, logIndex: v.TxIndex, txHash: v.Hash, + chainID: v.ChainID, builtinD: v.BuiltinD, erc20AL: v.Erc20AL, erc20D: v.Erc20D, @@ -152,7 +179,7 @@ func (e *Engine) loadAssetActions(aa []*types.AssetAction) { erc20BridgeStopped: bridgeStopped, erc20BridgeResumed: bridgeResumed, // this is needed every time now - bridgeView: e.bridgeView, + bridgeView: bridgeView, } if len(aa.getRef().Hash) == 0 { @@ -160,7 +187,7 @@ func (e *Engine) loadAssetActions(aa []*types.AssetAction) { e.log.Panic("asset action has not been serialised correct and is empty", logging.String("txHash", aa.txHash)) } - e.assetActs[v.ID] = aa + e.assetActions[v.ID] = aa // store the deposit in the deposits if v.BuiltinD != nil { e.deposits[v.ID] = e.newDeposit(v.ID, v.BuiltinD.PartyID, v.BuiltinD.VegaAssetID, v.BuiltinD.Amount, v.Hash) @@ -168,20 +195,39 @@ func (e *Engine) loadAssetActions(aa []*types.AssetAction) { e.deposits[v.ID] = e.newDeposit(v.ID, v.Erc20D.TargetPartyID, v.Erc20D.VegaAssetID, v.Erc20D.Amount, v.Hash) } } + return nil } -func (e *Engine) loadBridgeState(state *checkpoint.BridgeState) { +func (e *Engine) loadPrimaryBridgeState(state *checkpoint.BridgeState) { // this would eventually be nil if we restore from a checkpoint // which have been produce from an old version of the core. // we set it to active by default in the case if state == nil { - e.bridgeState = &bridgeState{ + e.primaryBridgeState = &bridgeState{ active: true, } return } - e.bridgeState = &bridgeState{ + e.primaryBridgeState = &bridgeState{ + active: state.Active, + block: state.BlockHeight, + logIndex: state.LogIndex, + } +} + +func (e *Engine) loadSecondaryBridgeState(state *checkpoint.BridgeState) { + // this would eventually be nil if we restore from a checkpoint + // which have been produce from an old version of the core. + // we set it to active by default in the case + if state == nil { + e.secondaryBridgeState = &bridgeState{ + active: true, + } + return + } + + e.secondaryBridgeState = &bridgeState{ active: state.Active, block: state.BlockHeight, logIndex: state.LogIndex, @@ -264,11 +310,19 @@ func (e *Engine) loadRecurringGovernanceTransfers(ctx context.Context, transfers return evts } -func (e *Engine) getBridgeState() *checkpoint.BridgeState { +func (e *Engine) getPrimaryBridgeState() *checkpoint.BridgeState { return &checkpoint.BridgeState{ - Active: e.bridgeState.active, - BlockHeight: e.bridgeState.block, - LogIndex: e.bridgeState.logIndex, + Active: e.primaryBridgeState.active, + BlockHeight: e.primaryBridgeState.block, + LogIndex: e.primaryBridgeState.logIndex, + } +} + +func (e *Engine) getSecondaryBridgeState() *checkpoint.BridgeState { + return &checkpoint.BridgeState{ + Active: e.secondaryBridgeState.active, + BlockHeight: e.secondaryBridgeState.block, + LogIndex: e.secondaryBridgeState.logIndex, } } @@ -323,8 +377,8 @@ func (e *Engine) getScheduledGovernanceTransfers() []*checkpoint.ScheduledGovern } func (e *Engine) getAssetActions() []*types.AssetAction { - aa := make([]*types.AssetAction, 0, len(e.assetActs)) - for _, v := range e.assetActs { + aa := make([]*types.AssetAction, 0, len(e.assetActions)) + for _, v := range e.assetActions { // this is optional as bridge action don't have one var assetID string if v.asset != nil { @@ -341,20 +395,28 @@ func (e *Engine) getAssetActions() []*types.AssetAction { bridgeResumed = true } - aa = append(aa, &types.AssetAction{ + action := types.AssetAction{ ID: v.id, State: v.state.Load(), BlockNumber: v.blockHeight, Asset: assetID, TxIndex: v.logIndex, Hash: v.txHash, + ChainID: v.chainID, BuiltinD: v.builtinD, Erc20AL: v.erc20AL, Erc20D: v.erc20D, ERC20AssetLimitsUpdated: v.erc20AssetLimitsUpdated, BridgeStopped: bridgeStopped, BridgeResume: bridgeResumed, - }) + } + + e.log.Info("getAssetActions", + zap.Any("action", fmt.Sprintf("%+v", action)), + zap.String("ref", v.getRef().Hash), + ) + + aa = append(aa, &action) } sort.SliceStable(aa, func(i, j int) bool { return aa[i].ID < aa[j].ID }) diff --git a/core/banking/checkpoint_test.go b/core/banking/checkpoint_test.go index 2905fdd9e3..09f9342ded 100644 --- a/core/banking/checkpoint_test.go +++ b/core/banking/checkpoint_test.go @@ -54,9 +54,9 @@ func TestDepositFinalisedAfterCheckpoint(t *testing.T) { err := eng.DepositBuiltinAsset(context.Background(), bad, "depositid", 42) assert.NoError(t, err) - // then we call the callback from the fake erc - eng.erc.r.Check(context.Background()) - eng.erc.f(eng.erc.r, true) + // then we call the callback from the fake witness + eng.witness.r.Check(context.Background()) + eng.witness.f(eng.witness.r, true) // now we take a checkpoint cp, err := eng.Checkpoint() @@ -203,13 +203,9 @@ func testSimpledScheduledTransfer(t *testing.T) { e2.OnTick(context.Background(), time.Unix(12, 0)) } -func TestGovernancedScheduledTransfer(t *testing.T) { +func TestGovernanceScheduledTransfer(t *testing.T) { e := getTestEngine(t) e.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) - 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)) @@ -233,6 +229,7 @@ func TestGovernancedScheduledTransfer(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() @@ -253,10 +250,6 @@ func TestGovernancedScheduledTransfer(t *testing.T) { // progress time to when the scheduled gov transfer should be delivered on // then trigger the time update, and see the transfer going - e2.tsvc.EXPECT().GetTimeNow().DoAndReturn( - func() time.Time { - return time.Unix(12, 0) - }).Times(2) e2.broker.EXPECT().Send(gomock.Any()).Times(2) e2.broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() e2.col.EXPECT().GetSystemAccountBalance(gomock.Any(), gomock.Any(), gomock.Any()).Return(num.NewUint(1000), nil).AnyTimes() @@ -276,10 +269,6 @@ func TestGovernanceRecurringTransfer(t *testing.T) { e.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) ctx := context.Background() - e.tsvc.EXPECT().GetTimeNow().DoAndReturn( - func() time.Time { - return time.Unix(10, 0) - }).Times(3) e.OnTransferFeeFactorUpdate(context.Background(), num.NewDecimalFromFloat(1)) e.OnTick(ctx, time.Unix(10, 0)) e.OnEpoch(ctx, types.Epoch{Seq: 0, StartTime: time.Unix(10, 0), Action: vega.EpochAction_EPOCH_ACTION_START}) @@ -301,6 +290,7 @@ func TestGovernanceRecurringTransfer(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() diff --git a/core/banking/deduplicate.go b/core/banking/deduplicate.go new file mode 100644 index 0000000000..7fdc3adbb8 --- /dev/null +++ b/core/banking/deduplicate.go @@ -0,0 +1,86 @@ +// 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 banking + +import ( + "context" + "encoding/hex" + "errors" + "fmt" + + vgcrypto "code.vegaprotocol.io/vega/libs/crypto" + vgproto "code.vegaprotocol.io/vega/libs/proto" + "code.vegaprotocol.io/vega/logging" + snapshot "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" +) + +var ErrChainEventAlreadySeen = errors.New("chain event already processed") + +// deduplicateAssetAction returns true if the action has been deduplicated, false +// if the action has never been seen before. +func (e *Engine) deduplicateAssetAction(ctx context.Context, action *assetAction) error { + ref := action.getRef() + + refKey, err := buildRefKey(ref) + if err != nil { + return fmt.Errorf("could not build reference key: %w", err) + } + + // Check if this action have been seen before. + if e.seenAssetActions.Contains(refKey) { + if err := e.dedupAction(ctx, action); err != nil { + e.log.Error("unable to deduplicate action", logging.String("action", action.String()), logging.Error(err)) + } + return ErrChainEventAlreadySeen + } + + // Prior the introduction of the second bridge, the TxRef did + // not track the chain ID. Now that all TxRef have the chain ID filled, + // we must ensure an older TxRef is not applied twice because it got its + // chain ID valued, during a replay. + // + // This verification is only meaningful on actions coming from Ethereum + // Mainnet, hence the condition. + if ref.ChainId != "" && ref.ChainId == e.primaryEthChainID { + ref.ChainId = "" + + refKeyWithChainID, err := buildRefKey(ref) + if err != nil { + return fmt.Errorf("could not build reference key: %w", err) + } + + if e.seenAssetActions.Contains(refKeyWithChainID) { + if err := e.dedupAction(ctx, action); err != nil { + e.log.Error("unable to deduplicate action", logging.String("action", action.String()), logging.Error(err)) + } + return ErrChainEventAlreadySeen + } + } + + // First time we see this transaction, so we keep track of it. + e.seenAssetActions.Add(refKey) + + return nil +} + +func buildRefKey(ref snapshot.TxRef) (string, error) { + buf, err := vgproto.Marshal(&ref) + if err != nil { + return "", err + } + + return hex.EncodeToString(vgcrypto.Hash(buf)), nil +} diff --git a/core/banking/deduplicate_test.go b/core/banking/deduplicate_test.go new file mode 100644 index 0000000000..568a3a7ee5 --- /dev/null +++ b/core/banking/deduplicate_test.go @@ -0,0 +1,103 @@ +// 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 banking_test + +import ( + "context" + "testing" + "time" + + "code.vegaprotocol.io/vega/core/assets" + "code.vegaprotocol.io/vega/core/assets/erc20" + "code.vegaprotocol.io/vega/core/types" + vgrand "code.vegaprotocol.io/vega/libs/rand" + + "github.com/stretchr/testify/require" +) + +func TestAssetActionDeduplication(t *testing.T) { + ctx := context.Background() + + eng := getTestEngine(t) + eng.OnPrimaryEthChainIDUpdated("1") + + id1 := vgrand.RandomStr(5) + txHash1 := vgrand.RandomStr(5) + assetID1 := vgrand.RandomStr(5) + assetList1 := &types.ERC20AssetList{ + VegaAssetID: assetID1, + } + erc20Asset, err := erc20.New(assetID1, &types.AssetDetails{ + Source: &types.AssetDetailsErc20{ + ERC20: &types.ERC20{ + ChainID: "", + ContractAddress: "", + LifetimeLimit: nil, + WithdrawThreshold: nil, + }, + }, + }, nil, nil) + require.NoError(t, err) + 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, "")) + + // Validate the asset list. + eng.witness.f(eng.witness.r, true) + + // These expectations shows the asset action is processed. + eng.assets.EXPECT().Get(assetID1).Times(1).Return(asset1, nil) + eng.assets.EXPECT().Enable(ctx, assetID1).Times(1).Return(nil) + eng.col.EXPECT().EnableAsset(ctx, *asset1.ToAssetType()).Times(1).Return(nil) + + // Trigger processing of asset actions, and deduplication. + eng.OnTick(ctx, time.Now()) + }) + + 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, "")) + + // Validate the asset list. + eng.witness.f(eng.witness.r, true) + + // We expect nothing as the asset action should be deduplicated. + + // Trigger processing of asset actions, and deduplication. + eng.OnTick(ctx, time.Now()) + }) + + // This covers the scenario where the event is replayed but with the chain ID + // 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")) + + // Validate the asset list. + eng.witness.f(eng.witness.r, true) + + // We expect nothing as the asset action should be deduplicated. + + // Trigger processing of asset actions, and deduplication. + eng.OnTick(ctx, time.Now()) + }) +} diff --git a/core/banking/engine.go b/core/banking/engine.go index e5ac844a5b..4e42c77010 100644 --- a/core/banking/engine.go +++ b/core/banking/engine.go @@ -17,8 +17,8 @@ package banking import ( "context" - "encoding/hex" "errors" + "fmt" "math/big" "slices" "sort" @@ -31,13 +31,10 @@ import ( "code.vegaprotocol.io/vega/core/events" "code.vegaprotocol.io/vega/core/types" "code.vegaprotocol.io/vega/core/validators" - "code.vegaprotocol.io/vega/libs/crypto" "code.vegaprotocol.io/vega/libs/num" - vgproto "code.vegaprotocol.io/vega/libs/proto" "code.vegaprotocol.io/vega/logging" "code.vegaprotocol.io/vega/protos/vega" proto "code.vegaprotocol.io/vega/protos/vega" - snapshot "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" "github.com/emirpasic/gods/sets/treeset" "golang.org/x/exp/maps" @@ -136,23 +133,44 @@ type dispatchStrategyCacheEntry struct { } type Engine struct { - cfg Config - log *logging.Logger - timeService TimeService - broker broker.Interface - col Collateral - witness Witness - notary Notary - assets Assets - top Topology - ethEventSource EthereumEventSource - - assetActs map[string]*assetAction - seen *treeset.Set - lastSeenEthBlock uint64 // the block height of the latest ERC20 chain event - withdrawals map[string]withdrawalRef - withdrawalCnt *big.Int - deposits map[string]*types.Deposit + cfg Config + log *logging.Logger + timeService TimeService + broker broker.Interface + col Collateral + witness Witness + notary Notary + assets Assets + top Topology + + // assetActions tracks all the asset actions the engine must process on network + // tick. + assetActions map[string]*assetAction + // seenAssetActions keeps track of all asset action the node has seen. + seenAssetActions *treeset.Set + + // primaryEthChainID stores the Ethereum Mainnet chain ID. It is used during the + // chain event deduplication phase, to ensure we correctly deduplicate + // chain events that have been seen before the introduce of the second bridge. + primaryEthChainID string + // lastSeenPrimaryEthBlock holds the block height of the latest ERC20 chain + // event, from the primary chain, processed by the engine. + 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. + lastSeenSecondaryEthBlock uint64 + secondaryEthChainID string + secondaryBridgeState *bridgeState + secondaryBridgeView ERC20BridgeView + secondaryEthEventSource EthereumEventSource + + withdrawals map[string]withdrawalRef + withdrawalCnt *big.Int + deposits map[string]*types.Deposit currentEpoch uint64 bss *bankingSnapshotState @@ -184,9 +202,6 @@ type Engine struct { // transfer id to recurringTransfers recurringTransfersMap map[string]*types.RecurringTransfer - bridgeState *bridgeState - bridgeView ERC20BridgeView - minWithdrawQuantumMultiple num.Decimal maxGovTransferQunatumMultiplier num.Decimal @@ -198,8 +213,7 @@ type withdrawalRef struct { ref *big.Int } -func New( - log *logging.Logger, +func New(log *logging.Logger, cfg Config, col Collateral, witness Witness, @@ -209,8 +223,10 @@ func New( broker broker.Interface, top Topology, marketActivityTracker MarketActivityTracker, - bridgeView ERC20BridgeView, - ethEventSource EthereumEventSource, + primaryBridgeView ERC20BridgeView, + secondaryBridgeView ERC20BridgeView, + primaryEthEventSource EthereumEventSource, + secondaryEthEventSource EthereumEventSource, ) (e *Engine) { log = log.Named(namedLogger) log.SetLevel(cfg.Level.Get()) @@ -225,9 +241,10 @@ func New( assets: assets, notary: notary, top: top, - ethEventSource: ethEventSource, - assetActs: map[string]*assetAction{}, - seen: treeset.NewWithStringComparator(), + primaryEthEventSource: primaryEthEventSource, + secondaryEthEventSource: secondaryEthEventSource, + assetActions: map[string]*assetAction{}, + seenAssetActions: treeset.NewWithStringComparator(), withdrawals: map[string]withdrawalRef{}, deposits: map[string]*types.Deposit{}, withdrawalCnt: big.NewInt(0), @@ -243,12 +260,16 @@ func New( minWithdrawQuantumMultiple: num.DecimalZero(), marketActivityTracker: marketActivityTracker, hashToStrategy: map[string]*dispatchStrategyCacheEntry{}, - bridgeState: &bridgeState{ + primaryBridgeState: &bridgeState{ + active: true, + }, + secondaryBridgeState: &bridgeState{ active: true, }, feeDiscountPerPartyAndAsset: map[partyAssetKey]*num.Uint{}, pendingPerAssetAndPartyFeeDiscountUpdates: map[string]map[string]*num.Uint{}, - bridgeView: bridgeView, + primaryBridgeView: primaryBridgeView, + secondaryBridgeView: secondaryBridgeView, } } @@ -267,6 +288,14 @@ func (e *Engine) OnMinWithdrawQuantumMultiple(ctx context.Context, f num.Decimal return nil } +func (e *Engine) OnPrimaryEthChainIDUpdated(chainID string) { + e.primaryEthChainID = chainID +} + +func (e *Engine) OnSecondaryEthChainIDUpdated(chainID string) { + e.secondaryEthChainID = chainID +} + // ReloadConf updates the internal configuration. func (e *Engine) ReloadConf(cfg Config) { e.log.Info("reloading configuration") @@ -296,82 +325,56 @@ func (e *Engine) OnEpoch(ctx context.Context, ep types.Epoch) { } } -func (e *Engine) OnTick(ctx context.Context, _ time.Time) { - assetActionKeys := make([]string, 0, len(e.assetActs)) - for k := range e.assetActs { - assetActionKeys = append(assetActionKeys, k) +func (e *Engine) OnTick(ctx context.Context, now time.Time) { + e.processAssetActions(ctx, now) + + e.notary.OfferSignatures(types.NodeSignatureKindAssetWithdrawal, e.offerERC20NotarySignatures) + + // then process all scheduledTransfers + if err := e.distributeScheduledTransfers(ctx, now); err != nil { + e.log.Error("could not process scheduled transfers", + logging.Error(err), + ) } - sort.Strings(assetActionKeys) - // iterate over asset actions deterministically - for _, k := range assetActionKeys { - v := e.assetActs[k] - state := v.state.Load() - if state == pendingState { - continue - } + // process governance transfers + e.distributeScheduledGovernanceTransfers(ctx, now) +} - // get the action reference to ensure it's not a duplicate - ref := v.getRef() - refKey, err := getRefKey(ref) - if err != nil { - e.log.Error("failed to serialise ref", - logging.String("asset-class", ref.Asset), - logging.String("tx-hash", ref.Hash), - logging.String("action", v.String())) - continue - } +func (e *Engine) processAssetActions(ctx context.Context, now time.Time) { + sortedAssetActionKeys := maps.Keys(e.assetActions) + sort.Strings(sortedAssetActionKeys) - switch state { + for _, key := range sortedAssetActionKeys { + action := e.assetActions[key] + + switch action.state.Load() { + case pendingState: + // The verification of the action has not been completed yet, so + // we skip it until it is. + continue case okState: - // check if this transaction have been seen before then - if e.seen.Contains(refKey) { - // do nothing of this transaction, just display an error - e.log.Error("chain event reference a transaction already processed", - logging.String("asset-class", ref.Asset), - logging.String("tx-hash", ref.Hash), - logging.String("action", v.String())) - - if err := e.dedupAction(ctx, v); err != nil { - e.log.Error("unable to deduplicate action", logging.String("action", v.String()), logging.Error(err)) - } - } else { - // first time we seen this transaction, let's add iter - e.seen.Add(refKey) - if err := e.finalizeAction(ctx, v); err != nil { - e.log.Error("unable to finalize action", - logging.String("action", v.String()), - logging.Error(err)) - } + if err := e.deduplicateAssetAction(ctx, action); err != nil { + e.log.Warn("an error occurred during asset action deduplication", + logging.Error(err), + logging.String("action", action.String()), + logging.String("tx-hash", action.txHash), + logging.String("chain-id", action.chainID)) + break } + if err := e.finalizeAction(ctx, action, now); err != nil { + e.log.Error("unable to finalize action", + logging.String("action", action.String()), + logging.Error(err)) + } case rejectedState: e.log.Error("network rejected banking action", - logging.String("action", v.String())) + logging.String("action", action.String())) } - // delete anyway the action - // at this point the action was either rejected, so we do no need - // need to keep waiting for its validation, or accepted. in the case - // it's accepted it's then sent to the given collateral function - // (deposit, withdraw, allowlist), then an error can occur down the - // line in the collateral but if that happened there's no way for - // us to recover for this event, so we have no real reason to keep - // it in memory - delete(e.assetActs, k) - } - - e.notary.OfferSignatures( - types.NodeSignatureKindAssetWithdrawal, e.offerERC20NotarySignatures) - // then process all scheduledTransfers - if err := e.distributeScheduledTransfers(ctx); err != nil { - e.log.Error("could not process scheduled transfers", - logging.Error(err), - ) + delete(e.assetActions, key) } - - // process governance transfers - e.distributeScheduledGovernanceTransfers(ctx) } func (e *Engine) onCheckDone(i interface{}, valid bool) { @@ -421,23 +424,31 @@ func (e *Engine) dedupAction(ctx context.Context, aa *assetAction) error { return nil } -func (e *Engine) finalizeAction(ctx context.Context, aa *assetAction) error { +func (e *Engine) finalizeAction(ctx context.Context, aa *assetAction, now time.Time) error { switch { case aa.IsBuiltinAssetDeposit(): dep := e.deposits[aa.id] - return e.finalizeDeposit(ctx, dep) + return e.finalizeDeposit(ctx, dep, now) case aa.IsERC20Deposit(): dep := e.deposits[aa.id] - return e.finalizeDeposit(ctx, dep) + return e.finalizeDeposit(ctx, dep, now) case aa.IsERC20AssetList(): return e.finalizeAssetList(ctx, aa.erc20AL.VegaAssetID) case aa.IsERC20AssetLimitsUpdated(): return e.finalizeAssetLimitsUpdated(ctx, aa.erc20AssetLimitsUpdated.VegaAssetID) case aa.IsERC20BridgeStopped(): - e.bridgeState.NewBridgeStopped(aa.blockHeight, aa.logIndex) + b, err := e.bridgeStateForChainID(aa.chainID) + if err != nil { + return err + } + b.NewBridgeStopped(aa.blockHeight, aa.logIndex) return nil case aa.IsERC20BridgeResumed(): - e.bridgeState.NewBridgeResumed(aa.blockHeight, aa.logIndex) + b, err := e.bridgeStateForChainID(aa.chainID) + if err != nil { + return err + } + b.NewBridgeResumed(aa.blockHeight, aa.logIndex) return nil default: return ErrUnknownAssetAction @@ -478,7 +489,7 @@ func (e *Engine) finalizeAssetLimitsUpdated(ctx context.Context, assetID string) return e.col.PropagateAssetUpdate(ctx, *asset.ToAssetType()) } -func (e *Engine) finalizeDeposit(ctx context.Context, d *types.Deposit) error { +func (e *Engine) finalizeDeposit(ctx context.Context, d *types.Deposit, now time.Time) error { defer func() { e.broker.Send(events.NewDepositEvent(ctx, *d)) // whatever happens, the deposit is in its final state (cancelled or finalized) @@ -491,7 +502,7 @@ func (e *Engine) finalizeDeposit(ctx context.Context, d *types.Deposit) error { } d.Status = types.DepositStatusFinalized - d.CreditDate = e.timeService.GetTimeNow().UnixNano() + d.CreditDate = now.UnixNano() e.broker.Send(events.NewLedgerMovements(ctx, []*types.LedgerMovement{res})) return nil } @@ -502,9 +513,7 @@ func (e *Engine) dedupDeposit(ctx context.Context, d *types.Deposit) error { return nil } -func (e *Engine) finalizeWithdraw( - ctx context.Context, w *types.Withdrawal, -) error { +func (e *Engine) finalizeWithdraw(ctx context.Context, w *types.Withdrawal) error { // always send the withdrawal event, don't delete it from the map because we // may still receive events defer func() { @@ -612,13 +621,26 @@ func (e *Engine) sendTeamsStats(ctx context.Context, seq uint64) { } } -func getRefKey(ref snapshot.TxRef) (string, error) { - buf, err := vgproto.Marshal(&ref) - if err != nil { - return "", err +func (e *Engine) bridgeViewForChainID(chainID string) (ERC20BridgeView, error) { + switch chainID { + case e.primaryEthChainID: + return e.primaryBridgeView, nil + case e.secondaryEthChainID: + return e.secondaryBridgeView, nil + default: + return nil, fmt.Errorf("chain id %q is not supported", chainID) } +} - return hex.EncodeToString(crypto.Hash(buf)), nil +func (e *Engine) bridgeStateForChainID(chainID string) (*bridgeState, error) { + switch chainID { + case e.primaryEthChainID: + return e.primaryBridgeState, nil + case e.secondaryEthChainID: + return e.secondaryBridgeState, nil + default: + return nil, fmt.Errorf("chain id %q is not supported", chainID) + } } func newPendingState() *atomic.Uint32 { diff --git a/core/banking/engine_test.go b/core/banking/engine_test.go index dac65a2247..2fe7d63867 100644 --- a/core/banking/engine_test.go +++ b/core/banking/engine_test.go @@ -33,6 +33,7 @@ import ( "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) var testAsset = assets.NewAsset(builtin.New("VGT", &types.AssetDetails{ @@ -43,22 +44,23 @@ var testAsset = assets.NewAsset(builtin.New("VGT", &types.AssetDetails{ type testEngine struct { *banking.Engine ctrl *gomock.Controller - erc *fakeERC + witness *fakeWitness col *mocks.MockCollateral assets *mocks.MockAssets tsvc *mocks.MockTimeService top *mocks.MockTopology broker *bmocks.MockBroker epoch *mocks.MockEpochService - bridgeView *mocks.MockERC20BridgeView + primaryBridgeView *mocks.MockERC20BridgeView marketActivityTracker *mocks.MockMarketActivityTracker ethSource *mocks.MockEthereumEventSource + secondaryBridgeView *mocks.MockERC20BridgeView } func getTestEngine(t *testing.T) *testEngine { t.Helper() ctrl := gomock.NewController(t) - erc := &fakeERC{} + witness := &fakeWitness{} col := mocks.NewMockCollateral(ctrl) assets := mocks.NewMockAssets(ctrl) tsvc := mocks.NewMockTimeService(ctrl) @@ -66,27 +68,30 @@ func getTestEngine(t *testing.T) *testEngine { broker := bmocks.NewMockBroker(ctrl) top := mocks.NewMockTopology(ctrl) epoch := mocks.NewMockEpochService(ctrl) - bridgeView := mocks.NewMockERC20BridgeView(ctrl) + primaryBridgeView := mocks.NewMockERC20BridgeView(ctrl) + secondaryBridgeView := mocks.NewMockERC20BridgeView(ctrl) marketActivityTracker := mocks.NewMockMarketActivityTracker(ctrl) ethSource := mocks.NewMockEthereumEventSource(ctrl) notary.EXPECT().OfferSignatures(gomock.Any(), gomock.Any()).AnyTimes() epoch.EXPECT().NotifyOnEpoch(gomock.Any(), gomock.Any()).AnyTimes() - eng := banking.New(logging.NewTestLogger(), banking.NewDefaultConfig(), col, erc, tsvc, assets, notary, broker, top, marketActivityTracker, bridgeView, ethSource) + eng := banking.New(logging.NewTestLogger(), banking.NewDefaultConfig(), col, witness, tsvc, assets, notary, broker, top, marketActivityTracker, primaryBridgeView, secondaryBridgeView, ethSource, nil) - eng.OnMaxQuantumAmountUpdate(context.Background(), num.DecimalOne()) + require.NoError(t, eng.OnMaxQuantumAmountUpdate(context.Background(), num.DecimalOne())) + eng.OnPrimaryEthChainIDUpdated("1") return &testEngine{ Engine: eng, ctrl: ctrl, - erc: erc, + witness: witness, col: col, assets: assets, tsvc: tsvc, broker: broker, top: top, epoch: epoch, - bridgeView: bridgeView, + primaryBridgeView: primaryBridgeView, + secondaryBridgeView: secondaryBridgeView, marketActivityTracker: marketActivityTracker, ethSource: ethSource, } @@ -103,7 +108,6 @@ func TestBanking(t *testing.T) { func testDepositSuccess(t *testing.T) { eng := getTestEngine(t) - eng.tsvc.EXPECT().GetTimeNow().Times(3) eng.broker.EXPECT().Send(gomock.Any()).AnyTimes() eng.assets.EXPECT().Get(gomock.Any()).Times(1).Return(testAsset, nil) eng.OnTick(context.Background(), time.Now()) @@ -113,31 +117,29 @@ func testDepositSuccess(t *testing.T) { Amount: num.NewUint(42), } - eng.tsvc.EXPECT().GetTimeNow().Times(2) - // 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) - // then we call the callback from the fake erc - eng.erc.r.Check(context.Background()) - eng.erc.f(eng.erc.r, true) + // then we call the callback from the fake witness + eng.witness.r.Check(context.Background()) + eng.witness.f(eng.witness.r, true) // then we call time update, which should call the collateral to // to do the deposit eng.col.EXPECT().Deposit(gomock.Any(), bad.PartyID, bad.VegaAssetID, bad.Amount).Times(1).Return(&types.LedgerMovement{}, nil) - eng.tsvc.EXPECT().GetTimeNow().Times(2) eng.OnTick(context.Background(), time.Now()) } func testDepositSuccessNoTxDuplicate(t *testing.T) { eng := getTestEngine(t) - eng.tsvc.EXPECT().GetTimeNow().Times(6) eng.broker.EXPECT().Send(gomock.Any()).AnyTimes() eng.assets.EXPECT().Get(gomock.Any()).Times(2).Return(testAsset, nil) eng.OnTick(context.Background(), time.Now()) + bad := &types.BuiltinAssetDeposit{ VegaAssetID: "VGT", PartyID: "someparty", @@ -145,40 +147,37 @@ func testDepositSuccessNoTxDuplicate(t *testing.T) { } // call the deposit function - err := eng.DepositBuiltinAsset(context.Background(), bad, "depositid", 42) - assert.NoError(t, err) + 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 erc - eng.erc.r.Check(context.Background()) - eng.erc.f(eng.erc.r, true) + // then we call the callback from the fake witness + eng.witness.r.Check(context.Background()) + eng.witness.f(eng.witness.r, true) // then we call time update, which should call the collateral to // to do the deposit eng.col.EXPECT().Deposit(gomock.Any(), bad.PartyID, bad.VegaAssetID, bad.Amount).Times(1).Return(&types.LedgerMovement{}, nil) - eng.tsvc.EXPECT().GetTimeNow().Times(4) eng.OnTick(context.Background(), time.Now()) // call the deposit function - err = eng.DepositBuiltinAsset(context.Background(), bad, "depositid2", 43) - assert.NoError(t, err) + 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 erc - eng.erc.r.Check(context.Background()) - eng.erc.f(eng.erc.r, true) + // then we call the callback from the fake witness + eng.witness.r.Check(context.Background()) + eng.witness.f(eng.witness.r, true) // then we call time update, which should call the collateral to // to do the deposit eng.col.EXPECT().Deposit(gomock.Any(), bad.PartyID, bad.VegaAssetID, bad.Amount).Times(1).Return(&types.LedgerMovement{}, nil) - eng.tsvc.EXPECT().GetTimeNow().Times(2) eng.OnTick(context.Background(), time.Now()) } func testDepositFailure(t *testing.T) { eng := getTestEngine(t) - eng.tsvc.EXPECT().GetTimeNow().Times(5) eng.broker.EXPECT().Send(gomock.Any()).AnyTimes() eng.assets.EXPECT().Get(gomock.Any()).Times(1).Return(testAsset, nil) eng.OnTick(context.Background(), time.Now()) @@ -189,22 +188,21 @@ 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) - // then we call the callback from the fake erc - eng.erc.r.Check(context.Background()) - eng.erc.f(eng.erc.r, false) + // then we call the callback from the fake witness + eng.witness.r.Check(context.Background()) + eng.witness.f(eng.witness.r, false) // then we call time update, expect collateral to never be called - eng.tsvc.EXPECT().GetTimeNow().Times(1) eng.OnTick(context.Background(), time.Now()) } func testDepositError(t *testing.T) { eng := getTestEngine(t) - eng.tsvc.EXPECT().GetTimeNow().Times(4) eng.broker.EXPECT().Send(gomock.Any()).Times(1) eng.assets.EXPECT().Get(gomock.Any()).Times(1).Return(testAsset, nil) eng.OnTick(context.Background(), time.Now()) @@ -214,11 +212,12 @@ func testDepositError(t *testing.T) { Amount: num.NewUint(42), } - // set an error to be return by the fake erc + // set an error to be return by the fake witness expectError := errors.New("bad bad bad") - eng.erc.err = expectError + 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()) } @@ -226,7 +225,6 @@ func testDepositError(t *testing.T) { func testDepositFailureNotBuiltin(t *testing.T) { eng := getTestEngine(t) - eng.tsvc.EXPECT().GetTimeNow().Times(3) eng.broker.EXPECT().Send(gomock.Any()).AnyTimes() expectError := errors.New("bad bad bad") eng.assets.EXPECT().Get(gomock.Any()).Times(1).Return(nil, expectError) @@ -238,11 +236,12 @@ 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()) } -type fakeERC struct { +type fakeWitness struct { r validators.Resource f func(interface{}, bool) t time.Time @@ -250,14 +249,14 @@ type fakeERC struct { err error } -func (f *fakeERC) StartCheck(r validators.Resource, fn func(interface{}, bool), t time.Time) error { +func (f *fakeWitness) StartCheck(r validators.Resource, fn func(interface{}, bool), t time.Time) error { f.r = r f.f = fn f.t = t return f.err } -func (f *fakeERC) RestoreResource(r validators.Resource, fn func(interface{}, bool)) error { +func (f *fakeWitness) RestoreResource(r validators.Resource, fn func(interface{}, bool)) error { f.r = r f.f = fn return nil diff --git a/core/banking/erc20.go b/core/banking/erc20.go index c1855fe626..cff3d6f725 100644 --- a/core/banking/erc20.go +++ b/core/banking/erc20.go @@ -33,7 +33,7 @@ var ( ErrInvalidWithdrawalReferenceNonce = errors.New("invalid withdrawal reference nonce") ErrWithdrawalAmountUnderMinimalRequired = errors.New("invalid withdrawal, amount under minimum required") ErrAssetAlreadyBeingListed = errors.New("asset already being listed") - ErrWithdrawalDisabledWhenBridgeIsStopped = errors.New("withdrawal issuance is disabled when the erc20 is stopped") + ErrWithdrawalDisabledWhenBridgeIsStopped = errors.New("cannot issue withdrawals when the bridge is stopped") ) type ERC20BridgeView interface { @@ -49,14 +49,19 @@ func (e *Engine) EnableERC20( al *types.ERC20AssetList, id string, blockNumber, txIndex uint64, - txHash string, + txHash, chainID string, ) error { asset, _ := e.assets.Get(al.VegaAssetID) - if _, ok := e.assetActs[al.VegaAssetID]; ok { + if _, ok := e.assetActions[al.VegaAssetID]; ok { e.log.Error("asset already being listed", logging.AssetID(al.VegaAssetID)) return ErrAssetAlreadyBeingListed } + bridgeView, err := e.bridgeViewForChainID(chainID) + if err != nil { + return err + } + aa := &assetAction{ id: id, state: newPendingState(), @@ -65,7 +70,8 @@ func (e *Engine) EnableERC20( blockHeight: blockNumber, logIndex: txIndex, txHash: txHash, - bridgeView: e.bridgeView, + chainID: chainID, + bridgeView: bridgeView, } e.addAction(aa) return e.witness.StartCheck(aa, e.onCheckDone, e.timeService.GetTimeNow().Add(defaultValidationDuration)) @@ -76,7 +82,7 @@ func (e *Engine) UpdateERC20( event *types.ERC20AssetLimitsUpdated, id string, blockNumber, txIndex uint64, - txHash string, + txHash, chainID string, ) error { asset, err := e.assets.Get(event.VegaAssetID) if err != nil { @@ -84,6 +90,12 @@ func (e *Engine) UpdateERC20( logging.AssetID(event.VegaAssetID), ) } + + bridgeView, err := e.bridgeViewForChainID(chainID) + if err != nil { + return err + } + aa := &assetAction{ id: id, state: newPendingState(), @@ -92,7 +104,8 @@ func (e *Engine) UpdateERC20( blockHeight: blockNumber, logIndex: txIndex, txHash: txHash, - bridgeView: e.bridgeView, + chainID: chainID, + bridgeView: bridgeView, } e.addAction(aa) return e.witness.StartCheck(aa, e.onCheckDone, e.timeService.GetTimeNow().Add(defaultValidationDuration)) @@ -103,7 +116,7 @@ func (e *Engine) DepositERC20( d *types.ERC20Deposit, id string, blockNumber, logIndex uint64, - txHash string, + txHash, chainID string, ) error { dep := e.newDeposit(id, d.TargetPartyID, d.VegaAssetID, d.Amount, txHash) @@ -124,6 +137,11 @@ func (e *Engine) DepositERC20( return fmt.Errorf("%v: %w", asset.String(), ErrWrongAssetTypeUsedInERC20ChainEvent) } + bridgeView, err := e.bridgeViewForChainID(chainID) + if err != nil { + return err + } + aa := &assetAction{ id: dep.ID, state: newPendingState(), @@ -132,7 +150,8 @@ func (e *Engine) DepositERC20( blockHeight: blockNumber, logIndex: logIndex, txHash: txHash, - bridgeView: e.bridgeView, + chainID: chainID, + bridgeView: bridgeView, } e.addAction(aa) e.deposits[dep.ID] = dep @@ -141,11 +160,7 @@ func (e *Engine) DepositERC20( return e.witness.StartCheck(aa, e.onCheckDone, e.timeService.GetTimeNow().Add(defaultValidationDuration)) } -func (e *Engine) ERC20WithdrawalEvent( - ctx context.Context, w *types.ERC20Withdrawal, - blockNumber, txIndex uint64, - txHash string, -) error { +func (e *Engine) ERC20WithdrawalEvent(ctx context.Context, w *types.ERC20Withdrawal, blockNumber uint64, txHash string, chainID string) error { // check straight away if the withdrawal is signed nonce, ok := new(big.Int).SetString(w.ReferenceNonce, 10) if !ok { @@ -163,8 +178,10 @@ func (e *Engine) ERC20WithdrawalEvent( return ErrWithdrawalNotReady } - if blockNumber > e.lastSeenEthBlock { - e.lastSeenEthBlock = blockNumber + if e.primaryEthChainID == chainID && blockNumber > e.lastSeenPrimaryEthBlock { + e.lastSeenPrimaryEthBlock = blockNumber + } else if e.secondaryEthChainID == chainID && blockNumber > e.lastSeenSecondaryEthBlock { + e.lastSeenSecondaryEthBlock = blockNumber } withd.WithdrawalDate = e.timeService.GetTimeNow().UnixNano() withd.TxHash = txHash @@ -179,7 +196,25 @@ func (e *Engine) WithdrawERC20( amount *num.Uint, ext *types.Erc20WithdrawExt, ) error { - if e.bridgeState.IsStopped() { + asset, err := e.assets.Get(assetID) + if err != nil { + e.log.Debug("unable to get asset by id", + logging.AssetID(assetID), + logging.Error(err)) + return err + } + + if !asset.IsERC20() { + return fmt.Errorf("asset %q is not an ERC20 token: %w", assetID, err) + } + + erc20Token, _ := asset.ERC20() + bridgeState, err := e.bridgeStateForChainID(erc20Token.ChainID()) + if err != nil { + return err + } + + if bridgeState.IsStopped() { return ErrWithdrawalDisabledWhenBridgeIsStopped } @@ -190,18 +225,9 @@ func (e *Engine) WithdrawERC20( } w, ref := e.newWithdrawal(id, party, assetID, amount, wext) - e.broker.Send(events.NewWithdrawalEvent(ctx, *w)) - e.withdrawals[w.ID] = withdrawalRef{w, ref} - asset, err := e.assets.Get(assetID) - if err != nil { - w.Status = types.WithdrawalStatusRejected - e.broker.Send(events.NewWithdrawalEvent(ctx, *w)) - e.log.Debug("unable to get asset by id", - logging.AssetID(assetID), - logging.Error(err)) - return err - } + e.broker.Send(events.NewWithdrawalEvent(ctx, *w)) + e.withdrawals[w.ID] = withdrawalRef{w: w, ref: ref} // check for minimal amount reached quantum := asset.Type().Details.Quantum @@ -321,8 +347,10 @@ func (e *Engine) offerERC20NotarySignatures(resource string) []byte { } func (e *Engine) addAction(aa *assetAction) { - e.assetActs[aa.id] = aa - if aa.blockHeight > e.lastSeenEthBlock { - e.lastSeenEthBlock = aa.blockHeight + 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/gov_transfers.go b/core/banking/gov_transfers.go index 1b54a3ba25..a647aed7a9 100644 --- a/core/banking/gov_transfers.go +++ b/core/banking/gov_transfers.go @@ -20,6 +20,7 @@ import ( "encoding/hex" "errors" "fmt" + "time" "code.vegaprotocol.io/vega/core/events" "code.vegaprotocol.io/vega/core/types" @@ -51,12 +52,12 @@ var ( types.AccountTypeRelativeReturnReward: {}, types.AccountTypeReturnVolatilityReward: {}, types.AccountTypeValidatorRankingReward: {}, + types.AccountTypeRealisedReturnReward: {}, } ) -func (e *Engine) distributeScheduledGovernanceTransfers(ctx context.Context) { +func (e *Engine) distributeScheduledGovernanceTransfers(ctx context.Context, now time.Time) { timepoints := []int64{} - now := e.timeService.GetTimeNow() for k := range e.scheduledGovernanceTransfers { if now.UnixNano() >= k { timepoints = append(timepoints, k) @@ -91,6 +92,12 @@ func (e *Engine) distributeRecurringGovernanceTransfers(ctx context.Context) { continue } + if gTransfer.Config.RecurringTransferConfig.DispatchStrategy != nil && gTransfer.Config.RecurringTransferConfig.DispatchStrategy.TransferInterval != nil && + ((e.currentEpoch-gTransfer.Config.RecurringTransferConfig.StartEpoch+1) < uint64(*gTransfer.Config.RecurringTransferConfig.DispatchStrategy.TransferInterval) || + (e.currentEpoch-gTransfer.Config.RecurringTransferConfig.StartEpoch+1)%uint64(*gTransfer.Config.RecurringTransferConfig.DispatchStrategy.TransferInterval) != 0) { + continue + } + amount, err := e.processGovernanceTransfer(ctx, gTransfer) e.log.Info("processed transfer", logging.String("amount", amount.String())) diff --git a/core/banking/oneoff_transfers.go b/core/banking/oneoff_transfers.go index f9326b7d5c..43695cb442 100644 --- a/core/banking/oneoff_transfers.go +++ b/core/banking/oneoff_transfers.go @@ -112,11 +112,10 @@ type timesToTransfers struct { transfer []scheduledTransfer } -func (e *Engine) distributeScheduledTransfers(ctx context.Context) error { +func (e *Engine) distributeScheduledTransfers(ctx context.Context, now time.Time) error { ttfs := []timesToTransfers{} // iterate over those scheduled transfers to sort them by time - now := e.timeService.GetTimeNow() for k, v := range e.scheduledTransfers { if now.UnixNano() >= k { ttfs = append(ttfs, timesToTransfers{k, v}) diff --git a/core/banking/oneoff_transfers_test.go b/core/banking/oneoff_transfers_test.go index eb80aa4f7f..91b204a9b0 100644 --- a/core/banking/oneoff_transfers_test.go +++ b/core/banking/oneoff_transfers_test.go @@ -365,12 +365,6 @@ func testValidOneOffTransferWithDeliverOnInThePastStraightAway(t *testing.T) { func testValidOneOffTransferWithDeliverOn(t *testing.T) { e := getTestEngine(t) - // Time given to OnTick call - base time Unix(10, 0) - e.tsvc.EXPECT().GetTimeNow().DoAndReturn( - func() time.Time { - return time.Unix(10, 0) - }).Times(2) - // let's do a massive fee, easy to test e.OnTransferFeeFactorUpdate(context.Background(), num.NewDecimalFromFloat(1)) e.OnTick(context.Background(), time.Unix(10, 0)) @@ -398,10 +392,7 @@ func testValidOneOffTransferWithDeliverOn(t *testing.T) { } // Time given to e.Transferfunds - base time Unix(10,0) - e.tsvc.EXPECT().GetTimeNow().DoAndReturn( - func() time.Time { - return time.Unix(10, 0) - }).Times(2) + 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) @@ -445,20 +436,8 @@ func testValidOneOffTransferWithDeliverOn(t *testing.T) { e.broker.EXPECT().Send(gomock.Any()).Times(3) assert.NoError(t, e.TransferFunds(ctx, transfer)) - // Run OnTick with time.Unix(11, 0) and expect nothing. - e.tsvc.EXPECT().GetTimeNow().DoAndReturn( - func() time.Time { - return time.Unix(11, 0) - }).Times(2) - e.OnTick(context.Background(), time.Unix(11, 0)) - // Give time to trigger transfers. - e.tsvc.EXPECT().GetTimeNow().DoAndReturn( - func() time.Time { - return time.Unix(12, 0) - }).Times(2) - // assert the calculation of fees and transfer request are correct e.broker.EXPECT().Send(gomock.Any()).AnyTimes() e.col.EXPECT().TransferFunds(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(1).DoAndReturn( diff --git a/core/banking/recurring_transfers.go b/core/banking/recurring_transfers.go index 6b8414bf05..a0b80ac19d 100644 --- a/core/banking/recurring_transfers.go +++ b/core/banking/recurring_transfers.go @@ -156,21 +156,13 @@ func (e *Engine) cleanupStaleDispatchStrategies() { } } -func compareStringSlices(a, b []string) bool { - if len(a) != len(b) { - return false - } - for i, v := range a { - if v != b[i] { - return false - } - } - return true -} - func isSimilar(dispatchStrategy1, dispatchStrategy2 *vegapb.DispatchStrategy) bool { - return (dispatchStrategy1 == nil && dispatchStrategy2 == nil) || - (dispatchStrategy1 != nil && dispatchStrategy2 != nil && dispatchStrategy1.AssetForMetric == dispatchStrategy2.AssetForMetric && dispatchStrategy1.Metric == dispatchStrategy2.Metric && compareStringSlices(dispatchStrategy1.Markets, dispatchStrategy2.Markets)) + p1, _ := proto.Marshal(dispatchStrategy1) + hash1 := hex.EncodeToString(crypto.Hash(p1)) + + p2, _ := proto.Marshal(dispatchStrategy2) + hash2 := hex.EncodeToString(crypto.Hash(p2)) + return hash1 == hash2 } func (e *Engine) ensureNoRecurringTransferDuplicates( @@ -199,9 +191,18 @@ func (e *Engine) dispatchRequired(ctx context.Context, ds *vegapb.DispatchStrate vegapb.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED, vegapb.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, vegapb.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, - vegapb.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY: + vegapb.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, + vegapb.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN: if ds.EntityScope == vegapb.EntityScope_ENTITY_SCOPE_INDIVIDUALS { - return len(e.marketActivityTracker.CalculateMetricForIndividuals(ctx, ds)) > 0 + hasNonZeroMetric := false + partyMetrics := e.marketActivityTracker.CalculateMetricForIndividuals(ctx, ds) + for _, pm := range partyMetrics { + if !pm.Score.IsZero() { + hasNonZeroMetric = true + break + } + } + return hasNonZeroMetric || (len(partyMetrics) > 0 && ds.DistributionStrategy == vegapb.DistributionStrategy_DISTRIBUTION_STRATEGY_RANK) } else { tcs, _ := e.marketActivityTracker.CalculateMetricForTeams(ctx, ds) return len(tcs) > 0 @@ -227,6 +228,12 @@ func (e *Engine) distributeRecurringTransfers(ctx context.Context, newEpoch uint 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) { + continue + } + var ( startEpoch = num.NewUint(v.StartEpoch).ToDecimal() startAmount = v.Amount.ToDecimal() diff --git a/core/banking/snapshot.go b/core/banking/snapshot.go index 81d01f051d..fe7cb5aa94 100644 --- a/core/banking/snapshot.go +++ b/core/banking/snapshot.go @@ -17,6 +17,7 @@ package banking import ( "context" + "fmt" "math/big" "sort" @@ -37,7 +38,8 @@ var ( assetActionsKey = (&types.PayloadBankingAssetActions{}).Key() recurringTransfersKey = (&types.PayloadBankingRecurringTransfers{}).Key() scheduledTransfersKey = (&types.PayloadBankingScheduledTransfers{}).Key() - bridgeStateKey = (&types.PayloadBankingBridgeState{}).Key() + primaryBridgeStateKey = (&types.PayloadBankingPrimaryBridgeState{}).Key() + secondaryBridgeStateKey = (&types.PayloadBankingEVMBridgeStates{}).Key() recurringGovTransfersKey = (&types.PayloadBankingRecurringGovernanceTransfers{}).Key() scheduledGovTransfersKey = (&types.PayloadBankingScheduledGovernanceTransfers{}).Key() transferFeeDiscountsKey = (&types.PayloadBankingTransferFeeDiscounts{}).Key() @@ -49,7 +51,8 @@ var ( assetActionsKey, recurringTransfersKey, scheduledTransfersKey, - bridgeStateKey, + primaryBridgeStateKey, + secondaryBridgeStateKey, recurringGovTransfersKey, scheduledGovTransfersKey, transferFeeDiscountsKey, @@ -63,7 +66,8 @@ type bankingSnapshotState struct { serialisedAssetActions []byte serialisedRecurringTransfers []byte serialisedScheduledTransfers []byte - serialisedBridgeState []byte + serialisedPrimaryBridgeState []byte + serialisedSecondaryBridgeState []byte serialisedGovRecurringTransfers []byte serialisedGovScheduledTransfers []byte serialisedTransferFeeDiscounts []byte @@ -81,17 +85,34 @@ func (e *Engine) Stopped() bool { return false } -func (e *Engine) serialiseBridgeState() ([]byte, error) { +func (e *Engine) serialisePrimaryBridgeState() ([]byte, error) { payload := types.Payload{ - Data: &types.PayloadBankingBridgeState{ + Data: &types.PayloadBankingPrimaryBridgeState{ BankingBridgeState: &types.BankingBridgeState{ - Active: e.bridgeState.active, - BlockHeight: e.bridgeState.block, - LogIndex: e.bridgeState.logIndex, + Active: e.primaryBridgeState.active, + BlockHeight: e.primaryBridgeState.block, + LogIndex: e.primaryBridgeState.logIndex, + ChainID: e.primaryEthChainID, }, }, } + return proto.Marshal(payload.IntoProto()) +} +func (e *Engine) serialiseSecondaryBridgeState() ([]byte, error) { + payload := types.Payload{ + Data: &types.PayloadBankingEVMBridgeStates{ + // we only have one bridge state atm, its easy + BankingBridgeStates: []*checkpoint.BridgeState{ + { + Active: e.secondaryBridgeState.active, + BlockHeight: e.secondaryBridgeState.block, + LogIndex: e.secondaryBridgeState.logIndex, + ChainId: e.secondaryEthChainID, + }, + }, + }, + } return proto.Marshal(payload.IntoProto()) } @@ -195,11 +216,12 @@ func (e *Engine) serialiseWithdrawals() ([]byte, error) { func (e *Engine) serialiseSeen() ([]byte, error) { seen := &types.PayloadBankingSeen{ BankingSeen: &types.BankingSeen{ - LastSeenEthBlock: e.lastSeenEthBlock, + LastSeenPrimaryEthBlock: e.lastSeenPrimaryEthBlock, + LastSeenSecondaryEthBlock: e.lastSeenSecondaryEthBlock, }, } - seen.BankingSeen.Refs = make([]string, 0, e.seen.Size()) - iter := e.seen.Iterator() + seen.BankingSeen.Refs = make([]string, 0, e.seenAssetActions.Size()) + iter := e.seenAssetActions.Iterator() for iter.Next() { seen.BankingSeen.Refs = append(seen.BankingSeen.Refs, iter.Value().(string)) } @@ -263,8 +285,10 @@ func (e *Engine) serialise(k string) ([]byte, error) { return e.serialiseK(e.serialiseScheduledGovernanceTransfers, &e.bss.serialisedGovScheduledTransfers) case transferFeeDiscountsKey: return e.serialiseK(e.serialisedTransferFeeDiscounts, &e.bss.serialisedTransferFeeDiscounts) - case bridgeStateKey: - return e.serialiseK(e.serialiseBridgeState, &e.bss.serialisedBridgeState) + case primaryBridgeStateKey: + return e.serialiseK(e.serialisePrimaryBridgeState, &e.bss.serialisedPrimaryBridgeState) + case secondaryBridgeStateKey: + return e.serialiseK(e.serialiseSecondaryBridgeState, &e.bss.serialisedSecondaryBridgeState) default: return nil, types.ErrSnapshotKeyDoesNotExist } @@ -297,8 +321,10 @@ func (e *Engine) LoadState(ctx context.Context, p *types.Payload) ([]types.State return nil, e.restoreRecurringGovernanceTransfers(ctx, pl.BankingRecurringGovernanceTransfers, p) case *types.PayloadBankingScheduledGovernanceTransfers: return nil, e.restoreScheduledGovernanceTransfers(ctx, pl.BankingScheduledGovernanceTransfers, p) - case *types.PayloadBankingBridgeState: - return nil, e.restoreBridgeState(pl.BankingBridgeState, p) + case *types.PayloadBankingPrimaryBridgeState: + return nil, e.restorePrimaryBridgeState(pl.BankingBridgeState, p) + case *types.PayloadBankingEVMBridgeStates: + return nil, e.restoreSecondaryBridgeState(pl.BankingBridgeStates, p) case *types.PayloadBankingTransferFeeDiscounts: return nil, e.restoreTransferFeeDiscounts(pl.BankingTransferFeeDiscounts, p) default: @@ -341,16 +367,29 @@ func (e *Engine) restoreScheduledGovernanceTransfers(ctx context.Context, transf return err } -func (e *Engine) restoreBridgeState(state *types.BankingBridgeState, p *types.Payload) (err error) { +func (e *Engine) restorePrimaryBridgeState(state *types.BankingBridgeState, p *types.Payload) (err error) { if state != nil { - e.bridgeState = &bridgeState{ + e.primaryBridgeState = &bridgeState{ active: state.Active, block: state.BlockHeight, logIndex: state.LogIndex, } } - e.bss.serialisedBridgeState, err = proto.Marshal(p.IntoProto()) + e.bss.serialisedPrimaryBridgeState, err = proto.Marshal(p.IntoProto()) + return +} + +func (e *Engine) restoreSecondaryBridgeState(state []*checkpoint.BridgeState, p *types.Payload) (err error) { + if state != nil { + e.secondaryBridgeState = &bridgeState{ + active: state[0].Active, + block: state[0].BlockHeight, + logIndex: state[0].LogIndex, + } + } + + e.bss.serialisedSecondaryBridgeState, err = proto.Marshal(p.IntoProto()) return } @@ -385,11 +424,12 @@ func (e *Engine) restoreWithdrawals(withdrawals *types.BankingWithdrawals, p *ty func (e *Engine) restoreSeen(seen *types.BankingSeen, p *types.Payload) error { var err error e.log.Info("restoring seen", logging.Int("n", len(seen.Refs))) - e.seen = treeset.NewWithStringComparator() + e.seenAssetActions = treeset.NewWithStringComparator() for _, v := range seen.Refs { - e.seen.Add(v) + e.seenAssetActions.Add(v) } - e.lastSeenEthBlock = seen.LastSeenEthBlock + e.lastSeenPrimaryEthBlock = seen.LastSeenPrimaryEthBlock + e.lastSeenSecondaryEthBlock = seen.LastSeenSecondaryEthBlock e.bss.serialisedSeen, err = proto.Marshal(p.IntoProto()) return err } @@ -397,8 +437,11 @@ func (e *Engine) restoreSeen(seen *types.BankingSeen, p *types.Payload) error { func (e *Engine) restoreAssetActions(aa *types.BankingAssetActions, p *types.Payload) error { var err error - e.loadAssetActions(aa.AssetAction) - for _, aa := range e.assetActs { + if err := e.loadAssetActions(aa.AssetAction); err != nil { + return fmt.Errorf("could not load asset actions: %w", err) + } + + for _, aa := range e.assetActions { if err := e.witness.RestoreResource(aa, e.onCheckDone); err != nil { e.log.Panic("unable to restore witness resource", logging.String("id", aa.id), logging.Error(err)) } @@ -426,15 +469,20 @@ func (e *Engine) restoreTransferFeeDiscounts( return } -func (e *Engine) OnEpochRestore(ctx context.Context, ep types.Epoch) { +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(ctx context.Context) error { - if e.lastSeenEthBlock != 0 { - e.log.Info("restoring collateral bridge starting block", logging.Uint64("block", e.lastSeenEthBlock)) - e.ethEventSource.UpdateCollateralStartingBlock(e.lastSeenEthBlock) +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 040c7410b0..e6119fe6f5 100644 --- a/core/banking/snapshot_test.go +++ b/core/banking/snapshot_test.go @@ -320,12 +320,12 @@ func TestSeenSnapshotRoundTrip(t *testing.T) { d1 := deposit(eng, "VGT1", "someparty1", num.NewUint(42)) err = eng.DepositBuiltinAsset(context.Background(), d1, "depositid1", 42) assert.NoError(t, err) - eng.erc.f(eng.erc.r, true) + eng.witness.f(eng.witness.r, true) d2 := deposit(eng, "VGT2", "someparty2", num.NewUint(24)) err = eng.DepositBuiltinAsset(context.Background(), d2, "depositid2", 24) assert.NoError(t, err) - eng.erc.f(eng.erc.r, true) + eng.witness.f(eng.witness.r, true) eng.OnTick(context.Background(), time.Now()) state2, _, err := eng.GetState(seenKey) @@ -434,19 +434,13 @@ func TestOneOffTransfersSnapshotRoundTrip(t *testing.T) { key := (&types.PayloadBankingScheduledTransfers{}).Key() eng := getTestEngine(t) + state, _, err := eng.GetState(key) + require.Nil(t, err) + fromAcc := types.Account{ Balance: num.NewUint(1000), } - eng.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) - eng.tsvc.EXPECT().GetTimeNow().Times(4) - 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() - - state, _, err := eng.GetState(key) - require.Nil(t, err) - now := time.Unix(1111, 0) deliver := now.Add(time.Hour) eng.OnTick(ctx, now) @@ -467,6 +461,11 @@ 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)) // test the new transfer prompts a change @@ -561,12 +560,7 @@ func TestRecurringGovTransfersSnapshotRoundTrip(t *testing.T) { ctx := context.Background() key := (&types.PayloadBankingRecurringGovernanceTransfers{}).Key() e := getTestEngine(t) - - e.tsvc.EXPECT().GetTimeNow().DoAndReturn( - func() time.Time { - return time.Unix(10, 0) - }).Times(3) - e.OnTransferFeeFactorUpdate(context.Background(), num.NewDecimalFromFloat(1)) + require.NoError(t, e.OnTransferFeeFactorUpdate(context.Background(), num.NewDecimalFromFloat(1))) e.OnTick(ctx, time.Unix(10, 0)) e.OnEpoch(ctx, types.Epoch{Seq: 1, StartTime: time.Unix(10, 0), Action: vega.EpochAction_EPOCH_ACTION_START}) @@ -602,6 +596,7 @@ 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 @@ -675,7 +670,7 @@ func TestAssetListRoundTrip(t *testing.T) { eng := getTestEngine(t) eng.tsvc.EXPECT().GetTimeNow().AnyTimes() eng.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) - require.NoError(t, eng.EnableERC20(ctx, &types.ERC20AssetList{}, "03ae90688632c649c4beab6040ff5bd04dbde8efbf737d8673bbda792a110301", 1000, 1000, "03ae90688632c649c4beab6040ff5bd04dbde8efbf737d8673bbda792a110301")) + require.NoError(t, eng.EnableERC20(ctx, &types.ERC20AssetList{}, "03ae90688632c649c4beab6040ff5bd04dbde8efbf737d8673bbda792a110301", 1000, 1000, "03ae90688632c649c4beab6040ff5bd04dbde8efbf737d8673bbda792a110301", "1")) state, _, err := eng.GetState(key) require.Nil(t, err) diff --git a/core/bridges/erc20_asset_pool.go b/core/bridges/erc20_asset_pool.go index 33ea07f7d9..90e52207f1 100644 --- a/core/bridges/erc20_asset_pool.go +++ b/core/bridges/erc20_asset_pool.go @@ -27,12 +27,16 @@ import ( type ERC20AssetPool struct { signer Signer poolAddr string + chainID string + v1 bool } -func NewERC20AssetPool(signer Signer, poolAddr string) *ERC20AssetPool { +func NewERC20AssetPool(signer Signer, poolAddr, chainID string, v1 bool) *ERC20AssetPool { return &ERC20AssetPool{ signer: signer, poolAddr: poolAddr, + chainID: chainID, + v1: v1, } } @@ -76,7 +80,7 @@ func (e ERC20AssetPool) SetBridgeAddress( return nil, fmt.Errorf("couldn't pack abi message: %w", err) } - msg, err := packBufAndSubmitter(buf, e.poolAddr) + msg, err := packScheme(buf, e.poolAddr, e.chainID, e.v1) if err != nil { return nil, fmt.Errorf("couldn't pack abi message: %w", err) } @@ -124,7 +128,7 @@ func (e ERC20AssetPool) SetMultiSigControl( return nil, fmt.Errorf("couldn't pack abi message: %w", err) } - msg, err := packBufAndSubmitter(buf, e.poolAddr) + msg, err := packScheme(buf, e.poolAddr, e.chainID, e.v1) if err != nil { return nil, fmt.Errorf("couldn't pack abi message: %w", err) } diff --git a/core/bridges/erc20_asset_pool_test.go b/core/bridges/erc20_asset_pool_test.go index 9885c036da..d93162c5b7 100644 --- a/core/bridges/erc20_asset_pool_test.go +++ b/core/bridges/erc20_asset_pool_test.go @@ -29,19 +29,37 @@ const ( ) func TestAssetPoolSetBridgeAddress(t *testing.T) { - signer := testSigner{} - pool := bridges.NewERC20AssetPool(signer, erc20AssetPool) - sig, err := pool.SetBridgeAddress( - erc20AssetAddr, - num.NewUint(42), - ) - - assert.NoError(t, err) - assert.NotNil(t, sig.Message) - assert.NotNil(t, sig.Signature) - assert.True(t, signer.Verify(sig.Message, sig.Signature)) - assert.Equal(t, - "2488c05dd36a754db037f22a1d649109573e299a3c135efdb81c6f64632b26101c0b4ce19c896d370abae8d457682b21a4a3322f48380f29932b311b6ab47707", - sig.Signature.Hex(), - ) + tcs := []struct { + name string + v1 bool + expected string + }{ + { + name: "v1 scheme", + v1: true, + expected: "2488c05dd36a754db037f22a1d649109573e299a3c135efdb81c6f64632b26101c0b4ce19c896d370abae8d457682b21a4a3322f48380f29932b311b6ab47707", + }, + { + name: "v2 scheme", + v1: false, + expected: "4b01dfa1a3b77ecc624f678805a74418862cbcb1e32b929e7dce7fbbfa73806ec1f5db1d40d28f4ebcb09d83f59815f04438142612ebc1683158a23c9fbf3a0c", + }, + } + + for _, tc := range tcs { + t.Run(tc.name, func(tt *testing.T) { + signer := testSigner{} + pool := bridges.NewERC20AssetPool(signer, erc20AssetPool, chainID, tc.v1) + sig, err := pool.SetBridgeAddress( + erc20AssetAddr, + num.NewUint(42), + ) + + assert.NoError(t, err) + assert.NotNil(t, sig.Message) + assert.NotNil(t, sig.Signature) + assert.True(t, signer.Verify(sig.Message, sig.Signature)) + assert.Equal(t, tc.expected, sig.Signature.Hex()) + }) + } } diff --git a/core/bridges/erc20_common.go b/core/bridges/erc20_common.go index a450fc684b..22417e1c78 100644 --- a/core/bridges/erc20_common.go +++ b/core/bridges/erc20_common.go @@ -16,16 +16,20 @@ package bridges import ( + "bytes" "encoding/hex" "fmt" "code.vegaprotocol.io/vega/core/nodewallets/eth/clef" + "code.vegaprotocol.io/vega/libs/num" "github.com/ethereum/go-ethereum/accounts/abi" ethcmn "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" ) +var prefix = []byte{0x19} + type Signer interface { Sign([]byte) ([]byte, error) Algo() string @@ -46,7 +50,18 @@ func (b Bytes) Hex() string { return hex.EncodeToString(b) } -func packBufAndSubmitter( +func packScheme( + buf []byte, submitter, chainID string, v1 bool, +) ([]byte, error) { + if v1 { + return packSchemeV1(buf, submitter) + } + return packSchemeV2(buf, submitter, chainID) +} + +// packSchemeV1 returns the payload to be hashed and signed where +// payload = abi.encode(message, msg.sender). +func packSchemeV1( buf []byte, submitter string, ) ([]byte, error) { typBytes, err := abi.NewType("bytes", "", nil) @@ -73,6 +88,44 @@ func packBufAndSubmitter( return args2.Pack(buf, submitterAddr) } +// packSchemeV2 returns the payload to be hashed and signed where +// payload = abi.encodePacked(bytes1(0x19), block.chainid, abi.encode(message, msg.sender)) +// where abi.encodePacked is the concatenation of the individual byte slices. +func packSchemeV2( + buf []byte, submitter, chainID string, +) ([]byte, error) { + typBytes, err := abi.NewType("bytes", "", nil) + if err != nil { + return nil, err + } + typAddr, err := abi.NewType("address", "", nil) + if err != nil { + return nil, err + } + + submitterAddr := ethcmn.HexToAddress(submitter) + args := abi.Arguments([]abi.Argument{ + { + Name: "bytes", + Type: typBytes, + }, + { + Name: "address", + Type: typAddr, + }, + }) + + // abi.encode(message, msg.sender) + buf, err = args.Pack(buf, submitterAddr) + if err != nil { + return nil, err + } + + // concat(prefix, chain-id, abi.encode(message, msg.sender)) + cid := num.MustUintFromString(chainID, 10).Bytes() + return bytes.Join([][]byte{prefix, cid[:], buf}, nil), nil +} + func sign(signer Signer, msg []byte) (*SignaturePayload, error) { var sig []byte var err error diff --git a/core/bridges/erc20_logic.go b/core/bridges/erc20_logic.go index abee596189..434aee3e0b 100644 --- a/core/bridges/erc20_logic.go +++ b/core/bridges/erc20_logic.go @@ -33,12 +33,16 @@ import ( type ERC20Logic struct { signer Signer bridgeAddr string + chainID string + v1 bool } -func NewERC20Logic(signer Signer, bridgeAddr string) *ERC20Logic { +func NewERC20Logic(signer Signer, bridgeAddr string, chainID string, v1 bool) *ERC20Logic { return &ERC20Logic{ signer: signer, bridgeAddr: bridgeAddr, + chainID: chainID, + v1: v1, } } @@ -109,7 +113,7 @@ func (e ERC20Logic) ListAsset( return nil, fmt.Errorf("couldn't pack abi message: %w", err) } - msg, err := packBufAndSubmitter(buf, e.bridgeAddr) + msg, err := packScheme(buf, e.bridgeAddr, e.chainID, e.v1) if err != nil { return nil, fmt.Errorf("couldn't pack abi message: %w", err) } @@ -184,7 +188,7 @@ func (e ERC20Logic) buildListAssetMessage( return nil, fmt.Errorf("couldn't pack abi message: %w", err) } - msg, err := packBufAndSubmitter(buf, e.bridgeAddr) + msg, err := packScheme(buf, e.bridgeAddr, e.chainID, e.v1) if err != nil { return nil, fmt.Errorf("couldn't pack abi message: %w", err) } @@ -268,7 +272,7 @@ func (e ERC20Logic) RemoveAsset( return nil, fmt.Errorf("couldn't pack abi message: %w", err) } - msg, err := packBufAndSubmitter(buf, e.bridgeAddr) + msg, err := packScheme(buf, e.bridgeAddr, e.chainID, e.v1) if err != nil { return nil, fmt.Errorf("couldn't pack abi message: %w", err) } @@ -356,7 +360,7 @@ func (e ERC20Logic) buildWithdrawAssetMessage( return nil, fmt.Errorf("couldn't pack abi message: %w", err) } - return packBufAndSubmitter(buf, e.bridgeAddr) + return packScheme(buf, e.bridgeAddr, e.chainID, e.v1) } func (e ERC20Logic) VerifyWithdrawAsset( @@ -449,7 +453,7 @@ func (e ERC20Logic) SetAssetLimits( return nil, fmt.Errorf("couldn't pack abi message: %w", err) } - msg, err := packBufAndSubmitter(buf, e.bridgeAddr) + msg, err := packScheme(buf, e.bridgeAddr, e.chainID, e.v1) if err != nil { return nil, fmt.Errorf("couldn't pack abi message: %w", err) } @@ -511,7 +515,7 @@ func (e ERC20Logic) buildSetAssetLimitsMessage( return nil, fmt.Errorf("couldn't pack abi message: %w", err) } - msg, err := packBufAndSubmitter(buf, e.bridgeAddr) + msg, err := packScheme(buf, e.bridgeAddr, e.chainID, e.v1) if err != nil { return nil, fmt.Errorf("couldn't pack abi message: %w", err) } @@ -606,7 +610,7 @@ func (e ERC20Logic) buildWithdrawDelayMessage( return nil, fmt.Errorf("couldn't pack abi message: %w", err) } - return packBufAndSubmitter(buf, e.bridgeAddr) + return packScheme(buf, e.bridgeAddr, e.chainID, e.v1) } func (e ERC20Logic) VerifyWithdrawDelay( @@ -673,7 +677,7 @@ func (e ERC20Logic) GlobalStop( return nil, fmt.Errorf("couldn't pack abi message: %w", err) } - msg, err := packBufAndSubmitter(buf, e.bridgeAddr) + msg, err := packScheme(buf, e.bridgeAddr, e.chainID, e.v1) if err != nil { return nil, fmt.Errorf("couldn't pack abi message: %w", err) } @@ -712,7 +716,7 @@ func (e ERC20Logic) GlobalResume( return nil, fmt.Errorf("couldn't pack abi message: %w", err) } - msg, err := packBufAndSubmitter(buf, e.bridgeAddr) + msg, err := packScheme(buf, e.bridgeAddr, e.chainID, e.v1) if err != nil { return nil, fmt.Errorf("couldn't pack abi message: %w", err) } @@ -752,7 +756,7 @@ func (e ERC20Logic) VerifyGlobalResume( return nil, fmt.Errorf("couldn't pack abi message: %w", err) } - msg, err := packBufAndSubmitter(buf, e.bridgeAddr) + msg, err := packScheme(buf, e.bridgeAddr, e.chainID, e.v1) if err != nil { return nil, fmt.Errorf("couldn't pack abi message: %w", err) } diff --git a/core/bridges/erc20_logic_test.go b/core/bridges/erc20_logic_test.go index f147ddcc44..e1d97c2467 100644 --- a/core/bridges/erc20_logic_test.go +++ b/core/bridges/erc20_logic_test.go @@ -39,61 +39,115 @@ func TestERC20Logic(t *testing.T) { } func testListAsset(t *testing.T) { - signer := testSigner{} - bridge := bridges.NewERC20Logic(signer, erc20BridgeAddr) - sig, err := bridge.ListAsset( - erc20AssetAddr, - erc20AssetVegaID, - num.NewUint(10), - num.NewUint(42), - num.NewUint(42), - ) + tcs := []struct { + name string + v1 bool + expected string + }{ + { + name: "v1 scheme", + v1: true, + expected: "7df8b88552c2f981e64b13f1ce3ee5dcb71e8f59ec057010b7b469120afff7d479f234714785cfc605230dfb2d17f9cc7858143196a13f357ce008e3f3f78a00", + }, + { + name: "v2 scheme", + v1: false, + expected: "03d8d648da4402bebd096f067cebf3e3b70f2c4e1cad6ca9eb757f554b6ca9efb84010887aeef543cf72cb5d78a741d0683befc6f5e0ca2d0347832232af610c", + }, + } - assert.NoError(t, err) - assert.NotNil(t, sig.Message) - assert.NotNil(t, sig.Signature) - assert.True(t, signer.Verify(sig.Message, sig.Signature)) - assert.Equal(t, - "7df8b88552c2f981e64b13f1ce3ee5dcb71e8f59ec057010b7b469120afff7d479f234714785cfc605230dfb2d17f9cc7858143196a13f357ce008e3f3f78a00", - sig.Signature.Hex(), - ) + for _, tc := range tcs { + t.Run(tc.name, func(tt *testing.T) { + signer := testSigner{} + bridge := bridges.NewERC20Logic(signer, erc20BridgeAddr, chainID, tc.v1) + sig, err := bridge.ListAsset( + erc20AssetAddr, + erc20AssetVegaID, + num.NewUint(10), + num.NewUint(42), + num.NewUint(42), + ) + + assert.NoError(t, err) + assert.NotNil(t, sig.Message) + assert.NotNil(t, sig.Signature) + assert.True(t, signer.Verify(sig.Message, sig.Signature)) + assert.Equal(t, tc.expected, sig.Signature.Hex()) + }) + } } func testRemoveAsset(t *testing.T) { - signer := testSigner{} - bridge := bridges.NewERC20Logic(signer, erc20BridgeAddr) - sig, err := bridge.RemoveAsset( - erc20AssetAddr, - num.NewUint(42), - ) + tcs := []struct { + name string + v1 bool + expected string + }{ + { + name: "v1 scheme", + v1: true, + expected: "9012eb20763500caf1a4d7640470449c7220872d7136e17c70231c269051cf80e08760d60850578ebf494e24610a54225c7d994f15f57d9f451e8f717eb3f904", + }, + { + name: "v2 scheme", + v1: false, + expected: "aa07e175a9a4c3dcb0f5dcbd24cc6636e699ee6a1daa9a80267cec8f0be130b86465fa56296743879f56d94d6be64a0b10b76bcee40d0d09ec078b2814b89500", + }, + } + + for _, tc := range tcs { + t.Run(tc.name, func(tt *testing.T) { + signer := testSigner{} + bridge := bridges.NewERC20Logic(signer, erc20BridgeAddr, chainID, tc.v1) + sig, err := bridge.RemoveAsset( + erc20AssetAddr, + num.NewUint(42), + ) - assert.NoError(t, err) - assert.NotNil(t, sig.Message) - assert.NotNil(t, sig.Signature) - assert.True(t, signer.Verify(sig.Message, sig.Signature)) - assert.Equal(t, - "9012eb20763500caf1a4d7640470449c7220872d7136e17c70231c269051cf80e08760d60850578ebf494e24610a54225c7d994f15f57d9f451e8f717eb3f904", - sig.Signature.Hex(), - ) + assert.NoError(t, err) + assert.NotNil(t, sig.Message) + assert.NotNil(t, sig.Signature) + assert.True(t, signer.Verify(sig.Message, sig.Signature)) + assert.Equal(t, tc.expected, sig.Signature.Hex()) + }) + } } func testWithdrawAsset(t *testing.T) { - signer := testSigner{} - bridge := bridges.NewERC20Logic(signer, erc20BridgeAddr) - sig, err := bridge.WithdrawAsset( - erc20AssetAddr, - num.NewUint(42), // amount - ethPartyAddr, - time.Unix(1000, 0), - num.NewUint(1000), // nonce - ) + tcs := []struct { + name string + v1 bool + expected string + }{ + { + name: "v1 scheme", + v1: true, + expected: "0ff08571ab504acdce063a5a5a00dd8878d64ccb09ea6887aacd1fd41b517cd13f4e12edfaa4d06fef5d24087ba9e7c980532daa0a6f1fa329b8d75961f4ab03", + }, + { + name: "v2 scheme", + v1: false, + expected: "9f2d7ec17059fd5d4697337a46899f73681dece748ea1342b3be24b5f34f0b934ad448f7e9bd3a113102d46d8433dd26458cf06c3fd7a1622d086faab1a77b08", + }, + } + + for _, tc := range tcs { + t.Run(tc.name, func(tt *testing.T) { + signer := testSigner{} + bridge := bridges.NewERC20Logic(signer, erc20BridgeAddr, chainID, tc.v1) + sig, err := bridge.WithdrawAsset( + erc20AssetAddr, + num.NewUint(42), // amount + ethPartyAddr, + time.Unix(1000, 0), + num.NewUint(1000), // nonce + ) - assert.NoError(t, err) - assert.NotNil(t, sig.Message) - assert.NotNil(t, sig.Signature) - assert.True(t, signer.Verify(sig.Message, sig.Signature)) - assert.Equal(t, - "0ff08571ab504acdce063a5a5a00dd8878d64ccb09ea6887aacd1fd41b517cd13f4e12edfaa4d06fef5d24087ba9e7c980532daa0a6f1fa329b8d75961f4ab03", - sig.Signature.Hex(), - ) + assert.NoError(t, err) + assert.NotNil(t, sig.Message) + assert.NotNil(t, sig.Signature) + assert.True(t, signer.Verify(sig.Message, sig.Signature)) + assert.Equal(t, tc.expected, sig.Signature.Hex()) + }) + } } diff --git a/core/bridges/erc20_logic_view.go b/core/bridges/erc20_logic_view.go index 892d50bbf5..8de11bcd84 100644 --- a/core/bridges/erc20_logic_view.go +++ b/core/bridges/erc20_logic_view.go @@ -64,8 +64,6 @@ type EthConfirmations interface { Check(uint64) error } -// ERC20Logic yea that's a weird name but -// it just matches the name of the contract. type ERC20LogicView struct { clt ETHClient ethConfs EthConfirmations @@ -100,19 +98,19 @@ func (e *ERC20LogicView) FindAsset( if name, err := t.Name(&bind.CallOpts{}); err != nil { validationErrs.Add(fmt.Errorf("couldn't get name: %w", err)) } else if name != asset.Name { - validationErrs.Add(fmt.Errorf("invalid name, expected(%s), got(%s)", asset.Name, name)) + validationErrs.Add(fmt.Errorf("invalid name, contract(%s), proposal(%s)", name, asset.Name)) } if symbol, err := t.Symbol(&bind.CallOpts{}); err != nil { validationErrs.Add(fmt.Errorf("couldn't get symbol: %w", err)) } else if symbol != asset.Symbol { - validationErrs.Add(fmt.Errorf("invalid symbol, expected(%s), got(%s)", asset.Symbol, symbol)) + validationErrs.Add(fmt.Errorf("invalid symbol, contract(%s), proposal(%s)", symbol, asset.Symbol)) } if decimals, err := t.Decimals(&bind.CallOpts{}); err != nil { validationErrs.Add(fmt.Errorf("couldn't get decimals: %w", err)) } else if uint64(decimals) != asset.Decimals { - validationErrs.Add(fmt.Errorf("invalid decimals, expected(%d), got(%d)", asset.Decimals, decimals)) + validationErrs.Add(fmt.Errorf("invalid decimals, contract(%d), proposal(%d)", decimals, asset.Decimals)) } if validationErrs.HasAny() { @@ -146,6 +144,7 @@ func (e *ERC20LogicView) FindAssetList( iter, err := bf.FilterAssetListed( &bind.FilterOpts{ Start: blockNumber - 1, + End: &blockNumber, Context: ctx, }, []ethcommon.Address{ethcommon.HexToAddress(al.AssetSource)}, @@ -208,6 +207,7 @@ func (e *ERC20LogicView) FindBridgeStopped( iter, err := bf.FilterBridgeStopped( &bind.FilterOpts{ Start: blockNumber - 1, + End: &blockNumber, Context: ctx, }, ) @@ -266,6 +266,7 @@ func (e *ERC20LogicView) FindBridgeResumed( iter, err := bf.FilterBridgeResumed( &bind.FilterOpts{ Start: blockNumber - 1, + End: &blockNumber, Context: ctx, }, ) @@ -322,6 +323,7 @@ func (e *ERC20LogicView) FindDeposit( iter, err := bf.FilterAssetDeposited( &bind.FilterOpts{ Start: blockNumber - 1, + End: &blockNumber, Context: ctx, }, // user_address @@ -384,6 +386,7 @@ func (e *ERC20LogicView) FindWithdrawal( iter, err := bf.FilterAssetWithdrawn( &bind.FilterOpts{ Start: blockNumber - 1, + End: &blockNumber, Context: ctx, }, // user_address @@ -449,6 +452,7 @@ func (e *ERC20LogicView) FindAssetLimitsUpdated( iter, err := bf.FilterAssetLimitsUpdated( &bind.FilterOpts{ Start: blockNumber - 1, + End: &blockNumber, Context: ctx, }, []ethcommon.Address{ethcommon.HexToAddress(ethAssetAddress)}, diff --git a/core/bridges/erc20_multisigcontrol.go b/core/bridges/erc20_multisigcontrol.go index 4b8f018eca..177c30a14a 100644 --- a/core/bridges/erc20_multisigcontrol.go +++ b/core/bridges/erc20_multisigcontrol.go @@ -23,12 +23,16 @@ import ( ) type ERC20MultiSigControl struct { - signer Signer + signer Signer + chainID string + v1 bool } -func NewERC20MultiSigControl(signer Signer) *ERC20MultiSigControl { +func NewERC20MultiSigControl(signer Signer, chainID string, v1 bool) *ERC20MultiSigControl { return &ERC20MultiSigControl{ - signer: signer, + signer: signer, + chainID: chainID, + v1: v1, } } @@ -61,7 +65,7 @@ func (e *ERC20MultiSigControl) BurnNonce( return nil, err } - msg, err := packBufAndSubmitter(buf, submitter) + msg, err := packScheme(buf, submitter, e.chainID, e.v1) if err != nil { return nil, err } @@ -107,11 +111,10 @@ func (e *ERC20MultiSigControl) SetThreshold( return nil, err } - msg, err := packBufAndSubmitter(buf, submitter) + msg, err := packScheme(buf, submitter, e.chainID, e.v1) if err != nil { return nil, err } - return sign(e.signer, msg) } @@ -153,7 +156,7 @@ func (e *ERC20MultiSigControl) AddSigner( return nil, err } - msg, err := packBufAndSubmitter(buf, submitter) + msg, err := packScheme(buf, submitter, e.chainID, e.v1) if err != nil { return nil, err } @@ -199,7 +202,7 @@ func (e *ERC20MultiSigControl) RemoveSigner( return nil, err } - msg, err := packBufAndSubmitter(buf, submitter) + msg, err := packScheme(buf, submitter, e.chainID, e.v1) if err != nil { return nil, err } diff --git a/core/bridges/erc20_multisigcontrol_test.go b/core/bridges/erc20_multisigcontrol_test.go index 35f0c36b0c..998b24e760 100644 --- a/core/bridges/erc20_multisigcontrol_test.go +++ b/core/bridges/erc20_multisigcontrol_test.go @@ -30,6 +30,8 @@ import ( const ( privKey = "9feb9cbee69c1eeb30db084544ff8bf92166bf3fddefa6a021b458b4de04c66758a127387b1dff15b71fd7d0a9fd104ed75da4aac549efd5d149051ea57cefaf" pubKey = "58a127387b1dff15b71fd7d0a9fd104ed75da4aac549efd5d149051ea57cefaf" + + chainID = "31337" ) func TestERC20MultiSigControl(t *testing.T) { @@ -39,61 +41,109 @@ func TestERC20MultiSigControl(t *testing.T) { } func testSetThreshold(t *testing.T) { - signer := testSigner{} - bridge := bridges.NewERC20MultiSigControl(signer) - sig, err := bridge.SetThreshold( - 1000, - "0x1FaA74E181092A97Fecc923015293ce57eE1208A", - num.NewUint(42), - ) - - assert.NoError(t, err) - assert.NotNil(t, sig.Message) - assert.NotNil(t, sig.Signature) - assert.True(t, signer.Verify(sig.Message, sig.Signature)) - assert.Equal(t, - "a2c61b473f15a1729e8593d65748e7a9813102e0d7304598af556525206db599fb79b9750349c6cb564a2f3ecdf233dd19b1598302e0cb91218adff1c609ac09", - sig.Signature.Hex(), - ) + tcs := []struct { + name string + v1 bool + expected string + }{ + { + name: "v1 scheme", + v1: true, + expected: "a2c61b473f15a1729e8593d65748e7a9813102e0d7304598af556525206db599fb79b9750349c6cb564a2f3ecdf233dd19b1598302e0cb91218adff1c609ac09", + }, + { + name: "v2 scheme", + v1: false, + expected: "aa79559d350a9b139d04d7883b7ec26b3948bba503fddcc55f8a868a69ef48dad32ffb4233a041401e482e71232fc339aa6deffda31bcd978596a6a0a6d64b0c", + }, + } + + for _, tc := range tcs { + signer := testSigner{} + bridge := bridges.NewERC20MultiSigControl(signer, chainID, tc.v1) + sig, err := bridge.SetThreshold( + 1000, + "0x1FaA74E181092A97Fecc923015293ce57eE1208A", + num.NewUint(42), + ) + + assert.NoError(t, err) + assert.NotNil(t, sig.Message) + assert.NotNil(t, sig.Signature) + assert.True(t, signer.Verify(sig.Message, sig.Signature)) + assert.Equal(t, tc.expected, sig.Signature.Hex()) + } } func testAddSigner(t *testing.T) { - signer := testSigner{} - bridge := bridges.NewERC20MultiSigControl(signer) - sig, err := bridge.AddSigner( - "0xE20c747a7389B7De2c595658277132f188A074EE", - "0x1FaA74E181092A97Fecc923015293ce57eE1208A", - num.NewUint(42), - ) - - assert.NoError(t, err) - assert.NotNil(t, sig.Message) - assert.NotNil(t, sig) - assert.True(t, signer.Verify(sig.Message, sig.Signature)) - - assert.Equal(t, - "7bdc018935610f23667b31d4eee248160ab39caa1e70ad20da49bf8971d5a16b30f71a09d9aaf5b532defdb7710d85c226e98cb90a49bc4b4401b33f3c5a1601", - sig.Signature.Hex(), - ) + tcs := []struct { + name string + v1 bool + expected string + }{ + { + name: "v1 scheme", + v1: true, + expected: "7bdc018935610f23667b31d4eee248160ab39caa1e70ad20da49bf8971d5a16b30f71a09d9aaf5b532defdb7710d85c226e98cb90a49bc4b4401b33f3c5a1601", + }, + { + name: "v2 scheme", + v1: false, + expected: "f86654970ab8aa7b8f1ac72cd1349cd667acd21b7ff2078653d488f3ab65a446df1b4878692d7f07e2f0111bed069fd7cf5c32f07ae88ed059624480cd0edd07", + }, + } + + for _, tc := range tcs { + signer := testSigner{} + bridge := bridges.NewERC20MultiSigControl(signer, chainID, tc.v1) + sig, err := bridge.AddSigner( + "0xE20c747a7389B7De2c595658277132f188A074EE", + "0x1FaA74E181092A97Fecc923015293ce57eE1208A", + num.NewUint(42), + ) + + assert.NoError(t, err) + assert.NotNil(t, sig.Message) + assert.NotNil(t, sig) + assert.True(t, signer.Verify(sig.Message, sig.Signature)) + + assert.Equal(t, tc.expected, sig.Signature.Hex()) + } } func testRemoveSigner(t *testing.T) { - signer := testSigner{} - bridge := bridges.NewERC20MultiSigControl(signer) - sig, err := bridge.RemoveSigner( - "0xE20c747a7389B7De2c595658277132f188A074EE", - "0x1FaA74E181092A97Fecc923015293ce57eE1208A", - num.NewUint(42), - ) - - assert.NoError(t, err) - assert.NotNil(t, sig.Message) - assert.NotNil(t, sig) - assert.True(t, signer.Verify(sig.Message, sig.Signature)) - assert.Equal(t, - "98ea2303c68dbb0a88bdb7dad8c6e2db9698cd992667399a378e682dbdf16e74a9d304a32e36b48de81c0e99449a7a37c1a7ef94af1e85aa88a808f8d7126c0c", - sig.Signature.Hex(), - ) + tcs := []struct { + name string + v1 bool + expected string + }{ + { + name: "v1 scheme", + v1: true, + expected: "98ea2303c68dbb0a88bdb7dad8c6e2db9698cd992667399a378e682dbdf16e74a9d304a32e36b48de81c0e99449a7a37c1a7ef94af1e85aa88a808f8d7126c0c", + }, + { + name: "v2 scheme", + v1: false, + expected: "e17efd360ce488a7299175473f257544391e3823db314e31cc69e6ae2730ead994e89bfab5813ea1379c4b6e499d131308ebe516ba6142f9f77479083685020b", + }, + } + + for _, tc := range tcs { + signer := testSigner{} + bridge := bridges.NewERC20MultiSigControl(signer, chainID, tc.v1) + sig, err := bridge.RemoveSigner( + "0xE20c747a7389B7De2c595658277132f188A074EE", + "0x1FaA74E181092A97Fecc923015293ce57eE1208A", + num.NewUint(42), + ) + + assert.NoError(t, err) + assert.NotNil(t, sig.Message) + assert.NotNil(t, sig) + assert.True(t, signer.Verify(sig.Message, sig.Signature)) + assert.Equal(t, tc.expected, sig.Signature.Hex()) + } } type testSigner struct{} diff --git a/core/client/eth/client.go b/core/client/eth/client.go index 1872fa9748..faae6b0469 100644 --- a/core/client/eth/client.go +++ b/core/client/eth/client.go @@ -44,7 +44,7 @@ var ContractHashes = map[string]string{ "multisig": "5b7070e6159628455b38f5796e8d0dc08185aaaa1fb6073767c88552d396c6c2", } -type Client struct { +type PrimaryClient struct { ETHClient ethConfig *types.EthereumConfig @@ -54,10 +54,10 @@ type Client struct { currentHeightLastUpdate time.Time currentHeight uint64 - cfg Config + retryDelay time.Duration } -func Dial(ctx context.Context, cfg Config) (*Client, error) { +func PrimaryDial(ctx context.Context, cfg Config) (*PrimaryClient, error) { if len(cfg.RPCEndpoint) <= 0 { return nil, errors.New("no ethereum rpc endpoint configured. the configuration have move from the NodeWallet section to the Ethereum section, please make sure your vega configuration is up to date") } @@ -67,22 +67,25 @@ func Dial(ctx context.Context, cfg Config) (*Client, error) { return nil, fmt.Errorf("couldn't instantiate Ethereum client: %w", err) } - return &Client{ETHClient: newEthClientWrapper(ethClient), cfg: cfg}, nil + return &PrimaryClient{ + ETHClient: newEthClientWrapper(ethClient), + retryDelay: cfg.RetryDelay.Get(), + }, nil } -func (c *Client) UpdateEthereumConfig(ethConfig *types.EthereumConfig) error { +func (c *PrimaryClient) UpdateEthereumConfig(ctx context.Context, ethConfig *types.EthereumConfig) error { if c == nil { return nil } - netID, err := c.NetworkID(context.Background()) + netID, err := c.NetworkID(ctx) if err != nil { - return fmt.Errorf("couldn't retrieve the network ID form the ethereum client: %w", err) + return fmt.Errorf("couldn't retrieve the network ID from the ethereum client: %w", err) } - chainID, err := c.ChainID(context.Background()) + chainID, err := c.ChainID(ctx) if err != nil { - return fmt.Errorf("couldn't retrieve the chain ID form the ethereum client: %w", err) + return fmt.Errorf("couldn't retrieve the chain ID from the ethereum client: %w", err) } if netID.String() != ethConfig.NetworkID() { @@ -90,22 +93,14 @@ func (c *Client) UpdateEthereumConfig(ethConfig *types.EthereumConfig) error { } if chainID.String() != ethConfig.ChainID() { - return fmt.Errorf("updated chain ID does not matchthe one set during start up, expected %v got %v", ethConfig.ChainID(), chainID) + return fmt.Errorf("updated chain ID does not match the one set during start up, expected %v got %v", ethConfig.ChainID(), chainID) } - // if err := c.verifyStakingContract(context.Background(), ethConfig); err != nil { - // return fmt.Errorf("failed to verify staking bridge contract: %w", err) - // } - - // if err := c.verifyVestingContract(context.Background(), ethConfig); err != nil { - // return fmt.Errorf("failed to verify vesting bridge contract: %w", err) - // } - - if err := c.verifyCollateralContract(context.Background(), ethConfig); err != nil { + if err := c.verifyCollateralContract(ctx, ethConfig); err != nil { return fmt.Errorf("failed to verify collateral bridge contract: %w", err) } - if err := c.verifyMultisigContract(context.Background(), ethConfig); err != nil { + if err := c.verifyMultisigContract(ctx, ethConfig); err != nil { return fmt.Errorf("failed to verify multisig control contract: %w", err) } @@ -114,19 +109,24 @@ func (c *Client) UpdateEthereumConfig(ethConfig *types.EthereumConfig) error { return nil } -func (c *Client) CollateralBridgeAddress() ethcommon.Address { +func (c *PrimaryClient) CollateralBridgeAddress() ethcommon.Address { return c.ethConfig.CollateralBridge().Address() } -func (c *Client) CollateralBridgeAddressHex() string { +func (c *PrimaryClient) CollateralBridgeAddressHex() string { return c.ethConfig.CollateralBridge().HexAddress() } -func (c *Client) CurrentHeight(ctx context.Context) (uint64, error) { +// IsEthereum returns whether or not this client is the "primary" one and pointing to Ethereum. +func (c *PrimaryClient) IsEthereum() bool { + return true +} + +func (c *PrimaryClient) CurrentHeight(ctx context.Context) (uint64, error) { c.mu.Lock() defer c.mu.Unlock() - if now := time.Now(); c.currentHeightLastUpdate.Add(c.cfg.RetryDelay.Get()).Before(now) { + if now := time.Now(); c.currentHeightLastUpdate.Add(c.retryDelay).Before(now) { lastBlockHeader, err := c.HeaderByNumber(ctx, nil) if err != nil { return c.currentHeight, err @@ -138,12 +138,12 @@ func (c *Client) CurrentHeight(ctx context.Context) (uint64, error) { return c.currentHeight, nil } -func (c *Client) ConfirmationsRequired() uint64 { +func (c *PrimaryClient) ConfirmationsRequired() uint64 { return c.ethConfig.Confirmations() } // VerifyContract takes the address of a contract in hex and checks the hash of the byte-code is as expected. -func (c *Client) VerifyContract(ctx context.Context, address ethcommon.Address, expectedHash string) error { +func (c *PrimaryClient) VerifyContract(ctx context.Context, address ethcommon.Address, expectedHash string) error { // nil block number means latest block b, err := c.CodeAt(ctx, address, nil) if err != nil { @@ -172,21 +172,7 @@ func (c *Client) VerifyContract(ctx context.Context, address ethcommon.Address, return nil } -// func (c *Client) verifyStakingContract(ctx context.Context, ethConfig *types.EthereumConfig) error { -// if address := ethConfig.StakingBridge(); address.HasAddress() { -// return c.VerifyContract(ctx, address.Address(), ContractHashes["staking"]) -// } -// return nil -// } - -// func (c *Client) verifyVestingContract(ctx context.Context, ethConfig *types.EthereumConfig) error { -// if address := ethConfig.VestingBridge(); address.HasAddress() { -// return c.VerifyContract(ctx, address.Address(), ContractHashes["vesting"]) -// } -// return nil -// } - -func (c *Client) verifyCollateralContract(ctx context.Context, ethConfig *types.EthereumConfig) error { +func (c *PrimaryClient) verifyCollateralContract(ctx context.Context, ethConfig *types.EthereumConfig) error { if address := ethConfig.CollateralBridge(); address.HasAddress() { return c.VerifyContract(ctx, address.Address(), ContractHashes["collateral"]) } @@ -194,7 +180,7 @@ func (c *Client) verifyCollateralContract(ctx context.Context, ethConfig *types. return nil } -func (c *Client) verifyMultisigContract(ctx context.Context, ethConfig *types.EthereumConfig) error { +func (c *PrimaryClient) verifyMultisigContract(ctx context.Context, ethConfig *types.EthereumConfig) error { if address := ethConfig.MultiSigControl(); address.HasAddress() { return c.VerifyContract(ctx, address.Address(), ContractHashes["multisig"]) } diff --git a/core/client/eth/client_test.go b/core/client/eth/client_test.go index 729e86d241..5f46535ead 100644 --- a/core/client/eth/client_test.go +++ b/core/client/eth/client_test.go @@ -84,7 +84,7 @@ func testCurrentBlock(t *testing.T) { type testClient struct { ctrl *gomock.Controller - client *eth.Client + client *eth.PrimaryClient mockEthClient *mocks.MockETHClient } @@ -92,7 +92,7 @@ func getTestClient(t *testing.T) *testClient { t.Helper() ctrl := gomock.NewController(t) mockEthClient := mocks.NewMockETHClient(ctrl) - c := ð.Client{ETHClient: mockEthClient} + c := ð.PrimaryClient{ETHClient: mockEthClient} mockEthClient.EXPECT().ChainID(gomock.Any()).Return(big.NewInt(1), nil).AnyTimes() return &testClient{ diff --git a/core/client/eth/config.go b/core/client/eth/config.go index 471ef424a1..f42a822f12 100644 --- a/core/client/eth/config.go +++ b/core/client/eth/config.go @@ -25,10 +25,11 @@ import ( const namedLogger = "ethClient" type Config struct { - Level encoding.LogLevel `long:"log-level"` - RPCEndpoint string - RetryDelay encoding.Duration - EVMChainConfigs []EVMChainConfig + Level encoding.LogLevel `long:"log-level"` + RPCEndpoint string + RetryDelay encoding.Duration + EVMBridgeConfigs []EVMChainConfig + EVMChainConfigs []EVMChainConfig } type EVMChainConfig struct { diff --git a/core/client/eth/ethereum_confirmations.go b/core/client/eth/ethereum_confirmations.go index fbabe88da9..5a559cf113 100644 --- a/core/client/eth/ethereum_confirmations.go +++ b/core/client/eth/ethereum_confirmations.go @@ -25,7 +25,18 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" ) -var ErrMissingConfirmations = errors.New("not enough confirmations") +var ( + ErrMissingConfirmations = errors.New("not enough confirmations") + ErrBlockNotFinalized = errors.New("block not finalized") +) + +type FinalityState int + +const ( + FinalityStateSafe FinalityState = iota + FinalityStateFinalized + FinalityStateLatest +) //go:generate go run github.com/golang/mock/mockgen -destination mocks/ethereum_client_confirmations_mock.go -package mocks code.vegaprotocol.io/vega/core/staking EthereumClientConfirmations type EthereumClientConfirmations interface { @@ -42,7 +53,8 @@ type StdTime struct{} func (StdTime) Now() time.Time { return time.Now() } type EthereumConfirmations struct { - cfg Config + retryDelay time.Duration + ethClient EthereumClientConfirmations time Time @@ -51,21 +63,33 @@ type EthereumConfirmations struct { required uint64 curHeight uint64 curHeightLastUpdate time.Time + finHeight uint64 + finHeightLastUpdate time.Time + finState *big.Int } -func NewEthereumConfirmations( - cfg Config, - ethClient EthereumClientConfirmations, - time Time, -) *EthereumConfirmations { +func NewEthereumConfirmations(cfg Config, ethClient EthereumClientConfirmations, time Time, cs FinalityState) *EthereumConfirmations { if time == nil { time = StdTime{} } - return &EthereumConfirmations{ - cfg: cfg, - ethClient: ethClient, - time: time, + + conf := &EthereumConfirmations{ + retryDelay: cfg.RetryDelay.Get(), + ethClient: ethClient, + time: time, + } + + switch cs { + case FinalityStateSafe: + conf.finState = big.NewInt(-4) + case FinalityStateFinalized: + conf.finState = big.NewInt(-3) + case FinalityStateLatest: + conf.finState = nil + default: + panic("unexpected confirmation state") } + return conf } func (e *EthereumConfirmations) GetConfirmations() uint64 { @@ -81,7 +105,20 @@ func (e *EthereumConfirmations) UpdateConfirmations(confirmations uint64) { } func (e *EthereumConfirmations) Check(block uint64) error { - return e.CheckRequiredConfirmations(block, e.required) + if err := e.CheckRequiredConfirmations(block, e.required); err != nil { + return err + } + + finalized, err := e.finalizedHeight(context.Background()) + if err != nil { + return err + } + + if finalized < block { + return ErrBlockNotFinalized + } + + return nil } func (e *EthereumConfirmations) CheckRequiredConfirmations(block uint64, required uint64) error { @@ -97,26 +134,51 @@ func (e *EthereumConfirmations) CheckRequiredConfirmations(block uint64, require return nil } -func (e *EthereumConfirmations) currentHeight( - _ context.Context, -) (uint64, error) { +func (e *EthereumConfirmations) finalizedHeight(ctx context.Context) (uint64, error) { e.mu.Lock() defer e.mu.Unlock() - // if last update of the heigh was more that 15 seconds + h, lastUpdate, err := e.getHeight(ctx, e.finHeight, e.finHeightLastUpdate, e.finState) + if err != nil { + return e.finHeight, err + } + + // update cache + e.finHeightLastUpdate = lastUpdate + e.finHeight = h + return e.finHeight, err +} + +func (e *EthereumConfirmations) currentHeight(ctx context.Context) (uint64, error) { + e.mu.Lock() + defer e.mu.Unlock() + + h, lastUpdate, err := e.getHeight(ctx, e.curHeight, e.curHeightLastUpdate, nil) + if err != nil { + return e.curHeight, err + } + + // update cache + e.curHeightLastUpdate = lastUpdate + e.curHeight = h + return e.curHeight, err +} + +func (e *EthereumConfirmations) getHeight(ctx context.Context, lastHeight uint64, lastUpdate time.Time, block *big.Int) (uint64, time.Time, error) { + // if last update of the height was more that 15 seconds // ago, we try to update, we assume an eth block takes // ~15 seconds - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + ctx, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() - if now := e.time.Now(); e.curHeightLastUpdate.Add(e.cfg.RetryDelay.Get()).Before(now) { + if now := e.time.Now(); lastUpdate.Add(e.retryDelay).Before(now) { // get the last block header - h, err := e.ethClient.HeaderByNumber(ctx, nil) + h, err := e.ethClient.HeaderByNumber(ctx, block) if err != nil { - return e.curHeight, err + return lastHeight, lastUpdate, err } - e.curHeightLastUpdate = now - e.curHeight = h.Number.Uint64() + lastUpdate = now + lastHeight = h.Number.Uint64() } - return e.curHeight, nil + return lastHeight, lastUpdate, nil } diff --git a/core/client/eth/ethereum_confirmations_test.go b/core/client/eth/ethereum_confirmations_test.go index d9f50d05f3..11fd440a17 100644 --- a/core/client/eth/ethereum_confirmations_test.go +++ b/core/client/eth/ethereum_confirmations_test.go @@ -35,7 +35,7 @@ func TestEthereumConfirmations(t *testing.T) { tim := localMocks.NewMockTime(ctrl) cfg := eth.NewDefaultConfig() cfg.RetryDelay.Duration = 15 * time.Second - ethCfns := eth.NewEthereumConfirmations(cfg, ethClient, tim) + ethCfns := eth.NewEthereumConfirmations(cfg, ethClient, tim, eth.FinalityStateFinalized) defer ctrl.Finish() ethCfns.UpdateConfirmations(30) @@ -76,33 +76,62 @@ func TestEthereumConfirmations(t *testing.T) { assert.ErrorIs(t, ethCfns.Check(50), eth.ErrMissingConfirmations) // request again but before buf size - // no request to eth - tim.EXPECT().Now().Times(1).Return(time.Unix(58, 0)) - // do block 80 > requested block == confirmations - ethClient.EXPECT().HeaderByNumber(gomock.Any(), gomock.Any()).Times(1). + tim.EXPECT().Now().Times(2).Return(time.Unix(58, 0)) + // do block 80 > requested block == confirmations, and also block is seen as finalized + ethClient.EXPECT().HeaderByNumber(gomock.Any(), gomock.Any()).Times(2). Return(ðtypes.Header{Number: big.NewInt(80)}, nil) - // block 10, request 50, we are in the past, return err assert.NoError(t, ethCfns.Check(50)) // request again but before buf size // no request to eth - tim.EXPECT().Now().Times(1).Return(time.Unix(1000, 0)) + tim.EXPECT().Now().Times(2).Return(time.Unix(1000, 0)) // do block 80 > requested block == confirmations - ethClient.EXPECT().HeaderByNumber(gomock.Any(), gomock.Any()).Times(1). + ethClient.EXPECT().HeaderByNumber(gomock.Any(), gomock.Any()).Times(2). Return(ðtypes.Header{Number: big.NewInt(100)}, nil) // block 10, request 50, we are in the past, return err assert.NoError(t, ethCfns.Check(50)) } +func TestBlockFinalisation(t *testing.T) { + ctrl := gomock.NewController(t) + ethClient := mocks.NewMockEthereumClientConfirmations(ctrl) + tim := localMocks.NewMockTime(ctrl) + cfg := eth.NewDefaultConfig() + cfg.RetryDelay.Duration = 15 * time.Second + ethCfns := eth.NewEthereumConfirmations(cfg, ethClient, tim, eth.FinalityStateFinalized) + defer ctrl.Finish() + + ethCfns.UpdateConfirmations(10) + + // testing with block 50 where we need 10 confirmations + // current Ethereum block is 70 so we have enough confirmations, but finalized block is 49 + tim.EXPECT().Now().Times(2).Return(time.Unix(10, 0)) + ethClient.EXPECT().HeaderByNumber(gomock.Any(), gomock.Any()).Times(1). + Return(ðtypes.Header{Number: big.NewInt(70)}, nil) + ethClient.EXPECT().HeaderByNumber(gomock.Any(), gomock.Any()).Times(1). + Return(ðtypes.Header{Number: big.NewInt(49)}, nil) + + // block 10, request 50, we are in the past, return err + assert.ErrorIs(t, ethCfns.Check(50), eth.ErrBlockNotFinalized) + + // now we are passed enough confirmations AND the block has been finalized + tim.EXPECT().Now().Times(2).Return(time.Unix(60, 0)) + ethClient.EXPECT().HeaderByNumber(gomock.Any(), gomock.Any()).Times(1). + Return(ðtypes.Header{Number: big.NewInt(70)}, nil) + ethClient.EXPECT().HeaderByNumber(gomock.Any(), gomock.Any()).Times(1). + Return(ðtypes.Header{Number: big.NewInt(50)}, nil) + assert.NoError(t, ethCfns.Check(50)) +} + func TestCheckRequiredConfirmations(t *testing.T) { ctrl := gomock.NewController(t) ethClient := mocks.NewMockEthereumClientConfirmations(ctrl) tim := localMocks.NewMockTime(ctrl) cfg := eth.NewDefaultConfig() cfg.RetryDelay.Duration = 15 * time.Second - ethCfns := eth.NewEthereumConfirmations(cfg, ethClient, tim) + ethCfns := eth.NewEthereumConfirmations(cfg, ethClient, tim, eth.FinalityStateFinalized) defer ctrl.Finish() tim.EXPECT().Now().Times(1).Return(time.Unix(10, 0)) diff --git a/core/client/eth/l2_clients.go b/core/client/eth/l2_clients.go index 3b368676ae..9ee382769b 100644 --- a/core/client/eth/l2_clients.go +++ b/core/client/eth/l2_clients.go @@ -73,8 +73,7 @@ func NewL2Clients( } clients[v.ChainID] = clt - confirmations[v.ChainID] = NewEthereumConfirmations( - cfg, clt, nil) + confirmations[v.ChainID] = NewEthereumConfirmations(cfg, clt, nil, FinalityStateLatest) } return &L2Clients{ @@ -154,8 +153,7 @@ func (e *L2Clients) ReloadConf(cfg Config) { } e.clients[v.ChainID] = clt - e.confirmations[v.ChainID] = NewEthereumConfirmations( - cfg, clt, nil) + e.confirmations[v.ChainID] = NewEthereumConfirmations(cfg, clt, nil, FinalityStateLatest) } } diff --git a/core/client/eth/secondary_client.go b/core/client/eth/secondary_client.go new file mode 100644 index 0000000000..529d929cbe --- /dev/null +++ b/core/client/eth/secondary_client.go @@ -0,0 +1,157 @@ +// 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 + +import ( + "context" + "encoding/hex" + "errors" + "fmt" + "strings" + "sync" + "time" + + "code.vegaprotocol.io/vega/core/types" + vgcrypto "code.vegaprotocol.io/vega/libs/crypto" + + ethcommon "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" +) + +type SecondaryClient struct { + ETHClient + ethConfig *types.EVMChainConfig + + // this is all just to prevent spamming the infura just + // to get the last height of the blockchain + mu sync.Mutex + currentHeightLastUpdate time.Time + currentHeight uint64 + + retryDelay time.Duration +} + +func SecondaryDial(ctx context.Context, cfg Config) (*SecondaryClient, error) { + if len(cfg.EVMBridgeConfigs) != 1 { + return nil, errors.New("require exactly one EVM bridge configuration") + } + + evmCfg := cfg.EVMBridgeConfigs[0] + if len(evmCfg.RPCEndpoint) <= 0 { + return nil, fmt.Errorf("no rpc endpoint configured for chain-id: %s", evmCfg.ChainID) + } + + ethClient, err := ethclient.DialContext(ctx, evmCfg.RPCEndpoint) + if err != nil { + return nil, fmt.Errorf("couldn't instantiate secondary Ethereum client: %w", err) + } + + return &SecondaryClient{ + ETHClient: newEthClientWrapper(ethClient), + retryDelay: cfg.RetryDelay.Get(), + }, nil +} + +func (c *SecondaryClient) UpdateEthereumConfig(ctx context.Context, ethConfig *types.EVMChainConfig) error { + if c == nil { + return nil + } + + netID, err := c.NetworkID(ctx) + if err != nil { + return fmt.Errorf("couldn't retrieve the network ID from the ethereum client: %w", err) + } + + chainID, err := c.ChainID(ctx) + if err != nil { + return fmt.Errorf("couldn't retrieve the chain ID form the ethereum client: %w", err) + } + + if netID.String() != ethConfig.NetworkID() { + return fmt.Errorf("updated network ID does not match the one set during start up, expected %s got %v", ethConfig.NetworkID(), netID) + } + + if chainID.String() != ethConfig.ChainID() { + return fmt.Errorf("updated chain ID does not match the one set during start up, expected %v got %v", ethConfig.ChainID(), chainID) + } + + c.ethConfig = ethConfig + + return nil +} + +func (c *SecondaryClient) CollateralBridgeAddress() ethcommon.Address { + return c.ethConfig.CollateralBridge().Address() +} + +func (c *SecondaryClient) CollateralBridgeAddressHex() string { + return c.ethConfig.CollateralBridge().HexAddress() +} + +// IsEthereum returns whether or not this client is the "primary" one and pointing to Ethereum. +func (c *SecondaryClient) IsEthereum() bool { + return false +} + +func (c *SecondaryClient) CurrentHeight(ctx context.Context) (uint64, error) { + c.mu.Lock() + defer c.mu.Unlock() + + if now := time.Now(); c.currentHeightLastUpdate.Add(c.retryDelay).Before(now) { + lastBlockHeader, err := c.HeaderByNumber(ctx, nil) + if err != nil { + return c.currentHeight, err + } + c.currentHeightLastUpdate = now + c.currentHeight = lastBlockHeader.Number.Uint64() + } + + return c.currentHeight, nil +} + +func (c *SecondaryClient) ConfirmationsRequired() uint64 { + return c.ethConfig.Confirmations() +} + +// VerifyContract takes the address of a contract in hex and checks the hash of the byte-code is as expected. +func (c *SecondaryClient) VerifyContract(ctx context.Context, address ethcommon.Address, expectedHash string) error { + // nil block number means latest block + b, err := c.CodeAt(ctx, address, nil) + if err != nil { + return err + } + + // the bytecode of the contract is appended which is deployment specific. We only care about + // the contract code itself and so we need to strip this meta-data before hashing it. For the version + // of Solidity we use, the format is [contract-bytecode]a264[CBOR-encoded meta-data] + asHex := strings.Split(hex.EncodeToString(b), "a264") + if len(asHex) != 2 { + return fmt.Errorf("%w: address: %s", ErrUnexpectedSolidityFormat, address) + } + + // Back to bytes for hashing + b, err = hex.DecodeString(asHex[0]) + if err != nil { + return err + } + + h := hex.EncodeToString(vgcrypto.Hash(b)) + if h != expectedHash { + return fmt.Errorf("%w: address: %s, hash: %s, expected: %s", ErrUnexpectedContractHash, address, h, expectedHash) + } + + return nil +} diff --git a/core/collateral/checkpoint.go b/core/collateral/checkpoint.go index c1c6b655da..1b45ad4861 100644 --- a/core/collateral/checkpoint.go +++ b/core/collateral/checkpoint.go @@ -66,6 +66,7 @@ var partyOverrides = map[string]types.AccountType{ systemOwner + types.AccountTypeMarketProposerReward.String(): types.AccountTypeMarketProposerReward, systemOwner + types.AccountTypeFeesInfrastructure.String(): types.AccountTypeFeesInfrastructure, systemOwner + types.AccountTypePendingTransfers.String(): types.AccountTypePendingTransfers, + systemOwner + types.AccountTypeRealisedReturnReward.String(): types.AccountTypeRealisedReturnReward, } var tradingRewardAccountTypes = map[types.AccountType]struct{}{ @@ -77,6 +78,7 @@ var tradingRewardAccountTypes = map[types.AccountType]struct{}{ types.AccountTypeRelativeReturnReward: {}, types.AccountTypeReturnVolatilityReward: {}, types.AccountTypeValidatorRankingReward: {}, + types.AccountTypeRealisedReturnReward: {}, } func (e *Engine) Load(ctx context.Context, data []byte) error { @@ -192,7 +194,8 @@ func (e *Engine) getCheckpointBalances() []*checkpoint.AssetBalance { types.AccountTypeLPFeeReward, types.AccountTypeMakerReceivedFeeReward, types.AccountTypeMakerPaidFeeReward, types.AccountTypeMarketProposerReward, types.AccountTypeFeesInfrastructure, types.AccountTypePendingTransfers, types.AccountTypeNetworkTreasury, types.AccountTypeGlobalInsurance, types.AccountTypeVestedRewards, - types.AccountTypeAveragePositionReward, types.AccountTypeRelativeReturnReward, types.AccountTypeReturnVolatilityReward, types.AccountTypeValidatorRankingReward: + types.AccountTypeAveragePositionReward, types.AccountTypeRelativeReturnReward, types.AccountTypeRealisedReturnReward, + types.AccountTypeReturnVolatilityReward, types.AccountTypeValidatorRankingReward: owner := acc.Owner // NB: market insurance accounts funds will flow implicitly using this logic into the network treasury for the asset // similarly LP Fee bonus distribution bonus account would fall over into the network treasury of the asset. @@ -216,7 +219,8 @@ func (e *Engine) getCheckpointBalances() []*checkpoint.AssetBalance { acc.Type == types.AccountTypeAveragePositionReward || acc.Type == types.AccountTypeRelativeReturnReward || acc.Type == types.AccountTypeReturnVolatilityReward || - acc.Type == types.AccountTypeValidatorRankingReward { + acc.Type == types.AccountTypeValidatorRankingReward || + acc.Type == types.AccountTypeRealisedReturnReward { owner += separator + acc.MarketID } diff --git a/core/collateral/engine.go b/core/collateral/engine.go index 35c30b7b47..e69042d4d8 100644 --- a/core/collateral/engine.go +++ b/core/collateral/engine.go @@ -56,7 +56,6 @@ var ( ErrNoGeneralAccountWhenCreateMarginAccount = errors.New("party general account missing when trying to create a margin account") ErrNoGeneralAccountWhenCreateBondAccount = errors.New("party general account missing when trying to create a bond account") ErrMinAmountNotReached = errors.New("unable to reach minimum amount transfer") - ErrPartyHasNoTokenAccount = errors.New("no token account for party") ErrSettlementBalanceNotZero = errors.New("settlement balance should be zero") // E991 YOU HAVE TOO MUCH ROPE TO HANG YOURSELF // ErrAssetAlreadyEnabled signals the given asset has already been enabled in this engine. ErrAssetAlreadyEnabled = errors.New("asset already enabled") @@ -639,6 +638,10 @@ func (e *Engine) transferSpotFees(ctx context.Context, marketID string, assetID return nil, err } + if req == nil { + continue + } + res, err := e.getLedgerEntries(ctx, req) if err != nil { e.log.Error("Failed to transfer funds", logging.Error(err)) @@ -700,6 +703,9 @@ func (e *Engine) getSpotFeeTransferRequest( switch t.Type { case types.TransferTypeInfrastructureFeePay: + amt := num.Min(treq.Amount, general.Balance.Clone()) + treq.Amount = amt + treq.MinAmount = amt treq.FromAccount = []*types.Account{general} treq.ToAccount = []*types.Account{infraFee} return treq, nil @@ -708,6 +714,9 @@ func (e *Engine) getSpotFeeTransferRequest( treq.ToAccount = []*types.Account{general} return treq, nil case types.TransferTypeLiquidityFeePay: + amt := num.Min(treq.Amount, general.Balance.Clone()) + treq.Amount = amt + treq.MinAmount = amt treq.FromAccount = []*types.Account{general} treq.ToAccount = []*types.Account{liquiFee} return treq, nil @@ -716,6 +725,9 @@ func (e *Engine) getSpotFeeTransferRequest( treq.ToAccount = []*types.Account{general} return treq, nil case types.TransferTypeMakerFeePay: + amt := num.Min(treq.Amount, general.Balance.Clone()) + treq.Amount = amt + treq.MinAmount = amt treq.FromAccount = []*types.Account{general} treq.ToAccount = []*types.Account{makerFee} return treq, nil @@ -2530,7 +2542,8 @@ func (e *Engine) getGovernanceTransferFundsTransferRequest(ctx context.Context, // this could not exists as well, let's just create in this case case types.AccountTypeGlobalReward, types.AccountTypeLPFeeReward, types.AccountTypeMakerReceivedFeeReward, types.AccountTypeMakerPaidFeeReward, types.AccountTypeMarketProposerReward, types.AccountTypeAveragePositionReward, - types.AccountTypeRelativeReturnReward, types.AccountTypeReturnVolatilityReward, types.AccountTypeValidatorRankingReward: + types.AccountTypeRelativeReturnReward, types.AccountTypeReturnVolatilityReward, types.AccountTypeRealisedReturnReward, + types.AccountTypeValidatorRankingReward: market := noMarket if len(t.Market) > 0 { market = t.Market @@ -2581,6 +2594,7 @@ func (e *Engine) getGovernanceTransferFundsTransferRequest(ctx context.Context, MinAmount: t.Amount.Amount.Clone(), Asset: t.Amount.Asset, Type: t.Type, + TransferID: t.TransferID, }, nil } @@ -2635,7 +2649,8 @@ func (e *Engine) getTransferFundsTransferRequest(ctx context.Context, t *types.T // this could not exists as well, let's just create in this case case types.AccountTypeGlobalReward, types.AccountTypeLPFeeReward, types.AccountTypeMakerReceivedFeeReward, types.AccountTypeNetworkTreasury, types.AccountTypeMakerPaidFeeReward, types.AccountTypeMarketProposerReward, types.AccountTypeAveragePositionReward, - types.AccountTypeRelativeReturnReward, types.AccountTypeReturnVolatilityReward, types.AccountTypeValidatorRankingReward: + types.AccountTypeRelativeReturnReward, types.AccountTypeReturnVolatilityReward, types.AccountTypeRealisedReturnReward, + types.AccountTypeValidatorRankingReward: market := noMarket if len(t.Market) > 0 { market = t.Market @@ -4380,16 +4395,67 @@ func (e *Engine) ReleaseFromHoldingAccount(ctx context.Context, transfer *types. } // ClearSpotMarket moves remaining LP fees to the global reward account and removes market accounts. -func (e *Engine) ClearSpotMarket(ctx context.Context, mktID, quoteAsset string) ([]*types.LedgerMovement, error) { +func (e *Engine) ClearSpotMarket(ctx context.Context, mktID, quoteAsset string, parties []string) ([]*types.LedgerMovement, error) { resps := []*types.LedgerMovement{} - treasury, _ := e.GetNetworkTreasuryAccount(quoteAsset) req := &types.TransferRequest{ FromAccount: make([]*types.Account, 1), ToAccount: make([]*types.Account, 1), Asset: quoteAsset, Type: types.TransferTypeClearAccount, } + + for _, v := range parties { + generalAcc, err := e.GetAccountByID(e.accountID(noMarket, v, quoteAsset, types.AccountTypeGeneral)) + if err != nil { + e.log.Debug( + "Failed to get the general account", + logging.String("party-id", v), + logging.String("market-id", mktID), + logging.String("asset", quoteAsset), + logging.Error(err)) + // just try to do other parties + continue + } + // Then we do bond account + bondAcc, err := e.GetAccountByID(e.accountID(mktID, v, quoteAsset, types.AccountTypeBond)) + if err != nil { + // this not an actual error + // a party may not have a bond account if + // its not also a liquidity provider + continue + } + + req.FromAccount[0] = bondAcc + req.ToAccount[0] = generalAcc + req.Amount = bondAcc.Balance.Clone() + + if e.log.GetLevel() == logging.DebugLevel { + e.log.Debug("Clearing party bond account", + logging.String("market-id", mktID), + logging.String("asset", quoteAsset), + logging.String("party", v), + logging.BigUint("bond-before", bondAcc.Balance), + logging.BigUint("general-before", generalAcc.Balance), + logging.BigUint("general-after", num.Sum(generalAcc.Balance, bondAcc.Balance))) + } + + ledgerEntries, err := e.clearAccount(ctx, req, v, quoteAsset, mktID) + if err != nil { + e.log.Panic("unable to clear party account", logging.Error(err)) + } + + // add entries to the response + resps = append(resps, ledgerEntries) + } + + treasury, _ := e.GetNetworkTreasuryAccount(quoteAsset) + req = &types.TransferRequest{ + FromAccount: make([]*types.Account, 1), + ToAccount: make([]*types.Account, 1), + Asset: quoteAsset, + Type: types.TransferTypeClearAccount, + } // any remaining balance in the fee account gets transferred over to the insurance account lpFeeAccID := e.accountID(mktID, "", quoteAsset, types.AccountTypeFeesLiquidity) if lpFeeAcc, ok := e.accs[lpFeeAccID]; ok { diff --git a/core/collateral/engine_test.go b/core/collateral/engine_test.go index 75ddbb2626..6878a6f351 100644 --- a/core/collateral/engine_test.go +++ b/core/collateral/engine_test.go @@ -3426,12 +3426,19 @@ func TestClearSpotMarket(t *testing.T) { acc, err := eng.GetMarketLiquidityFeeAccount(testMarketID, "BTC") require.NoError(t, err) + // create and topup bond account + _, err = eng.CreatePartyGeneralAccount(context.Background(), "party1", "BTC") + require.NoError(t, err) + bondAccID, err := eng.CreatePartyBondAccount(context.Background(), "party1", testMarketID, "BTC") + require.NoError(t, err) + eng.IncrementBalance(context.Background(), bondAccID, num.NewUint(10000)) + eng.IncrementBalance(context.Background(), acc.ID, num.NewUint(1000)) _, err = eng.GetMarketMakerFeeAccount(testMarketID, "BTC") require.NoError(t, err) - _, err = eng.ClearSpotMarket(context.Background(), testMarketID, "BTC") + _, err = eng.ClearSpotMarket(context.Background(), testMarketID, "BTC", []string{"party1"}) require.NoError(t, err) treasury, err := eng.GetNetworkTreasuryAccount("BTC") @@ -3444,6 +3451,10 @@ func TestClearSpotMarket(t *testing.T) { _, err = eng.GetMarketMakerFeeAccount(testMarketID, "BTC") require.Error(t, err) + + generalAccountBalance, err := eng.GetPartyGeneralAccount("party1", "BTC") + require.NoError(t, err) + require.Equal(t, num.NewUint(10000), generalAccountBalance.Balance) } func TestCreateSpotMarketAccounts(t *testing.T) { diff --git a/core/collateral/snapshot_test.go b/core/collateral/snapshot_test.go index 947ef43782..f8045b4861 100644 --- a/core/collateral/snapshot_test.go +++ b/core/collateral/snapshot_test.go @@ -294,6 +294,7 @@ func testSnapshotRestore(t *testing.T) { erc20 := types.AssetDetailsErc20{ ERC20: &types.ERC20{ ContractAddress: "0x6d53C489bbda35B8096C8b4Cb362e2889F82E19B", + ChainID: "1", }, } asset := types.Asset{ @@ -415,6 +416,7 @@ func TestSnapshotRoundTripViaEngine(t *testing.T) { erc20 := types.AssetDetailsErc20{ ERC20: &types.ERC20{ ContractAddress: "0x6d53C489bbda35B8096C8b4Cb362e2889F82E19B", + ChainID: "1", }, } asset := types.Asset{ diff --git a/core/config/config.go b/core/config/config.go index 1e941457b0..e48d43b94c 100644 --- a/core/config/config.go +++ b/core/config/config.go @@ -171,7 +171,11 @@ func (c Config) GetMaxMemoryFactor() (float64, error) { } func (c Config) HaveEthClient() bool { - return c.IsValidator() && len(c.Ethereum.RPCEndpoint) > 0 + return c.IsValidator() && len(c.Ethereum.RPCEndpoint) > 0 && len(c.Ethereum.EVMBridgeConfigs) > 0 +} + +func (c Config) IsNullChain() bool { + return c.Blockchain.ChainProvider == blockchain.ProviderNullChain } type Loader struct { diff --git a/core/config/watcher.go b/core/config/watcher.go index d44f3d1f3b..9588c74d67 100644 --- a/core/config/watcher.go +++ b/core/config/watcher.go @@ -143,7 +143,8 @@ func (w *Watcher) OnConfigUpdate(fns ...func(Config)) { w.mu.Unlock() } -// OnConfigUpdate register a function to be called when the configuration is getting updated. +// OnConfigUpdateWithID register a function to be called when the configuration +// is getting updated. func (w *Watcher) OnConfigUpdateWithID(fns ...func(Config)) []int { w.mu.Lock() // w.cfgUpdateListeners = append(w.cfgUpdateListeners, fns...) diff --git a/core/datasource/external/ethcall/engine.go b/core/datasource/external/ethcall/engine.go index 37e41f7d0d..8a633ce28e 100644 --- a/core/datasource/external/ethcall/engine.go +++ b/core/datasource/external/ethcall/engine.go @@ -102,7 +102,7 @@ func NewEngine(log *logging.Logger, cfg Config, isValidator bool, client EthRead } // EnsureChainID tells the engine which chainID it should be related to, and it confirms this against the its client. -func (e *Engine) EnsureChainID(chainID string, blockInterval uint64, confirmWithClient bool) { +func (e *Engine) EnsureChainID(ctx context.Context, chainID string, blockInterval uint64, confirmWithClient bool) { chainIDU, _ := strconv.ParseUint(chainID, 10, 64) e.chainID.Store(chainIDU) e.blockInterval.Store(blockInterval) @@ -113,7 +113,7 @@ func (e *Engine) EnsureChainID(chainID string, blockInterval uint64, confirmWith // if the node is a validator, we now check the chainID against the chain the client is connected to. if confirmWithClient { - cid, err := e.client.ChainID(context.Background()) + cid, err := e.client.ChainID(ctx) if err != nil { log.Panic("could not load chain ID", logging.Error(err)) } diff --git a/core/datasource/external/ethverifier/verifier.go b/core/datasource/external/ethverifier/verifier.go index 871325fc60..fc3a1c776a 100644 --- a/core/datasource/external/ethverifier/verifier.go +++ b/core/datasource/external/ethverifier/verifier.go @@ -124,6 +124,12 @@ type pendingCallEvent struct { } func (p pendingCallEvent) GetID() string { return p.callEvent.Hash() } +func (p pendingCallEvent) GetChainID() string { + if p.callEvent.SourceChainID == nil { + return "" + } + return strconv.Itoa(int(*p.callEvent.SourceChainID)) +} func (p pendingCallEvent) GetType() types.NodeVoteType { return types.NodeVoteTypeEthereumContractCallResult diff --git a/core/events/asset_test.go b/core/events/asset_test.go index a359495936..714591319f 100644 --- a/core/events/asset_test.go +++ b/core/events/asset_test.go @@ -79,6 +79,7 @@ func TestAssetERCDeepClone(t *testing.T) { Decimals: 5, Source: &types.AssetDetailsErc20{ ERC20: &types.ERC20{ + ChainID: "1", ContractAddress: "Contact Address", }, }, diff --git a/core/events/bus.go b/core/events/bus.go index 9253085e5b..e127cacea4 100644 --- a/core/events/bus.go +++ b/core/events/bus.go @@ -171,6 +171,7 @@ const ( PartyProfileUpdatedEvent TeamsStatsUpdatedEvent TimeWeightedNotionalPositionUpdatedEvent + CancelledOrdersEvent ) var ( @@ -271,6 +272,7 @@ var ( eventspb.BusEventType_BUS_EVENT_TYPE_PARTY_PROFILE_UPDATED: PartyProfileUpdatedEvent, 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, // If adding a type here, please also add it to datanode/broker/convert.go } @@ -362,6 +364,7 @@ var ( PartyProfileUpdatedEvent: eventspb.BusEventType_BUS_EVENT_TYPE_PARTY_PROFILE_UPDATED, 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, // If adding a type here, please also add it to datanode/broker/convert.go } @@ -452,6 +455,7 @@ var ( PartyProfileUpdatedEvent: "PartyProfileUpdatedEvent", TeamsStatsUpdatedEvent: "TeamsStatsUpdatedEvent", TimeWeightedNotionalPositionUpdatedEvent: "TimeWeightedNotionalPositionUpdatedEvent", + CancelledOrdersEvent: "CancelledOrdersEvent", } ) diff --git a/core/events/cancelled_orders.go b/core/events/cancelled_orders.go new file mode 100644 index 0000000000..78e9867976 --- /dev/null +++ b/core/events/cancelled_orders.go @@ -0,0 +1,88 @@ +// 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" + + eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" +) + +type CancelledOrders struct { + *Base + pb eventspb.CancelledOrders +} + +func NewCancelledOrdersEvent(ctx context.Context, marketID, partyID string, orders ...string) *CancelledOrders { + return &CancelledOrders{ + Base: newBase(ctx, CancelledOrdersEvent), + pb: eventspb.CancelledOrders{ + MarketId: marketID, + PartyId: partyID, + OrderIds: orders, + }, + } +} + +func (c CancelledOrders) MarketID() string { + return c.pb.MarketId +} + +func (c CancelledOrders) IsMarket(mID string) bool { + return c.pb.MarketId == mID +} + +func (c CancelledOrders) PartyID() string { + return c.pb.PartyId +} + +func (c CancelledOrders) IsParty(pID string) bool { + return c.pb.PartyId == pID +} + +func (c CancelledOrders) OrderIDs() []string { + return c.pb.OrderIds +} + +func (c CancelledOrders) CompositeCount() uint64 { + return uint64(len(c.pb.OrderIds)) +} + +func (c CancelledOrders) Proto() eventspb.CancelledOrders { + return c.pb +} + +func (c CancelledOrders) StreamMessage() *eventspb.BusEvent { + busEvent := newBusEventFromBase(c.Base) + cpy := c.pb + busEvent.Event = &eventspb.BusEvent_CancelledOrders{ + CancelledOrders: &cpy, + } + + return busEvent +} + +func (c CancelledOrders) StreamMarketMessage() *eventspb.BusEvent { + return c.StreamMessage() +} + +func CancelledOrdersEventFromStream(ctx context.Context, be *eventspb.BusEvent) *CancelledOrders { + m := be.GetCancelledOrders() + return &CancelledOrders{ + Base: newBaseFromBusEvent(ctx, CancelledOrdersEvent, be), + pb: *m, + } +} diff --git a/core/events/governance_proposal_test.go b/core/events/governance_proposal_test.go index 01aedccda0..b260993c41 100644 --- a/core/events/governance_proposal_test.go +++ b/core/events/governance_proposal_test.go @@ -49,6 +49,7 @@ func TestAssetProposalNewAssetDeepClone(t *testing.T) { Source: &types.AssetDetailsErc20{ ERC20: &types.ERC20{ ContractAddress: "Address", + ChainID: "1", }, }, }, diff --git a/core/events/transaction_result.go b/core/events/transaction_result.go index 8c81f3552c..7d189369e3 100644 --- a/core/events/transaction_result.go +++ b/core/events/transaction_result.go @@ -163,12 +163,12 @@ func (t *TransactionResult) setTx(tx interface{}) *TransactionResult { EthereumKeyRotateSubmission: tv, } case *commandspb.StopOrdersSubmission: - t.evt.Transaction = &eventspb.TransactionResult_StopOrderSubmission{ - StopOrderSubmission: tv, + t.evt.Transaction = &eventspb.TransactionResult_StopOrdersSubmission{ + StopOrdersSubmission: tv, } case *commandspb.StopOrdersCancellation: - t.evt.Transaction = &eventspb.TransactionResult_StopOrderCancellation{ - StopOrderCancellation: tv, + t.evt.Transaction = &eventspb.TransactionResult_StopOrdersCancellation{ + StopOrdersCancellation: tv, } case *commandspb.CreateReferralSet: t.evt.Transaction = &eventspb.TransactionResult_CreateReferralSet{ diff --git a/core/evtforward/config.go b/core/evtforward/config.go index 2c530996df..c4b722c6a9 100644 --- a/core/evtforward/config.go +++ b/core/evtforward/config.go @@ -43,8 +43,9 @@ type Config struct { BlockchainQueueAllowlist []string `description:" " long:"blockchain-queue-allowlist"` // Ethereum groups the configuration related to Ethereum implementation of // the Event Forwarder. - Ethereum ethereum.Config `group:"Ethereum" namespace:"ethereum"` - EthCall ethcall.Config `group:"EthCall" namespace:"ethcall"` + Ethereum ethereum.Config `group:"Ethereum" namespace:"ethereum"` + EVMBridges []ethereum.Config `group:"EVMBridges" namespace:"evmbridges"` + EthCall ethcall.Config `group:"EthCall" namespace:"ethcall"` } // NewDefaultConfig creates an instance of the package specific configuration. diff --git a/core/evtforward/engine.go b/core/evtforward/engine.go index affcafb741..1dc0a16095 100644 --- a/core/evtforward/engine.go +++ b/core/evtforward/engine.go @@ -30,7 +30,7 @@ const ( ) type Engine struct { - cfg Config + cfg ethereum.Config log *logging.Logger ethEngine *ethereum.Engine @@ -39,7 +39,7 @@ type Engine struct { multisigControlStartingBlock uint64 } -func NewEngine(log *logging.Logger, config Config) *Engine { +func NewEngine(log *logging.Logger, config ethereum.Config) *Engine { topEngineLogger := log.Named(topEngineLogger) topEngineLogger.SetLevel(config.Level.Get()) @@ -50,7 +50,7 @@ func NewEngine(log *logging.Logger, config Config) *Engine { } // ReloadConf updates the internal configuration of the Event Forwarder engine. -func (e *Engine) ReloadConf(config Config) { +func (e *Engine) ReloadConf(config ethereum.Config) { e.log.Info("Reloading configuration") if e.log.GetLevel() != config.Level.Get() { @@ -61,7 +61,7 @@ func (e *Engine) ReloadConf(config Config) { e.log.SetLevel(config.Level.Get()) } if e.ethEngine != nil { - e.ethEngine.ReloadConf(config.Ethereum) + e.ethEngine.ReloadConf(config) } } @@ -105,7 +105,7 @@ func (e *Engine) SetupEthereumEngine( ethLogger.SetLevel(config.Level.Get()) filterer, err := ethereum.NewLogFilterer( - e.cfg.Ethereum, + e.cfg, ethLogger, client, ethCfg.CollateralBridge(), @@ -113,19 +113,21 @@ func (e *Engine) SetupEthereumEngine( ethCfg.VestingBridge(), ethCfg.MultiSigControl(), assets, + ethCfg.ChainID(), ) if err != nil { return fmt.Errorf("couldn't create the log filterer: %w", err) } e.ethEngine = ethereum.NewEngine( - e.cfg.Ethereum, + e.cfg, ethLogger, filterer, forwarder, ethCfg.StakingBridge(), ethCfg.VestingBridge(), ethCfg.MultiSigControl(), + ethCfg.ChainID(), ) e.UpdateCollateralStartingBlock(filterer.CurrentHeight(context.Background())) @@ -137,6 +139,79 @@ func (e *Engine) SetupEthereumEngine( e.ethEngine.UpdateStakingStartingBlock(e.stakingStartingBlock) } + if err := filterer.VerifyClient(context.Background()); err != nil { + return err + } + + e.Start() + + return nil +} + +func (e *Engine) SetupSecondaryEthereumEngine( + client ethereum.Client, + forwarder ethereum.Forwarder, + config ethereum.Config, + ethCfg *types.EVMChainConfig, + assets ethereum.Assets, +) error { + if e.log.IsDebug() { + e.log.Debug("Secondary Ethereum configuration has been loaded") + } + + if e.ethEngine != nil { + if e.log.IsDebug() { + e.log.Debug("Stopping previous secondary Ethereum Event Forwarder") + } + e.Stop() + } + + if e.log.IsDebug() { + e.log.Debug("Setting up EVM Event Forwarder") + } + + ethLogger := e.log.Named(ethereumLogger) + ethLogger.SetLevel(config.Level.Get()) + + filterer, err := ethereum.NewLogFilterer( + e.cfg, + ethLogger, + client, + ethCfg.CollateralBridge(), + types.EthereumContract{}, + types.EthereumContract{}, + ethCfg.MultiSigControl(), + assets, + ethCfg.ChainID(), + ) + if err != nil { + return fmt.Errorf("couldn't create the log filterer: %w", err) + } + + e.ethEngine = ethereum.NewEngine( + e.cfg, + ethLogger, + filterer, + forwarder, + types.EthereumContract{}, + types.EthereumContract{}, + ethCfg.MultiSigControl(), + ethCfg.ChainID(), + ) + + e.UpdateCollateralStartingBlock(filterer.CurrentHeight(context.Background())) + + if e.multisigControlStartingBlock != 0 { + e.ethEngine.UpdateMultiSigControlStartingBlock(e.multisigControlStartingBlock) + } + if e.stakingStartingBlock != 0 { + e.ethEngine.UpdateStakingStartingBlock(e.stakingStartingBlock) + } + + if err := filterer.VerifyClient(context.Background()); err != nil { + return err + } + e.Start() return nil @@ -164,7 +239,7 @@ type NoopEngine struct { log *logging.Logger } -func NewNoopEngine(log *logging.Logger, config Config) *NoopEngine { +func NewNoopEngine(log *logging.Logger, config ethereum.Config) *NoopEngine { topEngineLogger := log.Named(topEngineLogger) topEngineLogger.SetLevel(config.Level.Get()) @@ -173,7 +248,7 @@ func NewNoopEngine(log *logging.Logger, config Config) *NoopEngine { } } -func (e *NoopEngine) ReloadConf(_ Config) { +func (e *NoopEngine) ReloadConf(_ ethereum.Config) { if e.log.IsDebug() { e.log.Debug("Reloading Ethereum configuration is a no-op") } @@ -199,6 +274,20 @@ func (e *NoopEngine) SetupEthereumEngine( return nil } +func (e *NoopEngine) SetupSecondaryEthereumEngine( + _ ethereum.Client, + _ ethereum.Forwarder, + _ ethereum.Config, + _ *types.EVMChainConfig, + _ ethereum.Assets, +) error { + if e.log.IsDebug() { + e.log.Debug("Starting secondary Ethereum configuration is a no-op") + } + + return nil +} + func (e *NoopEngine) Start() { if e.log.IsDebug() { e.log.Debug("Starting Ethereum configuration is a no-op") diff --git a/core/evtforward/ethereum/config.go b/core/evtforward/ethereum/config.go index 14421ab092..8d92a5fa1b 100644 --- a/core/evtforward/ethereum/config.go +++ b/core/evtforward/ethereum/config.go @@ -33,6 +33,8 @@ type Config struct { Level encoding.LogLevel `long:"log-level"` MaxEthereumBlocks uint64 `long:"max-ethereum-blocks"` PollEventRetryDuration encoding.Duration + ChainID string + SkipClientVerification bool } func NewDefaultConfig() Config { @@ -42,3 +44,13 @@ func NewDefaultConfig() Config { MaxEthereumBlocks: maxEthereumBlocks, } } + +func (c *Config) setDefaults() { + if c.MaxEthereumBlocks == 0 { + c.MaxEthereumBlocks = maxEthereumBlocks + } + + if c.PollEventRetryDuration.Duration == 0 { + c.PollEventRetryDuration.Duration = defaultDurationBetweenTwoRetry + } +} diff --git a/core/evtforward/ethereum/engine.go b/core/evtforward/ethereum/engine.go index 78a09c7f1d..f8fc0c383a 100644 --- a/core/evtforward/ethereum/engine.go +++ b/core/evtforward/ethereum/engine.go @@ -55,12 +55,33 @@ type Engine struct { nextStakingBlockNumber uint64 nextVestingBlockNumber uint64 + chainID string + shouldFilterVestingBridge bool shouldFilterStakingBridge bool cancelEthereumQueries context.CancelFunc } +type fwdWrapper struct { + f Forwarder + chainID string +} + +func (f fwdWrapper) ForwardFromSelf(event *commandspb.ChainEvent) { + // add the chainID of the source on events where this is necessary + switch ev := event.Event.(type) { + case *commandspb.ChainEvent_Erc20: + ev.Erc20.ChainId = f.chainID + case *commandspb.ChainEvent_Erc20Multisig: + ev.Erc20Multisig.ChainId = f.chainID + default: + // do nothing + } + + f.f.ForwardFromSelf(event) +} + func NewEngine( cfg Config, log *logging.Logger, @@ -69,20 +90,27 @@ func NewEngine( stakingDeployment types.EthereumContract, vestingDeployment types.EthereumContract, multiSigDeployment types.EthereumContract, + chainID string, ) *Engine { l := log.Named(engineLogger) + // given that the EVM bridge configs are and array the "unset" values do not get populated + // with reasonable defaults so we need to make sure they are set to something reasonable + // if they are left out + cfg.setDefaults() + return &Engine{ cfg: cfg, log: l, poller: newPoller(cfg.PollEventRetryDuration.Get()), filterer: filterer, - forwarder: forwarder, + forwarder: fwdWrapper{forwarder, chainID}, shouldFilterStakingBridge: stakingDeployment.HasAddress(), nextStakingBlockNumber: stakingDeployment.DeploymentBlockHeight(), shouldFilterVestingBridge: vestingDeployment.HasAddress(), nextVestingBlockNumber: vestingDeployment.DeploymentBlockHeight(), nextMultiSigControlBlockNumber: multiSigDeployment.DeploymentBlockHeight(), + chainID: chainID, } } @@ -118,7 +146,6 @@ func (e *Engine) Start() { defer cancelEthereumQueries() e.cancelEthereumQueries = cancelEthereumQueries - if e.log.IsDebug() { e.log.Debug("Start listening for Ethereum events from") } @@ -126,6 +153,7 @@ func (e *Engine) Start() { e.poller.Loop(func() { 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), diff --git a/core/evtforward/ethereum/filterer.go b/core/evtforward/ethereum/filterer.go index c1e99fea4e..f9868eb244 100644 --- a/core/evtforward/ethereum/filterer.go +++ b/core/evtforward/ethereum/filterer.go @@ -77,7 +77,8 @@ type LogFilterer struct { cfg Config log *logging.Logger - client Client + client Client + chainID string collateralBridgeABI ethabi.ABI collateralBridgeFilterer *bridge.Erc20BridgeLogicRestrictedFilterer @@ -87,8 +88,7 @@ type LogFilterer struct { stakingBridgeFilterer *staking.StakingFilterer stakingBridge types.EthereumContract - vestingBridgeFilterer *staking.StakingFilterer - vestingBridge types.EthereumContract + vestingBridge types.EthereumContract multiSigControlABI ethabi.ABI multiSigControlFilterer *multisig.MultisigControlFilterer @@ -106,6 +106,7 @@ func NewLogFilterer( vestingBridge types.EthereumContract, multiSigControl types.EthereumContract, assets Assets, + chainID string, ) (*LogFilterer, error) { l := log.Named(logFiltererLogger) @@ -119,9 +120,12 @@ func NewLogFilterer( return nil, fmt.Errorf("couldn't load collateral bridge ABI: %w", err) } - stakingBridgeFilterer, err := staking.NewStakingFilterer(stakingBridge.Address(), ethClient) - if err != nil { - return nil, fmt.Errorf("couldn't create log filterer for staking bridge: %w", err) + var stakingBridgeFilterer *staking.StakingFilterer + if stakingBridge.HasAddress() { + stakingBridgeFilterer, err = staking.NewStakingFilterer(stakingBridge.Address(), ethClient) + if err != nil { + return nil, fmt.Errorf("couldn't create log filterer for staking bridge: %w", err) + } } stakingBridgeABI, err := ethabi.JSON(strings.NewReader(staking.StakingMetaData.ABI)) @@ -129,11 +133,6 @@ func NewLogFilterer( return nil, fmt.Errorf("couldn't load staking bridge ABI: %w", err) } - vestingBridgeFilterer, err := staking.NewStakingFilterer(vestingBridge.Address(), ethClient) - if err != nil { - return nil, fmt.Errorf("couldn't create log filterer for vesting bridge: %w", err) - } - multiSigControlFilterer, err := multisig.NewMultisigControlFilterer(multiSigControl.Address(), ethClient) if err != nil { return nil, fmt.Errorf("couldn't create log filterer for multisig control: %w", err) @@ -148,13 +147,13 @@ func NewLogFilterer( cfg: cfg, log: l, client: ethClient, + chainID: chainID, collateralBridgeABI: collateralBridgeABI, collateralBridgeFilterer: collateralBridgeFilterer, collateralBridge: collateralBridge, stakingBridgeABI: stakingBridgeABI, stakingBridgeFilterer: stakingBridgeFilterer, stakingBridge: stakingBridge, - vestingBridgeFilterer: vestingBridgeFilterer, vestingBridge: vestingBridge, assets: assets, multiSigControl: multiSigControl, @@ -175,6 +174,7 @@ func (f *LogFilterer) CurrentHeight(ctx context.Context) uint64 { if f.log.IsDebug() { f.log.Debug("Current height of Ethereum blockchain has been retrieved", logging.Uint64("height", height), + logging.String("chain-id", f.chainID), ) } @@ -248,6 +248,38 @@ func (f *LogFilterer) FilterMultisigControlEvents(ctx context.Context, startAt, } } +// VerifyClient checks that the configured RPC node is able to properly query contract logs. +func (f *LogFilterer) VerifyClient(ctx context.Context) error { + if f.cfg.SkipClientVerification { + f.log.Warn("skipping client verification", logging.String("chain-id", f.chainID)) + return nil + } + + f.log.Info("verifying forwarder client", + logging.String("chain-id", f.chainID), + logging.String("multisig-address", f.multiSigControl.HexAddress()), + logging.Uint64("deployment-height", f.multiSigControl.DeploymentBlockHeight()), + ) + query := f.newMultisigControlQuery( + f.multiSigControl.DeploymentBlockHeight(), + f.multiSigControl.DeploymentBlockHeight()+1, + ) + + // we expect logs for the multisig at its deployment height, if the filter call fails + // or we don't find any logs then the Vega node isn't talking to a reliable RPC node + // or is pointing to the wrong chain. + logs, err := f.client.FilterLogs(ctx, query) + if err != nil { + return fmt.Errorf("please check your RPC node - failed to query contract logs: %w", err) + } + + if len(logs) == 0 { + return fmt.Errorf("please check your RPC node - found no contract logs") + } + + return nil +} + func (f *LogFilterer) filterLogs(ctx context.Context, query eth.FilterQuery) []ethtypes.Log { var logs []ethtypes.Log @@ -263,6 +295,7 @@ func (f *LogFilterer) filterLogs(ctx context.Context, query eth.FilterQuery) []e toBlock = query.ToBlock } f.log.Error("Couldn't subscribe to the Ethereum log filterer", + logging.String("chain-id", f.chainID), logging.BigInt("from-block", fromBlock), logging.BigInt("to-block", toBlock), logging.EthereumAddresses(query.Addresses), @@ -418,6 +451,7 @@ func (f *LogFilterer) toCollateralChainEvent(log ethtypes.Log) *types.ChainEvent func (f *LogFilterer) debugAssetWithdrawn(event *bridge.Erc20BridgeLogicRestrictedAssetWithdrawn) { if f.log.IsDebug() { f.log.Debug("Found AssetWithdrawn event", + logging.String("chain-id", f.chainID), logging.String("bridge-address", f.collateralBridge.HexAddress()), logging.String("user-ethereum-address", event.UserAddress.Hex()), logging.String("asset-id", event.AssetSource.Hex()), @@ -447,6 +481,7 @@ func (f *LogFilterer) toERC20Withdraw(event *bridge.Erc20BridgeLogicRestrictedAs func (f *LogFilterer) debugAssetDeposited(event *bridge.Erc20BridgeLogicRestrictedAssetDeposited) { if f.log.IsDebug() { f.log.Debug("Found AssetDeposited event", + logging.String("chain-id", f.chainID), logging.String("bridge-address", f.collateralBridge.HexAddress()), logging.String("user-ethereum-address", event.UserAddress.Hex()), logging.String("user-vega-address", hex.EncodeToString(event.VegaPublicKey[:])), @@ -478,6 +513,7 @@ func (f *LogFilterer) toERC20Deposit(event *bridge.Erc20BridgeLogicRestrictedAss func (f *LogFilterer) debugAssetListed(event *bridge.Erc20BridgeLogicRestrictedAssetListed) { if f.log.IsDebug() { f.log.Debug("Found AssetListed event", + logging.String("chain-id", f.chainID), logging.String("bridge-address", f.collateralBridge.HexAddress()), logging.String("asset-id", event.AssetSource.Hex()), ) @@ -505,6 +541,7 @@ func toERC20AssetList(event *bridge.Erc20BridgeLogicRestrictedAssetListed) *comm func (f *LogFilterer) debugAssetRemoved(event *bridge.Erc20BridgeLogicRestrictedAssetRemoved) { if f.log.IsDebug() { f.log.Debug("Found AssetRemoved event", + logging.String("chain-id", f.chainID), logging.String("bridge-address", f.collateralBridge.HexAddress()), logging.String("asset-id", event.AssetSource.Hex()), ) @@ -531,6 +568,7 @@ func toERC20AssetDelist(event *bridge.Erc20BridgeLogicRestrictedAssetRemoved) *c func (f *LogFilterer) debugAssetLimitsUpdated(event *bridge.Erc20BridgeLogicRestrictedAssetLimitsUpdated) { if f.log.IsDebug() { f.log.Debug("Found AssetLimitsUpdated event", + logging.String("chain-id", f.chainID), logging.String("bridge-address", f.collateralBridge.HexAddress()), logging.String("asset-id", event.AssetSource.Hex()), ) @@ -560,6 +598,7 @@ func (f *LogFilterer) toERC20AssetLimitsUpdated(event *bridge.Erc20BridgeLogicRe func (f *LogFilterer) debugBridgeStopped() { if f.log.IsDebug() { f.log.Debug("Found BridgeStopped event", + logging.String("chain-id", f.chainID), logging.String("bridge-address", f.collateralBridge.HexAddress()), ) } @@ -583,6 +622,7 @@ func (f *LogFilterer) toERC20BridgeStopped(event *bridge.Erc20BridgeLogicRestric func (f *LogFilterer) debugBridgeResumed() { if f.log.IsDebug() { f.log.Debug("Found BridgeResumed event", + logging.String("chain-id", f.chainID), logging.String("bridge-address", f.collateralBridge.HexAddress()), ) } @@ -638,6 +678,7 @@ func (f *LogFilterer) toStakingChainEvent(log ethtypes.Log, blockTime uint64) *t func (f *LogFilterer) debugStakeDeposited(event *staking.StakingStakeDeposited) { if f.log.IsDebug() { f.log.Debug("Found StakeDeposited event", + logging.String("chain-id", f.chainID), logging.String("bridge-address", f.stakingBridge.HexAddress()), logging.String("user-ethereum-address", event.User.Hex()), logging.String("user-vega-address", hex.EncodeToString(event.VegaPublicKey[:])), @@ -669,6 +710,7 @@ func toStakeDeposited(event *staking.StakingStakeDeposited, blockTime uint64) *c func (f *LogFilterer) debugStakeRemoved(event *staking.StakingStakeRemoved) { if f.log.IsDebug() { f.log.Debug("Found StakeRemoved event", + logging.String("chain-id", f.chainID), logging.String("bridge-address", f.stakingBridge.HexAddress()), logging.String("user-ethereum-address", event.User.Hex()), logging.String("user-vega-address", hex.EncodeToString(event.VegaPublicKey[:])), @@ -733,6 +775,7 @@ func (f *LogFilterer) toMultisigControlChainEvent(log ethtypes.Log, blockTime ui func (f *LogFilterer) debugSignerAdded(event *multisig.MultisigControlSignerAdded) { if f.log.IsDebug() { f.log.Debug("Found SignerAdded event", + logging.String("chain-id", f.chainID), logging.String("multisig-control-address", f.multiSigControl.HexAddress()), logging.String("new-signer", event.NewSigner.Hex()), logging.String("nonce", event.Nonce.String()), @@ -762,6 +805,7 @@ func toSignerAdded(event *multisig.MultisigControlSignerAdded, blockTime uint64) func (f *LogFilterer) debugSignerRemoved(event *multisig.MultisigControlSignerRemoved) { if f.log.IsDebug() { f.log.Debug("Found SignerRemoved event", + logging.String("chain-id", f.chainID), logging.String("multisig-control-address", f.multiSigControl.HexAddress()), logging.String("oldsigner", event.OldSigner.Hex()), logging.String("nonce", event.Nonce.String()), @@ -791,6 +835,7 @@ func toSignerRemoved(event *multisig.MultisigControlSignerRemoved, blockTime uin func (f *LogFilterer) debugThresholdSet(event *multisig.MultisigControlThresholdSet) { if f.log.IsDebug() { f.log.Debug("Found SignerRemoved event", + logging.String("chain-id", f.chainID), logging.String("multisig-control-address", f.multiSigControl.HexAddress()), logging.Uint16("new-threshold", event.NewThreshold), logging.String("nonce", event.Nonce.String()), diff --git a/core/evtforward/forwarder.go b/core/evtforward/forwarder.go index ca8ff620ea..4d8c2026c0 100644 --- a/core/evtforward/forwarder.go +++ b/core/evtforward/forwarder.go @@ -80,8 +80,7 @@ type Forwarder struct { timeService TimeService nodes []string - top ValidatorTopology - efss *efSnapshotState + top ValidatorTopology } type tsEvt struct { @@ -90,7 +89,12 @@ type tsEvt struct { } // New creates a new instance of the event forwarder. -func New(log *logging.Logger, cfg Config, cmd Commander, timeService TimeService, top ValidatorTopology) *Forwarder { +func New(log *logging.Logger, + cfg Config, + cmd Commander, + timeService TimeService, + top ValidatorTopology, +) *Forwarder { log = log.Named(forwarderLogger) log.SetLevel(cfg.Level.Get()) var allowlist atomic.Value @@ -109,7 +113,6 @@ func New(log *logging.Logger, cfg Config, cmd Commander, timeService TimeService evts: map[string]tsEvt{}, top: top, bcQueueAllowlist: allowlist, - efss: &efSnapshotState{}, } forwarder.updateValidatorsList() return forwarder diff --git a/core/evtforward/forwarder_test.go b/core/evtforward/forwarder_test.go index e78ab31932..067c8a35bc 100644 --- a/core/evtforward/forwarder_test.go +++ b/core/evtforward/forwarder_test.go @@ -76,9 +76,7 @@ func getTestEvtFwd(t *testing.T) *testEvtFwd { cfg := evtforward.NewDefaultConfig() // add the pubkeys cfg.BlockchainQueueAllowlist = allowlist - evtfwd := evtforward.New( - logging.NewTestLogger(), cfg, - cmd, tim, top) + evtfwd := evtforward.New(logging.NewTestLogger(), cfg, cmd, tim, top) return &testEvtFwd{ Forwarder: evtfwd, diff --git a/core/evtforward/snapshot.go b/core/evtforward/snapshot.go index 1d383a8686..98c8fef8f5 100644 --- a/core/evtforward/snapshot.go +++ b/core/evtforward/snapshot.go @@ -33,8 +33,6 @@ var ( } ) -type efSnapshotState struct{} - func (f *Forwarder) Namespace() types.SnapshotNamespace { return types.EventForwarderSnapshot } @@ -51,7 +49,7 @@ func (f *Forwarder) serialise() ([]byte, error) { slice := make([]*snapshotpb.EventForwarderBucket, 0, f.ackedEvts.Size()) iter := f.ackedEvts.events.Iterator() for iter.Next() { - v := (iter.Value().(*ackedEvtBucket)) + v := iter.Value().(*ackedEvtBucket) slice = append(slice, &snapshotpb.EventForwarderBucket{ Ts: v.ts, Hashes: v.hashes, diff --git a/core/execution/common/errors.go b/core/execution/common/errors.go index d8432ce8b4..2d110b6843 100644 --- a/core/execution/common/errors.go +++ b/core/execution/common/errors.go @@ -81,4 +81,6 @@ var ( ErrStopOrderNotAllowedDuringOpeningAuction = errors.New("stop orders are not accepted during the opening auction") // ErrStopOrderNotAllowedSameExpiryTimeForOCO is returned if both sides of an OCO have the same expiry time. 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") ) diff --git a/core/execution/common/interfaces.go b/core/execution/common/interfaces.go index 156885d7f9..3ab1f1cbe4 100644 --- a/core/execution/common/interfaces.go +++ b/core/execution/common/interfaces.go @@ -49,7 +49,8 @@ type OracleEngine interface { // @TODO the interface shouldn't be imported here. type PriceMonitor interface { OnTimeUpdate(now time.Time) - CheckPrice(ctx context.Context, as price.AuctionState, trades []*types.Trade, persistent bool, recordInHistory bool) bool + CheckPrice(ctx context.Context, as price.AuctionState, price *num.Uint, persistent bool, recordInHistory bool) bool + ResetPriceHistory(price *num.Uint) GetCurrentBounds() []*types.PriceMonitoringBounds SetMinDuration(d time.Duration) GetValidPriceRange() (num.WrappedDecimal, num.WrappedDecimal) @@ -177,7 +178,7 @@ type Collateral interface { ClearInsurancepool(ctx context.Context, marketID string, asset string, clearFees bool) ([]*types.LedgerMovement, error) TransferToHoldingAccount(ctx context.Context, transfer *types.Transfer) (*types.LedgerMovement, error) ReleaseFromHoldingAccount(ctx context.Context, transfer *types.Transfer) (*types.LedgerMovement, error) - ClearSpotMarket(ctx context.Context, mktID, quoteAsset string) ([]*types.LedgerMovement, error) + ClearSpotMarket(ctx context.Context, mktID, quoteAsset string, parties []string) ([]*types.LedgerMovement, error) PartyHasSufficientBalance(asset, partyID string, amount *num.Uint) error PartyCanCoverFees(asset, mktID, partyID string, amount *num.Uint) error TransferSpot(ctx context.Context, partyID, toPartyID, asset string, quantity *num.Uint) (*types.LedgerMovement, error) diff --git a/core/execution/common/liquidity_provision.go b/core/execution/common/liquidity_provision.go index bfd6bf960f..da452f3073 100644 --- a/core/execution/common/liquidity_provision.go +++ b/core/execution/common/liquidity_provision.go @@ -28,6 +28,7 @@ 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" ) var ErrCommitmentAmountTooLow = errors.New("commitment amount is too low") @@ -55,7 +56,7 @@ type MarketLiquidity struct { marketID string asset string - priceFactor *num.Uint + priceFactor num.Decimal priceRange num.Decimal earlyExitPenalty num.Decimal @@ -76,7 +77,7 @@ func NewMarketLiquidity( marketType marketType, marketID string, asset string, - priceFactor *num.Uint, + priceFactor num.Decimal, priceRange num.Decimal, ) *MarketLiquidity { ml := &MarketLiquidity{ @@ -661,6 +662,12 @@ func (m *MarketLiquidity) CancelLiquidityProvision(ctx context.Context, party st return err } } + // remove ELS for the cancelled LP if cancellation was applied immediately (e.g. during opening auction) + if applied { + m.equityShares.SetPartyStake(party, amendment.CommitmentAmount) + // force update for all shares + _ = m.equityShares.AllShares() + } return nil } @@ -781,42 +788,42 @@ func (m *MarketLiquidity) ValidOrdersPriceRange() (*num.Uint, *num.Uint, error) // (1 + priceRange) * midPrice upperBoundPriceD := num.DecimalOne().Add(m.priceRange).Mul(midPrice) - priceFactor := m.priceFactor.ToDecimal() - // ceil lower bound - ceiledLowerBound, rL := lowerBoundPriceD.QuoRem(priceFactor, int32(0)) + ceiledLowerBound, rL := lowerBoundPriceD.QuoRem(m.priceFactor, int32(0)) if !rL.IsZero() { ceiledLowerBound = ceiledLowerBound.Add(num.DecimalOne()) } - lowerBoundPriceD = ceiledLowerBound.Mul(priceFactor) + lowerBoundPriceD = ceiledLowerBound.Mul(m.priceFactor) // floor upper bound - flooredUpperBound, _ := upperBoundPriceD.QuoRem(priceFactor, int32(0)) - upperBoundPriceD = flooredUpperBound.Mul(priceFactor) + flooredUpperBound, _ := upperBoundPriceD.QuoRem(m.priceFactor, int32(0)) + upperBoundPriceD = flooredUpperBound.Mul(m.priceFactor) lowerBound, _ := num.UintFromDecimal(lowerBoundPriceD) upperBound, _ := num.UintFromDecimal(upperBoundPriceD) // floor at 1 to avoid non-positive value + uintPriceFactor, _ := num.UintFromDecimal(m.priceFactor) + if lowerBound.IsNegative() || lowerBound.IsZero() { - lowerBound = m.priceFactor + lowerBound = uintPriceFactor } if lowerBound.GTE(upperBound) { // if we ended up with overlapping upper and lower bound we set the upper bound to lower bound plus one tick. - upperBound = upperBound.Add(lowerBound, m.priceFactor) + upperBound = upperBound.Add(lowerBound, uintPriceFactor) } // we can't have lower bound >= best static ask as then a buy order with that price would trade on entry // so place it one tick to the left if lowerBound.GTE(bestAsk) { - lowerBound = num.UintZero().Sub(bestAsk, m.priceFactor) + lowerBound = num.UintZero().Sub(bestAsk, uintPriceFactor) } // we can't have upper bound <= best static bid as then a sell order with that price would trade on entry // so place it one tick to the right if upperBound.LTE(bestAsk) { - upperBound = num.UintZero().Add(bestAsk, m.priceFactor) + upperBound = num.UintZero().Add(bestAsk, uintPriceFactor) } return lowerBound, upperBound, nil @@ -886,3 +893,45 @@ 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_test.go b/core/execution/common/liquidity_provision_test.go index 78fb4ec2d5..bc61675845 100644 --- a/core/execution/common/liquidity_provision_test.go +++ b/core/execution/common/liquidity_provision_test.go @@ -96,7 +96,7 @@ func newMarketLiquidity(t *testing.T) *marketLiquidityTest { common.SpotMarketType, marketID, settlementAsset, - num.NewUint(1), + num.DecimalOne(), num.NewDecimalFromFloat(0.5), ) @@ -198,6 +198,7 @@ func TestLiquidityProvisionsFeeDistribution(t *testing.T) { Source: types.AssetDetailsErc20{ ERC20: &types.ERC20{ ContractAddress: "addrs", + ChainID: "1", }, }, }, @@ -412,6 +413,7 @@ func TestLiquidityProvisionsAmendments(t *testing.T) { Source: types.AssetDetailsErc20{ ERC20: &types.ERC20{ ContractAddress: "addrs", + ChainID: "1", }, }, }, @@ -528,6 +530,7 @@ func TestCancelLiquidityProvisionDuringOpeningAuction(t *testing.T) { Source: types.AssetDetailsErc20{ ERC20: &types.ERC20{ ContractAddress: "addrs", + ChainID: "1", }, }, }, @@ -610,6 +613,8 @@ func TestCancelLiquidityProvisionDuringOpeningAuction(t *testing.T) { }). AnyTimes() + testLiquidity.equityShares.EXPECT().SetPartyStake(provider, gomock.Any()).Times(1) + testLiquidity.equityShares.EXPECT().AllShares().Times(1).Return(nil) err = testLiquidity.marketLiquidity.CancelLiquidityProvision(ctx, provider) assert.NoError(t, err) diff --git a/core/execution/common/mark_price.go b/core/execution/common/mark_price.go index 2eaeac842e..cb0fc6faaf 100644 --- a/core/execution/common/mark_price.go +++ b/core/execution/common/mark_price.go @@ -275,12 +275,16 @@ func (mpc *CompositePriceCalculator) GetConfig() *types.CompositePriceConfigurat return mpc.config } -func (mpc *CompositePriceCalculator) updateMarkPriceIfNotInAuction(ctx context.Context, checkPriceMonitor bool, priceMonitor PriceMonitor, as AuctionState, mpcCandidate *num.Uint) error { +func (mpc *CompositePriceCalculator) updateMarkPriceIfNotInAuction(ctx context.Context, checkPriceMonitor bool, priceMonitor PriceMonitor, as AuctionState, mpcCandidate *num.Uint, resetPriceMonitoringEngine bool) error { if !checkPriceMonitor { mpc.price = mpcCandidate return nil } - priceMonitor.CheckPrice(ctx, as, []*types.Trade{{Price: mpcCandidate, Size: 1}}, true, true) + if resetPriceMonitoringEngine { + priceMonitor.ResetPriceHistory(mpcCandidate) + } else { + priceMonitor.CheckPrice(ctx, as, mpcCandidate, true, true) + } if as.InAuction() || as.AuctionStart() { return fmt.Errorf("price monitoring failed for the new mark price") } @@ -290,13 +294,13 @@ func (mpc *CompositePriceCalculator) updateMarkPriceIfNotInAuction(ctx context.C // CalculateMarkPrice is called at the end of each mark price calculation interval and calculates the mark price // using the mark price type methodology. -func (mpc *CompositePriceCalculator) CalculateMarkPrice(ctx context.Context, priceMonitor PriceMonitor, as AuctionState, t int64, ob *matching.CachedOrderBook, markPriceFrequency time.Duration, initialScalingFactor, slippageFactor, shortRiskFactor, longRiskFactor num.Decimal, checkPriceMonitor bool) (*num.Uint, error) { +func (mpc *CompositePriceCalculator) CalculateMarkPrice(ctx context.Context, priceMonitor PriceMonitor, as AuctionState, t int64, ob *matching.CachedOrderBook, markPriceFrequency time.Duration, initialScalingFactor, slippageFactor, shortRiskFactor, longRiskFactor num.Decimal, checkPriceMonitor bool, resetPriceMonitoringEngine bool) (*num.Uint, error) { var err error if mpc.config.CompositePriceType == types.CompositePriceTypeByLastTrade { // if there are no trades, the mark price remains what it was before. if len(mpc.trades) > 0 { mpcCandidate := mpc.trades[len(mpc.trades)-1].Price.Clone() - err = mpc.updateMarkPriceIfNotInAuction(ctx, checkPriceMonitor, priceMonitor, as, mpcCandidate) + err = mpc.updateMarkPriceIfNotInAuction(ctx, checkPriceMonitor, priceMonitor, as, mpcCandidate, resetPriceMonitoringEngine) } mpc.trades = []*types.Trade{} return mpc.price, err @@ -324,11 +328,11 @@ func (mpc *CompositePriceCalculator) CalculateMarkPrice(ctx context.Context, pri } if mpc.config.CompositePriceType == types.CompositePriceTypeByMedian { if p := CompositePriceByMedian(mpc.priceSources, mpc.sourceLastUpdate, mpc.config.SourceStalenessTolerance, t); p != nil && !p.IsZero() { - err = mpc.updateMarkPriceIfNotInAuction(ctx, checkPriceMonitor, priceMonitor, as, p) + err = mpc.updateMarkPriceIfNotInAuction(ctx, checkPriceMonitor, priceMonitor, as, p, resetPriceMonitoringEngine) } } else { if p := CompositePriceByWeight(mpc.priceSources, mpc.config.SourceWeights, mpc.sourceLastUpdate, mpc.config.SourceStalenessTolerance, t); p != nil && !p.IsZero() { - err = mpc.updateMarkPriceIfNotInAuction(ctx, checkPriceMonitor, priceMonitor, as, p) + err = mpc.updateMarkPriceIfNotInAuction(ctx, checkPriceMonitor, priceMonitor, as, p, resetPriceMonitoringEngine) } } mpc.trades = []*types.Trade{} diff --git a/core/execution/common/market_activity_tracker.go b/core/execution/common/market_activity_tracker.go index 1020f6754d..2f9d3295ff 100644 --- a/core/execution/common/market_activity_tracker.go +++ b/core/execution/common/market_activity_tracker.go @@ -30,7 +30,8 @@ import ( lproto "code.vegaprotocol.io/vega/libs/proto" "code.vegaprotocol.io/vega/logging" "code.vegaprotocol.io/vega/protos/vega" - proto "code.vegaprotocol.io/vega/protos/vega" + + "github.com/shopspring/decimal" ) const ( @@ -64,14 +65,17 @@ type marketTracker struct { makerFeesReceived map[string]*num.Uint makerFeesPaid map[string]*num.Uint lpFees map[string]*num.Uint + infraFees map[string]*num.Uint + lpPaidFees map[string]*num.Uint totalMakerFeesReceived *num.Uint totalMakerFeesPaid *num.Uint totalLpFees *num.Uint - twPosition map[string]*twPosition - partyM2M map[string]num.Decimal - twNotional map[string]*twNotional + twPosition map[string]*twPosition + partyM2M map[string]num.Decimal + partyRealisedReturn map[string]num.Decimal + twNotional map[string]*twNotional // historical data. epochMakerFeesReceived []map[string]*num.Uint @@ -83,6 +87,7 @@ type marketTracker struct { epochTimeWeightedPosition []map[string]uint64 epochTimeWeightedNotional []map[string]*num.Uint epochPartyM2M []map[string]num.Decimal + epochPartyRealisedReturn []map[string]num.Decimal valueTraded *num.Uint proposersPaid map[string]struct{} // identifier of payout_asset : funder : markets_in_scope @@ -106,11 +111,10 @@ type MarketActivityTracker struct { partyContributionCache map[string][]*types.PartyContributionScore partyTakerNotionalVolume map[string]*num.Uint marketToPartyTakerNotionalVolume map[string]map[string]*num.Uint - // transient map that is used and accessible only between the end of one epoch and the beginning of the next - // it's not needed for the snapshot because the switching between end of one epoch and the beginning of the new one is atommic. - takerFeesPaidInEpoch map[string]map[string]map[string]*num.Uint - ss *snapshotState - broker Broker + takerFeesPaidInEpoch []map[string]map[string]map[string]*num.Uint + + ss *snapshotState + broker Broker } // NewMarketActivityTracker instantiates the fees tracker. @@ -124,7 +128,7 @@ func NewMarketActivityTracker(log *logging.Logger, teams Teams, balanceChecker A partyTakerNotionalVolume: map[string]*num.Uint{}, marketToPartyTakerNotionalVolume: map[string]map[string]*num.Uint{}, ss: &snapshotState{}, - takerFeesPaidInEpoch: map[string]map[string]map[string]*num.Uint{}, + takerFeesPaidInEpoch: []map[string]map[string]map[string]*num.Uint{}, broker: broker, } @@ -179,11 +183,14 @@ func (mat *MarketActivityTracker) MarketProposed(asset, marketID, proposer strin makerFeesReceived: map[string]*num.Uint{}, makerFeesPaid: map[string]*num.Uint{}, lpFees: map[string]*num.Uint{}, + infraFees: map[string]*num.Uint{}, + lpPaidFees: map[string]*num.Uint{}, totalMakerFeesReceived: num.UintZero(), totalMakerFeesPaid: num.UintZero(), totalLpFees: num.UintZero(), twPosition: map[string]*twPosition{}, partyM2M: map[string]num.Decimal{}, + partyRealisedReturn: map[string]num.Decimal{}, twNotional: map[string]*twNotional{}, epochTotalMakerFeesReceived: []*num.Uint{}, epochTotalMakerFeesPaid: []*num.Uint{}, @@ -192,6 +199,7 @@ func (mat *MarketActivityTracker) MarketProposed(asset, marketID, proposer strin epochMakerFeesPaid: []map[string]*num.Uint{}, epochLpFees: []map[string]*num.Uint{}, epochPartyM2M: []map[string]num.Decimal{}, + epochPartyRealisedReturn: []map[string]decimal.Decimal{}, epochTimeWeightedPosition: []map[string]uint64{}, epochTimeWeightedNotional: []map[string]*num.Uint{}, allPartiesCache: map[string]struct{}{}, @@ -265,7 +273,7 @@ func (mat *MarketActivityTracker) GetMarketsWithEligibleProposer(asset string, m Asset: asset, Market: v, Score: score, - Metric: proto.DispatchMetric_DISPATCH_METRIC_MARKET_VALUE, + Metric: vega.DispatchMetric_DISPATCH_METRIC_MARKET_VALUE, }) totalScore = totalScore.Add(score) } @@ -276,7 +284,7 @@ func (mat *MarketActivityTracker) GetMarketsWithEligibleProposer(asset string, m for _, mcs := range scores { scoresString += mcs.Market + ":" + mcs.Score.String() + "," } - mat.log.Info("markets contributions:", logging.String("asset", asset), logging.String("metric", proto.DispatchMetric_name[int32(proto.DispatchMetric_DISPATCH_METRIC_MARKET_VALUE)]), logging.String("market-scores", scoresString[:len(scoresString)-1])) + mat.log.Info("markets contributions:", logging.String("asset", asset), logging.String("metric", vega.DispatchMetric_name[int32(vega.DispatchMetric_DISPATCH_METRIC_MARKET_VALUE)]), logging.String("market-scores", scoresString[:len(scoresString)-1])) return scores } @@ -382,25 +390,44 @@ func (mat *MarketActivityTracker) RemoveMarket(asset, marketID string) { } } +func (mt *marketTracker) aggregatedFees() map[string]*num.Uint { + totalFees := map[string]*num.Uint{} + fees := []map[string]*num.Uint{mt.infraFees, mt.lpPaidFees, mt.makerFeesPaid} + for _, fee := range fees { + for party, paid := range fee { + if _, ok := totalFees[party]; !ok { + totalFees[party] = num.UintZero() + } + totalFees[party].AddSum(paid) + } + } + return totalFees +} + // OnEpochEvent is called when the state of the epoch changes, we only care about new epochs starting. func (mat *MarketActivityTracker) OnEpochEvent(ctx context.Context, epoch types.Epoch) { - if epoch.Action == proto.EpochAction_EPOCH_ACTION_START { + if epoch.Action == vega.EpochAction_EPOCH_ACTION_START { mat.epochStartTime = epoch.StartTime mat.partyContributionCache = map[string][]*types.PartyContributionScore{} mat.clearDeletedMarkets() mat.clearNotionalTakerVolume() - mat.takerFeesPaidInEpoch = map[string]map[string]map[string]*num.Uint{} - } else if epoch.Action == proto.EpochAction_EPOCH_ACTION_END { + } else if epoch.Action == vega.EpochAction_EPOCH_ACTION_END { + m := map[string]map[string]map[string]*num.Uint{} for asset, market := range mat.assetToMarketTrackers { - mat.takerFeesPaidInEpoch[asset] = map[string]map[string]*num.Uint{} + m[asset] = map[string]map[string]*num.Uint{} for mkt, mt := range market { - mat.takerFeesPaidInEpoch[asset][mkt] = mt.makerFeesPaid + m[asset][mkt] = mt.aggregatedFees() mt.processNotionalEndOfEpoch(epoch.StartTime, epoch.EndTime) mt.processPositionEndOfEpoch(epoch.StartTime, epoch.EndTime) mt.processM2MEndOfEpoch() + mt.processPartyRealisedReturnOfEpoch() mt.clearFeeActivity() } } + if len(mat.takerFeesPaidInEpoch) == maxWindowSize { + mat.takerFeesPaidInEpoch = mat.takerFeesPaidInEpoch[1:] + } + mat.takerFeesPaidInEpoch = append(mat.takerFeesPaidInEpoch, m) } mat.currentEpoch = epoch.Seq } @@ -431,6 +458,8 @@ func (mt *marketTracker) clearFeeActivity() { mt.makerFeesReceived = map[string]*num.Uint{} mt.makerFeesPaid = map[string]*num.Uint{} mt.lpFees = map[string]*num.Uint{} + mt.infraFees = map[string]*num.Uint{} + mt.lpPaidFees = map[string]*num.Uint{} mt.epochTotalMakerFeesReceived = append(mt.epochTotalMakerFeesReceived, mt.totalMakerFeesReceived) mt.epochTotalMakerFeesPaid = append(mt.epochTotalMakerFeesPaid, mt.totalMakerFeesPaid) @@ -456,6 +485,10 @@ func (mat *MarketActivityTracker) UpdateFeesFromTransfers(asset, market string, mat.addFees(mt.makerFeesReceived, t.Owner, t.Amount.Amount, mt.totalMakerFeesReceived) case types.TransferTypeLiquidityFeeNetDistribute, types.TransferTypeSlaPerformanceBonusDistribute: mat.addFees(mt.lpFees, t.Owner, t.Amount.Amount, mt.totalLpFees) + case types.TransferTypeInfrastructureFeePay: + mat.addFees(mt.infraFees, t.Owner, t.Amount.Amount, num.UintZero()) + case types.TransferTypeLiquidityFeePay: + mat.addFees(mt.lpPaidFees, t.Owner, t.Amount.Amount, num.UintZero()) default: } } @@ -505,6 +538,14 @@ func (mat *MarketActivityTracker) RecordPosition(asset, party, market string, po } } +// RecordRealisedPosition updates the market tracker on decreased position. +func (mat *MarketActivityTracker) RecordRealisedPosition(asset, party, market string, positionDecrease num.Decimal) { + if tracker, ok := mat.getMarketTracker(asset, market); ok { + tracker.allPartiesCache[party] = struct{}{} + tracker.recordRealisedPosition(party, positionDecrease) + } +} + // RecordM2M passes the mark to market win/loss transfer amount to the asset/market tracker to be recorded. func (mat *MarketActivityTracker) RecordM2M(asset, party, market string, amount num.Decimal) { if tracker, ok := mat.getMarketTracker(asset, market); ok { @@ -513,6 +554,14 @@ func (mat *MarketActivityTracker) RecordM2M(asset, party, market string, amount } } +// RecordFundingPayment passes the mark to market win/loss transfer amount to the asset/market tracker to be recorded. +func (mat *MarketActivityTracker) RecordFundingPayment(asset, party, market string, amount num.Decimal) { + if tracker, ok := mat.getMarketTracker(asset, market); ok { + tracker.allPartiesCache[party] = struct{}{} + tracker.recordFundingPayment(party, amount) + } +} + func (mat *MarketActivityTracker) getAllParties(asset string, mkts []string) map[string]struct{} { parties := map[string]struct{}{} includedMarkets := mkts @@ -615,8 +664,8 @@ func (mat *MarketActivityTracker) calculateMetricForIndividuals(ctx context.Cont if !mat.isEligibleForReward(ctx, asset, party, markets, minStakingBalanceRequired, notionalTimeWeightedAveragePositionRequired, gameID) { continue } - score := mat.calculateMetricForParty(asset, party, markets, metric, windowSize) - if score.IsZero() { + score, ok := mat.calculateMetricForParty(asset, party, markets, metric, windowSize) + if !ok { continue } ret = append(ret, &types.PartyContributionScore{Party: party, Score: score}) @@ -661,7 +710,7 @@ func calculateMetricForTeamUtil(ctx context.Context, windowSize int, topN num.Decimal, isEligibleForReward func(ctx context.Context, asset, party string, markets []string, minStakingBalanceRequired *num.Uint, notionalTimeWeightedAveragePositionRequired *num.Uint, gameID string) bool, - calculateMetricForParty func(asset, party string, marketsInScope []string, metric vega.DispatchMetric, windowSize int) num.Decimal, + calculateMetricForParty func(asset, party string, marketsInScope []string, metric vega.DispatchMetric, windowSize int) (num.Decimal, bool), gameID string, ) (num.Decimal, []*types.PartyContributionScore) { teamPartyScores := []*types.PartyContributionScore{} @@ -669,7 +718,9 @@ func calculateMetricForTeamUtil(ctx context.Context, if !isEligibleForReward(ctx, asset, party, marketsInScope, minStakingBalanceRequired, notionalTimeWeightedAveragePositionRequired, gameID) { continue } - teamPartyScores = append(teamPartyScores, &types.PartyContributionScore{Party: party, Score: calculateMetricForParty(asset, party, marketsInScope, metric, windowSize)}) + if score, ok := calculateMetricForParty(asset, party, marketsInScope, metric, windowSize); ok { + teamPartyScores = append(teamPartyScores, &types.PartyContributionScore{Party: party, Score: score}) + } } if len(teamPartyScores) == 0 { @@ -701,7 +752,7 @@ func calculateMetricForTeamUtil(ctx context.Context, } // calculateMetricForParty returns the value of a reward metric score for the given party for markets of the given assets which are in scope over the given window size. -func (mat *MarketActivityTracker) calculateMetricForParty(asset, party string, marketsInScope []string, metric vega.DispatchMetric, windowSize int) num.Decimal { +func (mat *MarketActivityTracker) calculateMetricForParty(asset, party string, marketsInScope []string, metric vega.DispatchMetric, windowSize int) (num.Decimal, bool) { // exclude unsupported metrics if metric == vega.DispatchMetric_DISPATCH_METRIC_MARKET_VALUE { mat.log.Panic("unexpected dispatch metric market value here") @@ -712,11 +763,12 @@ func (mat *MarketActivityTracker) calculateMetricForParty(asset, party string, m uTotal := uint64(0) total := num.DecimalZero() marketTotal := num.DecimalZero() - returns := make([]num.Decimal, windowSize) + returns := make([]*num.Decimal, windowSize) + found := false assetTrackers, ok := mat.assetToMarketTrackers[asset] if !ok { - return num.DecimalZero() + return num.DecimalZero(), false } markets := marketsInScope @@ -735,25 +787,58 @@ func (mat *MarketActivityTracker) calculateMetricForParty(asset, party string, m } switch metric { case vega.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION: - uTotal += marketTracker.getPositionMetricTotal(party, windowSize) + if t, ok := marketTracker.getPositionMetricTotal(party, windowSize); ok { + found = true + uTotal += t + } case vega.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN: - total = total.Add(marketTracker.getRelativeReturnMetricTotal(party, windowSize)) + if t, ok := marketTracker.getRelativeReturnMetricTotal(party, windowSize); ok { + found = true + total = total.Add(t) + } + case vega.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN: + if t, ok := marketTracker.getRealisedReturnMetricTotal(party, windowSize); ok { + found = true + total = total.Add(t) + } case vega.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY: r, ok := marketTracker.getReturns(party, windowSize) if !ok { continue } + found = true for i, ret := range r { - returns[i] = returns[i].Add(ret) + if ret != nil { + if returns[i] != nil { + *returns[i] = returns[i].Add(*ret) + } else { + returns[i] = ret + } + } } case vega.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_PAID: - total = total.Add(getFees(marketTracker.epochMakerFeesPaid, party, windowSize)) + if t, ok := getFees(marketTracker.epochMakerFeesPaid, party, windowSize); ok { + if t.IsPositive() { + found = true + } + total = total.Add(t) + } marketTotal = marketTotal.Add(getTotalFees(marketTracker.epochTotalMakerFeesPaid, windowSize)) case vega.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_RECEIVED: - total = total.Add(getFees(marketTracker.epochMakerFeesReceived, party, windowSize)) + if t, ok := getFees(marketTracker.epochMakerFeesReceived, party, windowSize); ok { + if t.IsPositive() { + found = true + } + total = total.Add(t) + } marketTotal = marketTotal.Add(getTotalFees(marketTracker.epochTotalMakerFeesReceived, windowSize)) case vega.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED: - total = total.Add(getFees(marketTracker.epochLpFees, party, windowSize)) + if t, ok := getFees(marketTracker.epochLpFees, party, windowSize); ok { + if t.IsPositive() { + found = true + } + total = total.Add(t) + } marketTotal = marketTotal.Add(getTotalFees(marketTracker.epochTotalLpFees, windowSize)) } } @@ -761,30 +846,33 @@ func (mat *MarketActivityTracker) calculateMetricForParty(asset, party string, m switch metric { case vega.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION: // descaling the total tw position metric by dividing by the scaling factor - return num.DecimalFromInt64(int64(uTotal)).Div(num.DecimalFromInt64(int64(windowSize) * scalingFactor)) - case vega.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN: - return num.MaxD(num.DecimalZero(), total.Div(num.DecimalFromInt64(int64(windowSize)))) + return num.DecimalFromInt64(int64(uTotal)).Div(num.DecimalFromInt64(int64(windowSize) * scalingFactor)), found + case vega.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, vega.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN: + return total.Div(num.DecimalFromInt64(int64(windowSize))), found case vega.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY: filteredReturns := []num.Decimal{} for _, d := range returns { - if d.IsPositive() { - filteredReturns = append(filteredReturns, d) + if d != nil { + filteredReturns = append(filteredReturns, *d) } } - if len(filteredReturns) == 0 { - return num.DecimalZero() + if len(filteredReturns) < 2 { + return num.DecimalZero(), false } variance, _ := num.Variance(filteredReturns) - return variance + if !variance.IsZero() { + return num.DecimalOne().Div(variance), found + } + return variance, found case vega.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_PAID, vega.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_RECEIVED, vega.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED: if marketTotal.IsZero() { - return num.DecimalZero() + return num.DecimalZero(), found } - return total.Div(marketTotal) + return total.Div(marketTotal), found default: mat.log.Panic("unexpected metric") } - return num.DecimalZero() + return num.DecimalZero(), found } func (mat *MarketActivityTracker) RecordNotionalTakerVolume(marketID string, party string, volumeToAdd *num.Uint) { @@ -989,6 +1077,12 @@ func (mt *marketTracker) processPositionEndOfEpoch(epochStartTime time.Time, end mt.epochTimeWeightedPosition = mt.epochTimeWeightedPosition[1:] } mt.epochTimeWeightedPosition = append(mt.epochTimeWeightedPosition, m) + for p, twp := range mt.twPosition { + // if the position at the beginning of the epoch is 0 clear it so we don't keep zero positions forever + if twp.currentEpochTWPosition == 0 && twp.position == 0 { + delete(mt.twPosition, p) + } + } } // //// return metric ////// @@ -1005,6 +1099,28 @@ func (mt *marketTracker) recordM2M(party string, amount num.Decimal) { mt.partyM2M[party] = mt.partyM2M[party].Add(amount) } +func (mt *marketTracker) recordFundingPayment(party string, amount num.Decimal) { + if party == "network" || amount.IsZero() { + return + } + if _, ok := mt.partyRealisedReturn[party]; !ok { + mt.partyRealisedReturn[party] = amount + return + } + mt.partyRealisedReturn[party] = mt.partyRealisedReturn[party].Add(amount) +} + +func (mt *marketTracker) recordRealisedPosition(party string, realisedPosition num.Decimal) { + if party == "network" { + return + } + if _, ok := mt.partyRealisedReturn[party]; !ok { + mt.partyRealisedReturn[party] = realisedPosition + return + } + mt.partyRealisedReturn[party] = mt.partyRealisedReturn[party].Add(realisedPosition) +} + // processM2MEndOfEpoch 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) processM2MEndOfEpoch() { m := map[string]num.Decimal{} @@ -1020,47 +1136,65 @@ func (mt *marketTracker) processM2MEndOfEpoch() { v = m2m.Div(num.DecimalFromInt64(int64(p)).Div(dScalingFactor)) } m[party] = v - mt.partyM2M[party] = num.DecimalZero() } if len(mt.epochPartyM2M) == maxWindowSize { mt.epochPartyM2M = mt.epochPartyM2M[1:] } + mt.partyM2M = map[string]decimal.Decimal{} mt.epochPartyM2M = append(mt.epochPartyM2M, 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) { - if _, ok := mt.partyM2M[party]; !ok { - return []num.Decimal{}, false +// 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{} + for party, realised := range mt.partyRealisedReturn { + m[party] = realised } - returns := make([]num.Decimal, 0, windowSize) + if len(mt.epochPartyRealisedReturn) == maxWindowSize { + mt.epochPartyRealisedReturn = mt.epochPartyRealisedReturn[1:] + } + mt.epochPartyRealisedReturn = append(mt.epochPartyRealisedReturn, m) + mt.partyRealisedReturn = map[string]decimal.Decimal{} +} + +// 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) if len(mt.epochPartyM2M) == 0 { - return []num.Decimal{}, false + return []*num.Decimal{}, false } + found := false for i := 0; i < windowSize; i++ { ind := len(mt.epochPartyM2M) - i - 1 if ind < 0 { - returns = append(returns, num.DecimalZero()) - continue + break } epochData := mt.epochPartyM2M[ind] - returns = append(returns, epochData[party]) + if t, ok := epochData[party]; ok { + found = true + returns[i] = &t + } } - return returns, true + return returns, found } // getPositionMetricTotal returns the sum of the epoch's time weighted position over the time window. -func (mt *marketTracker) getPositionMetricTotal(party string, windowSize int) uint64 { +func (mt *marketTracker) getPositionMetricTotal(party string, windowSize int) (uint64, bool) { return calcTotalForWindowUint64(party, mt.epochTimeWeightedPosition, windowSize) } // getRelativeReturnMetricTotal returns the sum of the relative returns over the given window. -func (mt *marketTracker) getRelativeReturnMetricTotal(party string, windowSize int) num.Decimal { +func (mt *marketTracker) getRelativeReturnMetricTotal(party string, windowSize int) (num.Decimal, bool) { return calcTotalForWindowD(party, mt.epochPartyM2M, windowSize) } +// getRealisedReturnMetricTotal returns the sum of the relative returns over the given window. +func (mt *marketTracker) getRealisedReturnMetricTotal(party string, windowSize int) (num.Decimal, bool) { + return calcTotalForWindowD(party, mt.epochPartyRealisedReturn, windowSize) +} + // getFees returns the total fees paid/received (depending on what feeData represents) by the party over the given window size. -func getFees(feeData []map[string]*num.Uint, party string, windowSize int) num.Decimal { +func getFees(feeData []map[string]*num.Uint, party string, windowSize int) (num.Decimal, bool) { return calcTotalForWindowU(party, feeData, windowSize) } @@ -1080,9 +1214,9 @@ func getTotalFees(totalFees []*num.Uint, windowSize int) num.Decimal { return total.ToDecimal() } -func (mat *MarketActivityTracker) GetLastEpochTakeFees(asset string, markets []string) map[string]*num.Uint { +func (mat *MarketActivityTracker) getEpochTakeFees(asset string, markets []string, takerFeesPaidInEpoch map[string]map[string]map[string]*num.Uint) map[string]*num.Uint { takerFees := map[string]*num.Uint{} - ast, ok := mat.takerFeesPaidInEpoch[asset] + ast, ok := takerFeesPaidInEpoch[asset] if !ok { return takerFees } @@ -1107,59 +1241,83 @@ func (mat *MarketActivityTracker) GetLastEpochTakeFees(asset string, markets []s return takerFees } +func (mat *MarketActivityTracker) GetLastEpochTakeFees(asset string, markets []string, epochs int32) map[string]*num.Uint { + takerFees := map[string]*num.Uint{} + for i := 0; i < int(epochs); i++ { + ind := len(mat.takerFeesPaidInEpoch) - i - 1 + if ind < 0 { + break + } + m := mat.getEpochTakeFees(asset, markets, mat.takerFeesPaidInEpoch[ind]) + for k, v := range m { + if _, ok := takerFees[k]; !ok { + takerFees[k] = num.UintZero() + } + takerFees[k].AddSum(v) + } + } + return takerFees +} + // calcTotalForWindowU returns the total relevant data from the given slice starting from the given dataIdx-1, going back elements. -func calcTotalForWindowU(party string, data []map[string]*num.Uint, windowSize int) num.Decimal { +func calcTotalForWindowU(party string, data []map[string]*num.Uint, windowSize int) (num.Decimal, bool) { + found := false if len(data) == 0 { - return num.DecimalZero() + return num.DecimalZero(), found } total := num.UintZero() for i := 0; i < windowSize; i++ { ind := len(data) - i - 1 if ind < 0 { - return total.ToDecimal() + return total.ToDecimal(), found } if v, ok := data[ind][party]; ok { + found = true total.AddSum(v) } } - return total.ToDecimal() + return total.ToDecimal(), found } // calcTotalForWindowD returns the total relevant data from the given slice starting from the given dataIdx-1, going back elements. -func calcTotalForWindowD(party string, data []map[string]num.Decimal, windowSize int) num.Decimal { +func calcTotalForWindowD(party string, data []map[string]num.Decimal, windowSize int) (num.Decimal, bool) { + found := false if len(data) == 0 { - return num.DecimalZero() + return num.DecimalZero(), found } total := num.DecimalZero() for i := 0; i < windowSize; i++ { ind := len(data) - i - 1 if ind < 0 { - return total + return total, found } if v, ok := data[ind][party]; ok { + found = true total = total.Add(v) } } - return total + return total, found } // calcTotalForWindowUint64 returns the total relevant data from the given slice starting from the given dataIdx-1, going back elements. -func calcTotalForWindowUint64(party string, data []map[string]uint64, windowSize int) uint64 { +func calcTotalForWindowUint64(party string, data []map[string]uint64, windowSize int) (uint64, bool) { + found := false if len(data) == 0 { - return 0 + return 0, found } total := uint64(0) for i := 0; i < windowSize; i++ { ind := len(data) - i - 1 if ind < 0 { - return total + return total, found } if v, ok := data[ind][party]; ok { + found = true total += v } } - return total + return total, found } // returns the sorted slice of keys for the given map. diff --git a/core/execution/common/market_activity_tracker_checkpoint.go b/core/execution/common/market_activity_tracker_checkpoint.go index 5a29771e99..e888569eed 100644 --- a/core/execution/common/market_activity_tracker_checkpoint.go +++ b/core/execution/common/market_activity_tracker_checkpoint.go @@ -54,6 +54,7 @@ func (mat *MarketActivityTracker) Checkpoint() ([]byte, error) { MarketActivity: marketTracker, TakerNotionalVolume: takerNotionalToProto(mat.partyTakerNotionalVolume), MarketToPartyTakerNotionalVolume: marketToPartyTakerNotionalToProto(mat.marketToPartyTakerNotionalVolume), + EpochTakerFees: epochTakerFeesToProto(mat.takerFeesPaidInEpoch), } ret, err := proto.Marshal(msg) if err != nil { @@ -87,5 +88,22 @@ func (mat *MarketActivityTracker) Load(_ context.Context, data []byte) error { } } } + if b.EpochTakerFees != nil { + for _, epochData := range b.EpochTakerFees { + epochMap := map[string]map[string]map[string]*num.Uint{} + for _, assetMarketParty := range epochData.EpochPartyTakerFeesPaid { + if _, ok := epochMap[assetMarketParty.Asset]; !ok { + epochMap[assetMarketParty.Asset] = map[string]map[string]*num.Uint{} + } + if _, ok := epochMap[assetMarketParty.Asset][assetMarketParty.Market]; !ok { + epochMap[assetMarketParty.Asset][assetMarketParty.Market] = map[string]*num.Uint{} + } + for _, tf := range assetMarketParty.TakerFees { + epochMap[assetMarketParty.Asset][assetMarketParty.Market][tf.Party] = num.UintFromBytes(tf.TakerFees) + } + } + mat.takerFeesPaidInEpoch = append(mat.takerFeesPaidInEpoch, epochMap) + } + } return nil } diff --git a/core/execution/common/market_activity_tracker_internal_test.go b/core/execution/common/market_activity_tracker_internal_test.go index 570767d7e0..d37dba4f6e 100644 --- a/core/execution/common/market_activity_tracker_internal_test.go +++ b/core/execution/common/market_activity_tracker_internal_test.go @@ -67,16 +67,20 @@ func TestCalcTotalForWindowD(t *testing.T) { data[i]["party1"] = num.DecimalFromInt64(i) } for idx := 0; idx < len(data); idx++ { - require.Equal(t, num.DecimalFromInt64(4950), calcTotalForWindowD("party1", data, maxWindowSize)) + tot, _ := calcTotalForWindowD("party1", data, maxWindowSize) + require.Equal(t, num.DecimalFromInt64(4950), tot) } windowSize := 5 - require.Equal(t, num.DecimalFromInt64(485), calcTotalForWindowD("party1", data, windowSize)) + tot, _ := calcTotalForWindowD("party1", data, windowSize) + require.Equal(t, num.DecimalFromInt64(485), tot) windowSize = 2 - require.Equal(t, num.DecimalFromInt64(197), calcTotalForWindowD("party1", data, windowSize)) + tot, _ = calcTotalForWindowD("party1", data, windowSize) + require.Equal(t, num.DecimalFromInt64(197), tot) - require.Equal(t, num.DecimalZero(), calcTotalForWindowD("party2", data, windowSize)) + tot, _ = calcTotalForWindowD("party2", data, windowSize) + require.Equal(t, num.DecimalZero(), tot) } func TestGetTotalFees(t *testing.T) { @@ -96,31 +100,39 @@ func TestGetFees(t *testing.T) { feeHistory := []map[string]*num.Uint{{"p1": num.NewUint(100)}, {"p1": num.NewUint(97), "p2": num.NewUint(200)}} windowSize := 5 // party has no fee data - require.Equal(t, "0", getFees(feeHistory, "p3", windowSize).String()) + tot, ok := getFees(feeHistory, "p3", windowSize) + require.Equal(t, "0", tot.String()) + require.False(t, ok) // party1 has 197 in window (100, 97) - require.Equal(t, num.DecimalFromInt64(197), getFees(feeHistory, "p1", windowSize)) + tot, ok = getFees(feeHistory, "p1", windowSize) + require.Equal(t, num.DecimalFromInt64(197), tot) + require.True(t, ok) // party2 has 100 in window (0, 200) - require.Equal(t, num.DecimalFromInt64(200), getFees(feeHistory, "p2", windowSize)) + tot, ok = getFees(feeHistory, "p2", windowSize) + require.Equal(t, num.DecimalFromInt64(200), tot) + require.True(t, ok) } func getDefaultTracker(t *testing.T) *marketTracker { t.Helper() return &marketTracker{ - asset: "asset", - proposer: "proposer", - proposersPaid: map[string]struct{}{}, - readyToDelete: false, - valueTraded: num.UintZero(), - makerFeesReceived: map[string]*num.Uint{}, - makerFeesPaid: map[string]*num.Uint{}, - lpFees: map[string]*num.Uint{}, - totalMakerFeesReceived: num.UintZero(), - totalMakerFeesPaid: num.UintZero(), - totalLpFees: num.UintZero(), - twPosition: map[string]*twPosition{}, - partyM2M: map[string]num.Decimal{}, - twNotional: map[string]*twNotional{}, - epochPartyM2M: []map[string]num.Decimal{}, + asset: "asset", + proposer: "proposer", + proposersPaid: map[string]struct{}{}, + readyToDelete: false, + valueTraded: num.UintZero(), + makerFeesReceived: map[string]*num.Uint{}, + makerFeesPaid: map[string]*num.Uint{}, + lpFees: map[string]*num.Uint{}, + totalMakerFeesReceived: num.UintZero(), + totalMakerFeesPaid: num.UintZero(), + totalLpFees: num.UintZero(), + twPosition: map[string]*twPosition{}, + partyM2M: map[string]num.Decimal{}, + partyRealisedReturn: map[string]num.Decimal{}, + twNotional: map[string]*twNotional{}, + epochPartyM2M: []map[string]num.Decimal{}, + epochPartyRealisedReturn: []map[string]num.Decimal{}, } } @@ -134,9 +146,13 @@ func TestGetRelativeReturnMetricTotal(t *testing.T) { tracker.epochPartyM2M = append(tracker.epochPartyM2M, m) } // nothing for party2 - require.Equal(t, num.DecimalZero(), tracker.getRelativeReturnMetricTotal("p2", 5)) + tot, ok := tracker.getRelativeReturnMetricTotal("p2", 5) + require.False(t, ok) + require.Equal(t, num.DecimalZero(), tot) - require.Equal(t, num.DecimalFromInt64(485), tracker.getRelativeReturnMetricTotal("p1", 5)) + tot, ok = tracker.getRelativeReturnMetricTotal("p1", 5) + require.True(t, ok) + require.Equal(t, num.DecimalFromInt64(485), tot) } func TestGetPositionMetricTotal(t *testing.T) { @@ -149,9 +165,13 @@ func TestGetPositionMetricTotal(t *testing.T) { } // nothing for party2 - require.Equal(t, uint64(0), tracker.getPositionMetricTotal("p2", 5)) + tot, ok := tracker.getPositionMetricTotal("p2", 5) + require.False(t, ok) + require.Equal(t, uint64(0), tot) // 99+98+97+96+95 for party1 - require.Equal(t, uint64(485), tracker.getPositionMetricTotal("p1", 5)) + tot, ok = tracker.getPositionMetricTotal("p1", 5) + require.True(t, ok) + require.Equal(t, uint64(485), tot) } func TestReturns(t *testing.T) { @@ -192,6 +212,57 @@ func TestReturns(t *testing.T) { require.False(t, ok) } +func TestRealisedReturns(t *testing.T) { + tracker := getDefaultTracker(t) + + tracker.recordFundingPayment("p1", num.DecimalFromInt64(100)) + tracker.recordRealisedPosition("p1", num.DecimalFromInt64(-50)) + tracker.recordFundingPayment("p1", num.DecimalFromInt64(-200)) + tracker.recordRealisedPosition("p1", num.DecimalFromInt64(20)) + tracker.recordFundingPayment("p2", num.DecimalFromInt64(-100)) + tracker.recordRealisedPosition("p2", num.DecimalFromInt64(-10)) + tracker.recordRealisedPosition("p2", num.DecimalFromInt64(20)) + tracker.recordFundingPayment("p3", num.DecimalFromInt64(200)) + + tracker.processPartyRealisedReturnOfEpoch() + + ret1, ok := tracker.getRealisedReturnMetricTotal("p1", 1) + require.Equal(t, "-130", ret1.String()) + require.True(t, ok) + ret2, ok := tracker.getRealisedReturnMetricTotal("p2", 1) + require.Equal(t, "-90", ret2.String()) + require.True(t, ok) + ret3, ok := tracker.getRealisedReturnMetricTotal("p3", 1) + require.Equal(t, "200", ret3.String()) + require.True(t, ok) + + tracker.recordFundingPayment("p1", num.DecimalFromInt64(-30)) + tracker.recordRealisedPosition("p2", num.DecimalFromInt64(70)) + tracker.recordRealisedPosition("p2", num.DecimalFromInt64(80)) + tracker.recordRealisedPosition("p3", num.DecimalFromInt64(-50)) + + tracker.processPartyRealisedReturnOfEpoch() + ret1, ok = tracker.getRealisedReturnMetricTotal("p1", 1) + require.Equal(t, "-30", ret1.String()) + require.True(t, ok) + ret2, ok = tracker.getRealisedReturnMetricTotal("p2", 1) + require.Equal(t, "150", ret2.String()) + require.True(t, ok) + ret3, ok = tracker.getRealisedReturnMetricTotal("p3", 1) + require.Equal(t, "-50", ret3.String()) + require.True(t, ok) + + ret1, ok = tracker.getRealisedReturnMetricTotal("p1", 2) + require.Equal(t, "-160", ret1.String()) + require.True(t, ok) + ret2, ok = tracker.getRealisedReturnMetricTotal("p2", 2) + require.Equal(t, "60", ret2.String()) + require.True(t, ok) + ret3, ok = tracker.getRealisedReturnMetricTotal("p3", 2) + require.Equal(t, "150", ret3.String()) + require.True(t, ok) +} + func TestPositions(t *testing.T) { tracker := getDefaultTracker(t) // epoch 1 @@ -202,23 +273,35 @@ func TestPositions(t *testing.T) { tracker.recordPosition("p1", 30, num.DecimalOne(), time.Unix(45, 0), time.Unix(0, 0)) // 155555544 * ( 10000000 - 2500000 ) + ( 300000000 * 2500000 ) / 10000000 = 191666658 tracker.processPositionEndOfEpoch(time.Unix(0, 0), time.Unix(60, 0)) - require.Equal(t, uint64(191666658), tracker.getPositionMetricTotal("p1", 1)) + tot, ok := tracker.getPositionMetricTotal("p1", 1) + require.True(t, ok) + require.Equal(t, uint64(191666658), tot) // epoch 2 // 191666658 * ( 10000000 - 10000000 ) + ( 300000000 * 10000000 ) / 10000000 = 300000000 tracker.recordPosition("p1", 10, num.DecimalOne(), time.Unix(90, 0), time.Unix(60, 0)) // 300000000 * ( 10000000 - 5000000 ) + ( 100000000 * 5000000 ) / 10000000 = 200000000 tracker.processPositionEndOfEpoch(time.Unix(60, 0), time.Unix(120, 0)) - require.Equal(t, uint64(200000000), tracker.getPositionMetricTotal("p1", 1)) - require.Equal(t, uint64(391666658), tracker.getPositionMetricTotal("p1", 2)) + tot, ok = tracker.getPositionMetricTotal("p1", 1) + require.Equal(t, uint64(200000000), tot) + require.True(t, ok) + tot, ok = tracker.getPositionMetricTotal("p1", 2) + require.Equal(t, uint64(391666658), tot) + require.True(t, ok) // epoch 3 // no position changes over the epoch // 200000000 * ( 10000000 - 10000000 ) + ( 100000000 * 10000000 ) / 10000000 = 100000000 tracker.processPositionEndOfEpoch(time.Unix(120, 0), time.Unix(180, 0)) - require.Equal(t, uint64(100000000), tracker.getPositionMetricTotal("p1", 1)) - require.Equal(t, uint64(300000000), tracker.getPositionMetricTotal("p1", 2)) - require.Equal(t, uint64(491666658), tracker.getPositionMetricTotal("p1", 3)) + tot, ok = tracker.getPositionMetricTotal("p1", 1) + require.Equal(t, uint64(100000000), tot) + require.True(t, ok) + tot, ok = tracker.getPositionMetricTotal("p1", 2) + require.Equal(t, uint64(300000000), tot) + require.True(t, ok) + tot, ok = tracker.getPositionMetricTotal("p1", 3) + require.Equal(t, uint64(491666658), tot) + require.True(t, ok) } func TestAverageNotional(t *testing.T) { @@ -465,31 +548,41 @@ func TestCalculateMetricForPartyAvePosition(t *testing.T) { // calculate metric for p1 with scope=[m1] for window size=1 // 0*(1-0.9166666666666667)+10*0.9166666666666667 = 9.1666666667 - require.Equal(t, "9.166666", tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ := tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "9.166666", score.String()) // calculate metric for p1 with scope=[m2] for window size=1 // 0*(1-0.6666666666666667)+20*0.6666666666666667 = 13.3333333333 - require.Equal(t, "13.333332", tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "13.333332", score.String()) // calculate metric for p1 with scope=[m3] for window size=1 // 0*(1-0.5)+30*0.5 = 15 - require.Equal(t, "15", tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "15", score.String()) // calculate metric for p1 with scope=[m1, m2] for window size=1 - require.Equal(t, "22.499998", tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "22.499998", score.String()) // calculate metric for p1 with no scope for window size=1 - require.Equal(t, "37.499998", tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "37.499998", score.String()) // calculate metric for p2 with scope=[m1] for window size=1 // 0*(1-0.75)+100*0.75 = 75 - require.Equal(t, "75", tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "75", score.String()) // calculate metric for p2 with scope=[m2] for window size=1 // 0*(1-0.5833333333333333)+200*0.5833333333333333 - require.Equal(t, "116.66666", tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "116.66666", score.String()) // calculate metric for p2 with scope=[m3] for window size=1 // 0*(1-0.25)+300*0.25 - require.Equal(t, "75", tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "75", score.String()) // calculate metric for p2 with scope=[m1, m3] for window size=1 - require.Equal(t, "150", tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "150", score.String()) // calculate metric for p2 with no scope for window size=1 - require.Equal(t, "266.66666", tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "266.66666", score.String()) // start epoch2 epochService.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Unix(60, 0)}) @@ -502,61 +595,81 @@ func TestCalculateMetricForPartyAvePosition(t *testing.T) { // calculate metric for p1 with scope=[m1] for window size=1 // 10*(1-0.5)+20*0.5 - require.Equal(t, "15", tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "15", score.String()) // calculate metric for p1 with scope=[m2] for window size=1 // 13.333333333333334*(1-1)+20*1 - require.Equal(t, "20", tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "20", score.String()) // calculate metric for p1 with scope=[m3] for window size=1 // 15*(1-1)+30*1 = 30 - require.Equal(t, "30", tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "30", score.String()) // calculate metric for p1 with scope=[m1, m3] for window size=1 - require.Equal(t, "35", tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "35", score.String()) // calculate metric for p1 with no scope for window size=1 - require.Equal(t, "65", tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "65", score.String()) // calculate metric for p2 with scope=[m1] for window size=1 // 75*(1-1)+100*1 - require.Equal(t, "100", tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "100", score.String()) // calculate metric for p1 with scope=[m2] for window size=1 // 200*(1-0.75)+10*0.75 - require.Equal(t, "57.5", tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "57.5", score.String()) // calculate metric for p1 with scope=[m3] for window size=1 // 75*(1-1)+300*1 - require.Equal(t, "300", tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "300", score.String()) // calculate metric for p1 with scope=[m1, m3] for window size=1 - require.Equal(t, "157.5", tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "157.5", score.String()) // calculate metric for p1 with no scope for window size=1 - require.Equal(t, "457.5", tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "457.5", score.String()) // now calculate for window size=2 // calculate metric for p1 with scope=[m1] for window size=2 // (15 + 9.166666666666667)/2 - require.Equal(t, "12.083333", tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2) + require.Equal(t, "12.083333", score.String()) // calculate metric for p1 with scope=[m2] for window size=2 // (13.333333333333334" + 20)/2 - require.Equal(t, "16.666666", tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2) + require.Equal(t, "16.666666", score.String()) // calculate metric for p1 with scope=[m3] for window size=2 // (15 + 30)/2 - require.Equal(t, "22.5", tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2) + require.Equal(t, "22.5", score.String()) // calculate metric for p1 with scope=[m1, m3] for window size=2 - require.Equal(t, "28.749999", tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2) + require.Equal(t, "28.749999", score.String()) // calculate metric for p1 with no scope for window size=2 - require.Equal(t, "51.249999", tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2) + require.Equal(t, "51.249999", score.String()) // calculate metric for p2 with scope=[m1] for window size=2 // (100 + 75)/2 - require.Equal(t, "87.5", tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2) + require.Equal(t, "87.5", score.String()) // calculate metric for p2 with scope=[m2] for window size=2 // (116.66666666666666 + 57.5)/2 - require.Equal(t, "87.08333", tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2) + require.Equal(t, "87.08333", score.String()) // calculate metric for p2 with scope=[m3] for window size=2 // (300 + 75)/2 - require.Equal(t, "187.5", tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2) + require.Equal(t, "187.5", score.String()) // calculate metric for p2 with scope=[m1, m3] for window size=2 - require.Equal(t, "275", tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2) + require.Equal(t, "275", score.String()) // calculate metric for p2 with no scope for window size=2 - require.Equal(t, "362.08333", tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 2) + require.Equal(t, "362.08333", score.String()) // start epoch3 epochService.target(context.Background(), types.Epoch{Seq: 3, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Unix(120, 0)}) @@ -564,61 +677,81 @@ func TestCalculateMetricForPartyAvePosition(t *testing.T) { epochService.target(context.Background(), types.Epoch{Seq: 3, Action: vgproto.EpochAction_EPOCH_ACTION_END, StartTime: time.Unix(120, 0), EndTime: time.Unix(180, 0)}) // calculate metric for p1 with scope=[m1] for window size=1 // 15*(1-1)+20*1 - require.Equal(t, "20", tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "20", score.String()) // calculate metric for p1 with scope=[m2] for window size=1 // 20*(1-1)+20*1 - require.Equal(t, "20", tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "20", score.String()) // calculate metric for p1 with scope=[m3] for window size=1 // 30*(1-1)+30*1 = 30 - require.Equal(t, "30", tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "30", score.String()) // calculate metric for p1 with scope=[m1, m3] for window size=1 - require.Equal(t, "40", tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "40", score.String()) // calculate metric for p1 with no scope for window size=1 - require.Equal(t, "70", tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "70", score.String()) // calculate metric for p2 with scope=[m1] for window size=1 // 100*(1-1)+100*1 - require.Equal(t, "100", tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "100", score.String()) // calculate metric for p2 with scope=[m2] for window size=1 // 57.5*(1-1)+10*1 - require.Equal(t, "10", tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "10", score.String()) // calculate metric for p2 with scope=[m3] for window size=1 // 300*(1-1)+300*1 - require.Equal(t, "300", tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "300", score.String()) // calculate metric for p2 with scope=[m1, m3] for window size=1 - require.Equal(t, "110", tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "110", score.String()) // calculate metric for p2 with no scope for window size=1 - require.Equal(t, "410", tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 1) + require.Equal(t, "410", score.String()) // now calculate for window size=3 // calculate metric for p1 with scope=[m1] for window size=3 // (9.166666666666667 + 15 + 20)/3 - require.Equal(t, "14.722222", tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3) + require.Equal(t, "14.722222", score.String()) // calculate metric for p1 with scope=[m2] for window size=3 // (13.333333333333334" + 20 + 20)/3 - require.Equal(t, "17.7777773333333333", tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3) + require.Equal(t, "17.7777773333333333", score.String()) // calculate metric for p1 with scope=[m3] for window size=3 // (15 + 30 + 30)/3 - require.Equal(t, "25", tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3) + require.Equal(t, "25", score.String()) // calculate metric for p1 with scope=[m1, m3] for window size=3 - require.Equal(t, "32.4999993333333333", tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3) + require.Equal(t, "32.4999993333333333", score.String()) // calculate metric for p1 with no scope for window size=3 - require.Equal(t, "57.4999993333333333", tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3) + require.Equal(t, "57.4999993333333333", score.String()) // calculate metric for p2 with scope=[m1] for window size=3 // (100 + 75+100)/3 - require.Equal(t, "91.6666666666666667", tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3) + require.Equal(t, "91.6666666666666667", score.String()) // calculate metric for p2 with scope=[m2] for window size=3 // (116.66666666666666 + 57.5 + 10)/3 - require.Equal(t, "61.3888866666666667", tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3) + require.Equal(t, "61.3888866666666667", score.String()) // calculate metric for p2 with scope=[m3] for window size=3 // (300 + 75 + 300)/3 - require.Equal(t, "225", tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3) + require.Equal(t, "225", score.String()) // calculate metric for p2 with scope=[m1, m3] for window size=3 - require.Equal(t, "316.6666666666666667", tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3) + require.Equal(t, "316.6666666666666667", score.String()) // calculate metric for p2 with no scope for window size=3 - require.Equal(t, "378.0555533333333333", tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, 3) + require.Equal(t, "378.0555533333333333", score.String()) } func TestCalculateMetricForIndividualReturnVolatility(t *testing.T) { @@ -718,12 +851,16 @@ func TestCalculateMetricForIndividualReturnVolatility(t *testing.T) { 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)) require.Equal(t, "p1", metrics[0].Party) - // variance(3, 9.8181825322314569) - require.Equal(t, "11.6219032607065405", metrics[0].Score.String()) + // variance(3, 9.8181825322314569) => 11.6219032607065405 => 1/11.6219032607065405 = 0.08604442642 + require.Equal(t, "0.086044426422046", metrics[0].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) - require.Equal(t, 0, len(metrics)) + require.Equal(t, 2, len(metrics)) + require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "0.2214532481172412", metrics[0].Score.String()) + require.Equal(t, "p2", metrics[1].Party) + 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) @@ -733,20 +870,20 @@ func TestCalculateMetricForIndividualReturnVolatility(t *testing.T) { metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 2, gameID) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) - // variance(2.5, 13.5681829072314944) - require.Equal(t, "30.6261682169828538", metrics[0].Score.String()) - // variance(0.1739130434782609,0.0904761880272107) - require.Equal(t, "0.0017404272118899", metrics[1].Score.String()) + // variance(2.5, 13.5681829072314944) = 30.6261682169828538 => 0.03265181569 + require.Equal(t, "0.0326518156928779", metrics[0].Score.String()) + // variance(0.1739130434782609,0.0904761880272107) = 0.0017404272118899 => 574.5715725245 + 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) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) - // variance(2.5, 11.2348495738981611) - require.Equal(t, "19.0743992696572216", metrics[0].Score.String()) - // variance(0.1739130434782609,0.5571428546938774) - require.Equal(t, "0.0367162720510893", metrics[1].Score.String()) + // variance(2.5, 11.2348495738981611) = 19.0743992696572216 => 0.05242629065 + require.Equal(t, "0.0524262906455334", metrics[0].Score.String()) + // variance(0.1739130434782609,0.5571428546938774) = 0.0367162720510893 => 27.2358805548 + require.Equal(t, "27.2358805547724978", metrics[1].Score.String()) // now make p2 not eligible via not having sufficient governance token balanceChecker.EXPECT().GetAvailableBalance("p1").Return(num.NewUint(2), nil).Times(1) @@ -810,33 +947,43 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { // 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) - require.Equal(t, 1, len(metrics)) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) - require.Equal(t, "16.3636375537190948", metrics[0].Score.String()) + require.Equal(t, "16.3636375537", metrics[0].Score.StringFixed(10)) + require.Equal(t, "p2", metrics[1].Party) + 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) - require.Equal(t, 1, len(metrics)) - require.Equal(t, "p2", metrics[0].Party) - require.Equal(t, "0.4285714530612259", metrics[0].Score.String()) + require.Equal(t, 2, len(metrics)) + require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "-3.7500003750", metrics[0].Score.StringFixed(10)) + require.Equal(t, "p2", metrics[1].Party) + 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) - require.Equal(t, 1, len(metrics)) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) - require.Equal(t, "6.6666666666666667", metrics[0].Score.String()) + require.Equal(t, "6.6666666667", metrics[0].Score.StringFixed(10)) + require.Equal(t, "p2", metrics[1].Party) + 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) - require.Equal(t, 1, len(metrics)) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "12.6136371787", metrics[0].Score.StringFixed(10)) + require.Equal(t, "p2", metrics[1].Party) + 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) - require.Equal(t, 1, len(metrics)) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "19.2803038454", metrics[0].Score.StringFixed(10)) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, "-2.9047618803", metrics[1].Score.StringFixed(10)) // start epoch2 epochService.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Unix(60, 0)}) @@ -856,15 +1003,19 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { // 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) - require.Equal(t, 1, len(metrics)) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "30", metrics[0].Score.String()) + require.Equal(t, "p2", metrics[1].Party) + 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) - require.Equal(t, 1, len(metrics)) - require.Equal(t, "p2", metrics[0].Party) - require.Equal(t, "1.7391304347826087", metrics[0].Score.String()) + require.Equal(t, 2, len(metrics)) + require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "-5", metrics[0].Score.String()) + require.Equal(t, "p2", metrics[1].Party) + 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) @@ -872,46 +1023,60 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { // 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) - require.Equal(t, 1, len(metrics)) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "25", metrics[0].Score.String()) + require.Equal(t, "p2", metrics[1].Party) + 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) - require.Equal(t, 1, len(metrics)) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "25", metrics[0].Score.String()) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, "-2.7608695652", metrics[1].Score.StringFixed(10)) // 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) - require.Equal(t, 1, len(metrics)) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) - require.Equal(t, "23.1818187768595474", metrics[0].Score.String()) + require.Equal(t, "23.1818187769", metrics[0].Score.StringFixed(10)) + require.Equal(t, "p2", metrics[1].Party) + 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) - require.Equal(t, 1, len(metrics)) - require.Equal(t, "p2", metrics[0].Party) - require.Equal(t, "1.0838509439219173", metrics[0].Score.String()) + require.Equal(t, 2, len(metrics)) + require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "-4.3750001875", metrics[0].Score.StringFixed(10)) + require.Equal(t, "p2", metrics[1].Party) + 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) - require.Equal(t, 1, len(metrics)) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) - require.Equal(t, "3.3333333333333334", metrics[0].Score.String()) + require.Equal(t, "3.3333333333", metrics[0].Score.StringFixed(10)) + require.Equal(t, "p2", metrics[1].Party) + 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) - require.Equal(t, 1, len(metrics)) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "18.8068185894", metrics[0].Score.StringFixed(10)) + require.Equal(t, "p2", metrics[1].Party) + 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) - require.Equal(t, 1, len(metrics)) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "22.1401519227", metrics[0].Score.StringFixed(10)) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, "-2.8328157227", metrics[1].Score.StringFixed(10)) // now make p2 not eligible via not having sufficient governance token balanceChecker.EXPECT().GetAvailableBalance("p1").Return(num.NewUint(2), nil).Times(1) @@ -967,34 +1132,44 @@ func TestCalculateMetricForPartyRelativeReturn(t *testing.T) { // calculate metric for p1 with scope=[m1] for window size=1 // 150 / 9.166666 - require.Equal(t, "16.3636375537190948", tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ := tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "16.3636375537190948", score.String()) // calculate metric for p1 with scope=[m2] for window size=1 - // max(0, -50 /13.333332) - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + // -50 /13.333332 + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "-3.7500003750000375", score.String()) // calculate metric for p1 with scope=[m3] for window size=1 // 100 / 15 - require.Equal(t, "6.6666666666666667", tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "6.6666666666666667", score.String()) // calculate metric for p1 with scope=[m1, m2] for window size=1 // 150 / 9.166666 - 50 /13.333332 - require.Equal(t, "12.6136371787", tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).StringFixed(10)) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "12.6136371787", score.StringFixed(10)) // 150 / 9.166666 - 50 /13.333332 +100/15 - require.Equal(t, "19.2803038454", tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).StringFixed(10)) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "19.2803038454", score.StringFixed(10)) // calculate metric for p2 with scope=[m1] for window size=1 - // max(-100 / 75, 0) - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + // -150 / 75 + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "-2", score.String()) // calculate metric for p2 with scope=[m2] for window size=1 // 50 / 116.66666 - require.Equal(t, "0.4285714530612259", tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "0.4285714531", score.StringFixed(10)) // calculate metric for p2 with scope=[m3] for window size=1 - // max(-100 / 75,0) - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + // -100 / 75 + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "-1.3333333333", score.StringFixed(10)) // calculate metric for p2 with scope=[m1, m2] for window size=1 - // max(0, -100/75+50/116.66666666666666) - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + // -2 + 0.4285714531 + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "-1.5714285469", score.StringFixed(10)) // calculate metric for p2 with no scope for window size=1 - // max(-100/75+50/116.66666666666666-100/75, 0) - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + // -2+0.4285714531-1.3333333333 + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "-2.9047618803", score.StringFixed(10)) // start epoch2 epochService.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Unix(60, 0)}) @@ -1014,67 +1189,84 @@ func TestCalculateMetricForPartyRelativeReturn(t *testing.T) { // calculate metric for p1 with scope=[m1] for window size=1 // 450/15=30 - require.Equal(t, "30", tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "30", score.String()) // calculate metric for p1 with scope=[m2] for window size=1 - // max(0, -100/20) - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + // -100/20 + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "-5", score.String()) // calculate metric for p1 with scope=[m3] for window size=1 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "0", score.String()) // calculate metric for p1 with scope=[m1, m2] for window size=1 - require.Equal(t, "25", tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "25", score.String()) // calculate metric for p1 with no scope for window size=1 - require.Equal(t, "25", tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "25", score.String()) // calculate metric for p2 with scope=[m1] for window size=1 - // max(0, -450/100) - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + // -450/100 + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "-4.5", score.String()) // calculate metric for p1 with scope=[m2] for window size=1 // 100/57.5 - require.Equal(t, "1.7391304347826087", tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "1.7391304348", score.StringFixed(10)) // calculate metric for p1 with scope=[m3] for window size=1 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "0", score.String()) // calculate metric for p1 with scope=[m1, m3] for window size=1 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "-2.7608695652", score.StringFixed(10)) // calculate metric for p1 with no scope for window size=1 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "-2.7608695652", score.StringFixed(10)) // now calculate for window size=2 // calculate metric for p1 with scope=[m1] for window size=2 // (16.3636375537 + 30)/2 - require.Equal(t, "23.1818187768595474", tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2) + require.Equal(t, "23.1818187768595474", score.String()) // calculate metric for p1 with scope=[m2] for window size=2 - // (0 + 0)/2 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2) + require.Equal(t, "-4.3750001875", score.StringFixed(10)) // calculate metric for p1 with scope=[m3] for window size=2 // (6.6666666666666667 + 0)/2 - require.Equal(t, "3.3333333333333334", tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2) + require.Equal(t, "3.3333333333", score.StringFixed(10)) // calculate metric for p1 with scope=[m1, m3] for window size=2 - require.Equal(t, "18.8068185894", tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2).StringFixed(10)) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2) + require.Equal(t, "18.8068185894", score.StringFixed(10)) // calculate metric for p1 with no scope for window size=2 - require.Equal(t, "22.1401519227", tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2).StringFixed(10)) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2) + require.Equal(t, "22.1401519227", score.StringFixed(10)) // calculate metric for p2 with scope=[m1] for window size=2 - // (0 + 0)/2 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2) + require.Equal(t, "-3.25", score.String()) // calculate metric for p2 with scope=[m2] for window size=2 // (0.4285714285714286 + 1.7391304347826087)/2 - require.Equal(t, "1.0838509439219173", tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2) + require.Equal(t, "1.0838509439", score.StringFixed(10)) // calculate metric for p2 with scope=[m3] for window size=2 - // (0 + 0)/2 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2) + require.Equal(t, "-0.6666666667", score.StringFixed(10)) // calculate metric for p2 with scope=[m1, m3] for window size=2 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2) + require.Equal(t, "-3.9166666667", score.StringFixed(10)) // calculate metric for p2 with no scope for window size=2 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 2) + require.Equal(t, "-2.8328157227", score.StringFixed(10)) // start epoch3 epochService.target(context.Background(), types.Epoch{Seq: 3, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Unix(120, 0)}) @@ -1085,61 +1277,78 @@ func TestCalculateMetricForPartyRelativeReturn(t *testing.T) { // calculate metric for p1 with scope=[m1] for window size=1 // 0/20 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "0", score.String()) // calculate metric for p1 with scope=[m2] for window size=1 // 0/20 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "0", score.String()) // calculate metric for p1 with scope=[m3] for window size=1 // 0/30 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "0", score.String()) // calculate metric for p1 with scope=[m1, m3] for window size=1 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "0", score.String()) // calculate metric for p1 with no scope for window size=1 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "0", score.String()) // calculate metric for p2 with scope=[m1] for window size=1 // 0/100 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "0", score.String()) // calculate metric for p2 with scope=[m2] for window size=1 // 0/10 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "0", score.String()) // calculate metric for p2 with scope=[m3] for window size=1 // 0/300 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "0", score.String()) // calculate metric for p2 with scope=[m1, m3] for window size=1 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "0", score.String()) // calculate metric for p2 with no scope for window size=1 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 1) + require.Equal(t, "0", score.String()) // // now calculate for window size=3 // calculate metric for p1 with scope=[m1] for window size=3 // (16.363636363636363 + 30)/3 - require.Equal(t, "15.4545458512396983", tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3) + require.Equal(t, "15.4545458512", score.StringFixed(10)) // calculate metric for p1 with scope=[m2] for window size=3 - // (0+0+0)/3 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3) + require.Equal(t, "-2.9166667917", score.StringFixed(10)) // calculate metric for p1 with scope=[m3] for window size=3 // (6.6666666666666667 + 0)/3 - require.Equal(t, "2.2222222222222222", tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3) + require.Equal(t, "2.2222222222", score.StringFixed(10)) // calculate metric for p1 with scope=[m1, m3] for window size=3 - require.Equal(t, "12.5378790596", tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3).StringFixed(10)) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3) + require.Equal(t, "12.5378790596", score.StringFixed(10)) // calculate metric for p1 with no scope for window size=3 - require.Equal(t, "14.7601012818", tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3).StringFixed(10)) + score, _ = tracker.calculateMetricForParty("a1", "p1", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3) + require.Equal(t, "14.7601012818", score.StringFixed(10)) // calculate metric for p2 with scope=[m1] for window size=3 - // (0 +0+0)/3 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3) + require.Equal(t, "-2.1666666667", score.StringFixed(10)) // calculate metric for p2 with scope=[m2] for window size=3 // (0.4285714285714286 + 1.7391304347826087 + 0 )/3 - require.Equal(t, "0.7225672959479449", tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3) + require.Equal(t, "0.7225672959", score.StringFixed(10)) // calculate metric for p2 with scope=[m3] for window size=3 - // (0 +0+0)/3 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3) + require.Equal(t, "-0.4444444444", score.StringFixed(10)) // calculate metric for p2 with scope=[m1, m3] for window size=3 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{"m1", "m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3) + require.Equal(t, "-2.6111111111", score.StringFixed(10)) // calculate metric for p2 with no scope for window size=3 - require.Equal(t, "0", tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3).String()) + score, _ = tracker.calculateMetricForParty("a1", "p2", []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, 3) + require.Equal(t, "-1.8885438152", score.StringFixed(10)) } func TestCalculateMetricForParty(t *testing.T) { @@ -1171,7 +1380,8 @@ func TestCalculateMetricForParty(t *testing.T) { } for _, dm := range ds { - require.Equal(t, num.DecimalZero(), tracker.calculateMetricForParty("a1", "p1", []string{}, dm, 1)) + score, _ := tracker.calculateMetricForParty("a1", "p1", []string{}, dm, 1) + require.Equal(t, num.DecimalZero(), score) } } @@ -1183,23 +1393,23 @@ func TestCalculateMetricForTeamUtil(t *testing.T) { } return false } - calculateMetricForParty := func(asset, party string, marketsInScope []string, metric vega.DispatchMetric, windowSize int) num.Decimal { + calculateMetricForParty := func(asset, party string, marketsInScope []string, metric vega.DispatchMetric, windowSize int) (num.Decimal, bool) { if party == "party1" { - return num.DecimalFromFloat(1.5) + return num.DecimalFromFloat(1.5), true } if party == "party2" { - return num.DecimalFromFloat(2) + return num.DecimalFromFloat(2), true } if party == "party3" { - return num.DecimalFromFloat(0.5) + return num.DecimalFromFloat(0.5), true } if party == "party4" { - return num.DecimalFromFloat(2.5) + return num.DecimalFromFloat(2.5), true } if party == "party5" { - return num.DecimalFromFloat(0.8) + return num.DecimalFromFloat(0.8), true } - return num.DecimalZero() + return num.DecimalZero(), false } gameID := "game123" @@ -1271,3 +1481,136 @@ func TestIntoProto(t *testing.T) { mt2Proto := mt2.IntoProto("market1") require.Equal(t, mt1Proto.String(), mt2Proto.String()) } + +func TestEpochTakerFeesToProto(t *testing.T) { + for i := 0; i < 10; i++ { + epoch1 := map[string]map[string]map[string]*num.Uint{} + epoch1["asset1"] = map[string]map[string]*num.Uint{} + epoch1["asset1"]["market1"] = map[string]*num.Uint{} + epoch1["asset1"]["market1"]["party3"] = num.NewUint(3) + epoch1["asset1"]["market1"]["party1"] = num.NewUint(1) + epoch1["asset1"]["market1"]["party2"] = num.NewUint(2) + + epoch1["asset1"]["market2"] = map[string]*num.Uint{} + epoch1["asset1"]["market2"]["party4"] = num.NewUint(6) + epoch1["asset1"]["market2"]["party3"] = num.NewUint(5) + epoch1["asset1"]["market2"]["party1"] = num.NewUint(4) + + epoch1["asset1"]["market3"] = map[string]*num.Uint{} + epoch1["asset1"]["market3"]["party6"] = num.NewUint(8) + epoch1["asset1"]["market3"]["party5"] = num.NewUint(7) + + epoch1["asset2"] = map[string]map[string]*num.Uint{} + epoch1["asset2"]["market1"] = map[string]*num.Uint{} + epoch1["asset2"]["market1"]["party1"] = num.NewUint(11) + epoch1["asset2"]["market1"]["party2"] = num.NewUint(21) + epoch1["asset2"]["market1"]["party3"] = num.NewUint(31) + + epoch1["asset2"]["market4"] = map[string]*num.Uint{} + epoch1["asset2"]["market4"]["party5"] = num.NewUint(9) + epoch1["asset2"]["market4"]["party6"] = num.NewUint(10) + epoch1["asset2"]["market4"]["party7"] = num.NewUint(11) + + epoch2 := map[string]map[string]map[string]*num.Uint{} + epoch2["asset1"] = map[string]map[string]*num.Uint{} + epoch2["asset1"]["market1"] = map[string]*num.Uint{} + epoch2["asset1"]["market1"]["party5"] = num.NewUint(15) + epoch2["asset1"]["market1"]["party6"] = num.NewUint(16) + epoch2["asset1"]["market2"] = map[string]*num.Uint{} + epoch2["asset1"]["market2"]["party1"] = num.NewUint(17) + epoch2["asset1"]["market2"]["party2"] = num.NewUint(18) + epoch2["asset1"]["market3"] = map[string]*num.Uint{} + epoch2["asset1"]["market3"]["party4"] = num.NewUint(20) + epoch2["asset1"]["market3"]["party3"] = num.NewUint(19) + + epoch2["asset2"] = map[string]map[string]*num.Uint{} + epoch2["asset2"]["market1"] = map[string]*num.Uint{} + epoch2["asset2"]["market4"] = map[string]*num.Uint{} + epoch2["asset2"]["market1"]["party7"] = num.NewUint(41) + epoch2["asset2"]["market4"]["party6"] = num.NewUint(31) + + epochData := []map[string]map[string]map[string]*num.Uint{ + epoch1, + epoch2, + } + + res := epochTakerFeesToProto(epochData) + require.Equal(t, 2, len(res)) + require.Equal(t, 5, len(res[0].EpochPartyTakerFeesPaid)) + require.Equal(t, 5, len(res[1].EpochPartyTakerFeesPaid)) + + require.Equal(t, "asset1", res[0].EpochPartyTakerFeesPaid[0].Asset) + require.Equal(t, "market1", res[0].EpochPartyTakerFeesPaid[0].Market) + require.Equal(t, "party1", res[0].EpochPartyTakerFeesPaid[0].TakerFees[0].Party) + require.Equal(t, "1", num.UintFromBytes(res[0].EpochPartyTakerFeesPaid[0].TakerFees[0].TakerFees).String()) + require.Equal(t, "party2", res[0].EpochPartyTakerFeesPaid[0].TakerFees[1].Party) + require.Equal(t, "2", num.UintFromBytes(res[0].EpochPartyTakerFeesPaid[0].TakerFees[1].TakerFees).String()) + require.Equal(t, "party3", res[0].EpochPartyTakerFeesPaid[0].TakerFees[2].Party) + require.Equal(t, "3", num.UintFromBytes(res[0].EpochPartyTakerFeesPaid[0].TakerFees[2].TakerFees).String()) + + require.Equal(t, "asset1", res[0].EpochPartyTakerFeesPaid[1].Asset) + require.Equal(t, "market2", res[0].EpochPartyTakerFeesPaid[1].Market) + require.Equal(t, "party1", res[0].EpochPartyTakerFeesPaid[1].TakerFees[0].Party) + require.Equal(t, "4", num.UintFromBytes(res[0].EpochPartyTakerFeesPaid[1].TakerFees[0].TakerFees).String()) + require.Equal(t, "party3", res[0].EpochPartyTakerFeesPaid[1].TakerFees[1].Party) + require.Equal(t, "5", num.UintFromBytes(res[0].EpochPartyTakerFeesPaid[1].TakerFees[1].TakerFees).String()) + require.Equal(t, "party4", res[0].EpochPartyTakerFeesPaid[1].TakerFees[2].Party) + require.Equal(t, "6", num.UintFromBytes(res[0].EpochPartyTakerFeesPaid[1].TakerFees[2].TakerFees).String()) + + require.Equal(t, "asset1", res[0].EpochPartyTakerFeesPaid[2].Asset) + require.Equal(t, "market3", res[0].EpochPartyTakerFeesPaid[2].Market) + require.Equal(t, "party5", res[0].EpochPartyTakerFeesPaid[2].TakerFees[0].Party) + require.Equal(t, "7", num.UintFromBytes(res[0].EpochPartyTakerFeesPaid[2].TakerFees[0].TakerFees).String()) + require.Equal(t, "party6", res[0].EpochPartyTakerFeesPaid[2].TakerFees[1].Party) + require.Equal(t, "8", num.UintFromBytes(res[0].EpochPartyTakerFeesPaid[2].TakerFees[1].TakerFees).String()) + + require.Equal(t, "asset2", res[0].EpochPartyTakerFeesPaid[3].Asset) + require.Equal(t, "market1", res[0].EpochPartyTakerFeesPaid[3].Market) + require.Equal(t, "party1", res[0].EpochPartyTakerFeesPaid[3].TakerFees[0].Party) + require.Equal(t, "11", num.UintFromBytes(res[0].EpochPartyTakerFeesPaid[3].TakerFees[0].TakerFees).String()) + require.Equal(t, "party2", res[0].EpochPartyTakerFeesPaid[3].TakerFees[1].Party) + require.Equal(t, "21", num.UintFromBytes(res[0].EpochPartyTakerFeesPaid[3].TakerFees[1].TakerFees).String()) + require.Equal(t, "party3", res[0].EpochPartyTakerFeesPaid[3].TakerFees[2].Party) + require.Equal(t, "31", num.UintFromBytes(res[0].EpochPartyTakerFeesPaid[3].TakerFees[2].TakerFees).String()) + + require.Equal(t, "asset2", res[0].EpochPartyTakerFeesPaid[4].Asset) + require.Equal(t, "market4", res[0].EpochPartyTakerFeesPaid[4].Market) + require.Equal(t, "party5", res[0].EpochPartyTakerFeesPaid[4].TakerFees[0].Party) + require.Equal(t, "9", num.UintFromBytes(res[0].EpochPartyTakerFeesPaid[4].TakerFees[0].TakerFees).String()) + require.Equal(t, "party6", res[0].EpochPartyTakerFeesPaid[4].TakerFees[1].Party) + require.Equal(t, "10", num.UintFromBytes(res[0].EpochPartyTakerFeesPaid[4].TakerFees[1].TakerFees).String()) + require.Equal(t, "party7", res[0].EpochPartyTakerFeesPaid[4].TakerFees[2].Party) + require.Equal(t, "11", num.UintFromBytes(res[0].EpochPartyTakerFeesPaid[4].TakerFees[2].TakerFees).String()) + + require.Equal(t, "asset1", res[1].EpochPartyTakerFeesPaid[0].Asset) + require.Equal(t, "market1", res[1].EpochPartyTakerFeesPaid[0].Market) + require.Equal(t, "party5", res[1].EpochPartyTakerFeesPaid[0].TakerFees[0].Party) + require.Equal(t, "15", num.UintFromBytes(res[1].EpochPartyTakerFeesPaid[0].TakerFees[0].TakerFees).String()) + require.Equal(t, "party6", res[1].EpochPartyTakerFeesPaid[0].TakerFees[1].Party) + require.Equal(t, "16", num.UintFromBytes(res[1].EpochPartyTakerFeesPaid[0].TakerFees[1].TakerFees).String()) + + require.Equal(t, "asset1", res[1].EpochPartyTakerFeesPaid[1].Asset) + require.Equal(t, "market2", res[1].EpochPartyTakerFeesPaid[1].Market) + require.Equal(t, "party1", res[1].EpochPartyTakerFeesPaid[1].TakerFees[0].Party) + require.Equal(t, "17", num.UintFromBytes(res[1].EpochPartyTakerFeesPaid[1].TakerFees[0].TakerFees).String()) + require.Equal(t, "party2", res[1].EpochPartyTakerFeesPaid[1].TakerFees[1].Party) + require.Equal(t, "18", num.UintFromBytes(res[1].EpochPartyTakerFeesPaid[1].TakerFees[1].TakerFees).String()) + + require.Equal(t, "asset1", res[1].EpochPartyTakerFeesPaid[2].Asset) + require.Equal(t, "market3", res[1].EpochPartyTakerFeesPaid[2].Market) + require.Equal(t, "party3", res[1].EpochPartyTakerFeesPaid[2].TakerFees[0].Party) + require.Equal(t, "19", num.UintFromBytes(res[1].EpochPartyTakerFeesPaid[2].TakerFees[0].TakerFees).String()) + require.Equal(t, "party4", res[1].EpochPartyTakerFeesPaid[2].TakerFees[1].Party) + require.Equal(t, "20", num.UintFromBytes(res[1].EpochPartyTakerFeesPaid[2].TakerFees[1].TakerFees).String()) + + require.Equal(t, "asset2", res[1].EpochPartyTakerFeesPaid[3].Asset) + require.Equal(t, "market1", res[1].EpochPartyTakerFeesPaid[3].Market) + require.Equal(t, "party7", res[1].EpochPartyTakerFeesPaid[3].TakerFees[0].Party) + require.Equal(t, "41", num.UintFromBytes(res[1].EpochPartyTakerFeesPaid[3].TakerFees[0].TakerFees).String()) + + require.Equal(t, "asset2", res[1].EpochPartyTakerFeesPaid[4].Asset) + require.Equal(t, "market4", res[1].EpochPartyTakerFeesPaid[4].Market) + require.Equal(t, "party6", res[1].EpochPartyTakerFeesPaid[4].TakerFees[0].Party) + require.Equal(t, "31", num.UintFromBytes(res[1].EpochPartyTakerFeesPaid[4].TakerFees[0].TakerFees).String()) + } +} diff --git a/core/execution/common/market_activity_tracker_snapshot.go b/core/execution/common/market_activity_tracker_snapshot.go index 01e5d59a24..0674ec9617 100644 --- a/core/execution/common/market_activity_tracker_snapshot.go +++ b/core/execution/common/market_activity_tracker_snapshot.go @@ -52,16 +52,16 @@ func (mat *MarketActivityTracker) Stopped() bool { return false } -func returnsDataToProto(partyM2MData map[string]num.Decimal) []*checkpoint.ReturnsData { - parties := make([]string, 0, len(partyM2MData)) - for k := range partyM2MData { +func returnsDataToProto(returnsData map[string]num.Decimal) []*checkpoint.ReturnsData { + parties := make([]string, 0, len(returnsData)) + for k := range returnsData { parties = append(parties, k) } sort.Strings(parties) data := make([]*checkpoint.ReturnsData, 0, len(parties)) for _, party := range parties { rd := &checkpoint.ReturnsData{Party: party} - rd.Return, _ = partyM2MData[party].MarshalBinary() + rd.Return, _ = returnsData[party].MarshalBinary() data = append(data, rd) } return data @@ -88,6 +88,49 @@ func epochReturnDataToProto(epochData []map[string]num.Decimal) []*checkpoint.Ep return ret } +func epochTakerFeesToProto(epochData []map[string]map[string]map[string]*num.Uint) []*checkpoint.EpochPartyTakerFees { + ret := make([]*checkpoint.EpochPartyTakerFees, 0, len(epochData)) + for _, epoch := range epochData { + ed := []*checkpoint.AssetMarketPartyTakerFees{} + assets := make([]string, 0, len(epoch)) + for k := range epoch { + assets = append(assets, k) + } + sort.Strings(assets) + for _, asset := range assets { + assetData := epoch[asset] + markets := make([]string, 0, len(assetData)) + for market := range assetData { + markets = append(markets, market) + } + sort.Strings(markets) + for _, market := range markets { + takerFees := assetData[market] + parties := make([]string, 0, len(takerFees)) + for party := range takerFees { + parties = append(parties, party) + } + sort.Strings(parties) + partyFees := make([]*checkpoint.PartyTakerFees, 0, len(parties)) + for _, party := range parties { + fee := takerFees[party].Bytes() + partyFees = append(partyFees, &checkpoint.PartyTakerFees{ + Party: party, + TakerFees: fee[:], + }) + } + ed = append(ed, &checkpoint.AssetMarketPartyTakerFees{ + Asset: asset, + Market: market, + TakerFees: partyFees, + }) + } + } + ret = append(ret, &checkpoint.EpochPartyTakerFees{EpochPartyTakerFeesPaid: ed}) + } + return ret +} + func timeWeightedNotionalToProto(twNotional map[string]*twNotional) []*checkpoint.TWNotionalData { parties := make([]string, 0, len(twNotional)) for k := range twNotional { @@ -245,6 +288,8 @@ func (mt *marketTracker) IntoProto(market string) *checkpoint.MarketActivityTrac MakerFeesReceived: marketFeesToProto(mt.makerFeesReceived), MakerFeesPaid: marketFeesToProto(mt.makerFeesPaid), LpFees: marketFeesToProto(mt.lpFees), + InfraFees: marketFeesToProto(mt.infraFees), + LpPaidFees: marketFeesToProto(mt.lpPaidFees), Proposer: mt.proposer, BonusPaid: paid, ValueTraded: mt.valueTraded.String(), @@ -258,6 +303,8 @@ func (mt *marketTracker) IntoProto(market string) *checkpoint.MarketActivityTrac TimeWeightedPositionDataHistory: timeWeightedPositionHistoryToProto(mt.epochTimeWeightedPosition), TimeWeightedNotionalDataHistory: timeWeightedNotionalHistoryToProto(mt.epochTimeWeightedNotional), ReturnsDataHistory: epochReturnDataToProto(mt.epochPartyM2M), + RealisedReturns: returnsDataToProto(mt.partyRealisedReturn), + RealisedReturnsHistory: epochReturnDataToProto(mt.epochPartyRealisedReturn), } } @@ -285,6 +332,7 @@ func (mat *MarketActivityTracker) serialiseFeesTracker() *snapshot.MarketTracker MarketActivity: marketActivity, TakerNotionalVolume: takerNotionalToProto(mat.partyTakerNotionalVolume), MarketToPartyTakerNotionalVolume: marketToPartyTakerNotionalToProto(mat.marketToPartyTakerNotionalVolume), + EpochTakerFees: epochTakerFeesToProto(mat.takerFeesPaidInEpoch), } } @@ -340,11 +388,14 @@ func marketTrackerFromProto(tracker *checkpoint.MarketActivityTracker) *marketTr makerFeesReceived: map[string]*num.Uint{}, makerFeesPaid: map[string]*num.Uint{}, lpFees: map[string]*num.Uint{}, + infraFees: map[string]*num.Uint{}, + lpPaidFees: map[string]*num.Uint{}, totalMakerFeesReceived: num.UintZero(), totalMakerFeesPaid: num.UintZero(), totalLpFees: num.UintZero(), twPosition: map[string]*twPosition{}, partyM2M: map[string]num.Decimal{}, + partyRealisedReturn: map[string]num.Decimal{}, twNotional: map[string]*twNotional{}, epochTotalMakerFeesReceived: []*num.Uint{}, @@ -354,6 +405,7 @@ func marketTrackerFromProto(tracker *checkpoint.MarketActivityTracker) *marketTr epochMakerFeesPaid: []map[string]*num.Uint{}, epochLpFees: []map[string]*num.Uint{}, epochPartyM2M: []map[string]num.Decimal{}, + epochPartyRealisedReturn: []map[string]num.Decimal{}, epochTimeWeightedPosition: []map[string]uint64{}, epochTimeWeightedNotional: []map[string]*num.Uint{}, allPartiesCache: map[string]struct{}{}, @@ -396,6 +448,22 @@ func marketTrackerFromProto(tracker *checkpoint.MarketActivityTracker) *marketTr mft.totalLpFees = total } + if len(tracker.InfraFees) > 0 { + for _, mf := range tracker.InfraFees { + fee, _ := num.UintFromString(mf.Fee, 10) + mft.infraFees[mf.Party] = fee + mft.allPartiesCache[mf.Party] = struct{}{} + } + } + + if len(tracker.LpPaidFees) > 0 { + for _, mf := range tracker.LpPaidFees { + fee, _ := num.UintFromString(mf.Fee, 10) + mft.lpPaidFees[mf.Party] = fee + mft.allPartiesCache[mf.Party] = struct{}{} + } + } + if len(tracker.TimeWeightedPosition) > 0 { for _, tp := range tracker.TimeWeightedPosition { mft.twPosition[tp.Party] = &twPosition{ @@ -426,6 +494,14 @@ func marketTrackerFromProto(tracker *checkpoint.MarketActivityTracker) *marketTr } } + if len(tracker.RealisedReturns) > 0 { + for _, rd := range tracker.RealisedReturns { + ret, _ := num.UnmarshalBinaryDecimal(rd.Return) + mft.partyRealisedReturn[rd.Party] = ret + mft.allPartiesCache[rd.Party] = struct{}{} + } + } + mft.epochMakerFeesPaid = loadFeesHistory(tracker.MakerFeesPaidHistory, mft.allPartiesCache) mft.epochMakerFeesReceived = loadFeesHistory(tracker.MakerFeesReceivedHistory, mft.allPartiesCache) mft.epochLpFees = loadFeesHistory(tracker.LpFeesHistory, mft.allPartiesCache) @@ -468,6 +544,18 @@ func marketTrackerFromProto(tracker *checkpoint.MarketActivityTracker) *marketTr } } + if len(tracker.RealisedReturnsHistory) > 0 { + for _, erd := range tracker.RealisedReturnsHistory { + returns := make(map[string]num.Decimal, len(erd.Returns)) + for _, rd := range erd.Returns { + ret, _ := num.UnmarshalBinaryDecimal(rd.Return) + returns[rd.Party] = ret + mft.allPartiesCache[rd.Party] = struct{}{} + } + mft.epochPartyRealisedReturn = append(mft.epochPartyRealisedReturn, returns) + } + } + mft.asset = tracker.Asset return mft } @@ -520,6 +608,23 @@ func (mat *MarketActivityTracker) restore(tracker *snapshot.MarketTracker) { } } } + if tracker.EpochTakerFees != nil { + for _, epochData := range tracker.EpochTakerFees { + epochMap := map[string]map[string]map[string]*num.Uint{} + for _, assetMarketParty := range epochData.EpochPartyTakerFeesPaid { + if _, ok := epochMap[assetMarketParty.Asset]; !ok { + epochMap[assetMarketParty.Asset] = map[string]map[string]*num.Uint{} + } + if _, ok := epochMap[assetMarketParty.Asset][assetMarketParty.Market]; !ok { + epochMap[assetMarketParty.Asset][assetMarketParty.Market] = map[string]*num.Uint{} + } + for _, tf := range assetMarketParty.TakerFees { + epochMap[assetMarketParty.Asset][assetMarketParty.Market][tf.Party] = num.UintFromBytes(tf.TakerFees) + } + } + mat.takerFeesPaidInEpoch = append(mat.takerFeesPaidInEpoch, epochMap) + } + } } // OnEpochRestore is called when the state of the epoch changes, we only care about new epochs starting. diff --git a/core/execution/common/market_activity_tracker_test.go b/core/execution/common/market_activity_tracker_test.go index 456b6a620d..e381412adc 100644 --- a/core/execution/common/market_activity_tracker_test.go +++ b/core/execution/common/market_activity_tracker_test.go @@ -546,6 +546,8 @@ func TestGetLastEpochTakeFees(t *testing.T) { transfersM1 := []*types.Transfer{ {Owner: "party1", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(100)}}, {Owner: "party1", Type: types.TransferTypeMakerFeePay, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(200)}}, + {Owner: "party1", Type: types.TransferTypeInfrastructureFeePay, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(110)}}, + {Owner: "party1", Type: types.TransferTypeLiquidityFeePay, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(10)}}, {Owner: "party1", Type: types.TransferTypeLiquidityFeeNetDistribute, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(200)}}, {Owner: "party1", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(400)}}, {Owner: "party1", Type: types.TransferTypeMakerFeePay, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(300)}}, @@ -567,25 +569,112 @@ func TestGetLastEpochTakeFees(t *testing.T) { epochEngine.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_END}) - m1 := tracker.GetLastEpochTakeFees("asset1", []string{"market1"}) + m1 := tracker.GetLastEpochTakeFees("asset1", []string{"market1"}, 1) require.Equal(t, 2, len(m1)) - require.Equal(t, "500", m1["party1"].String()) + require.Equal(t, "620", m1["party1"].String()) require.Equal(t, "1000", m1["party2"].String()) - m2 := tracker.GetLastEpochTakeFees("asset1", []string{"market2"}) + m2 := tracker.GetLastEpochTakeFees("asset1", []string{"market2"}, 1) require.Equal(t, 1, len(m2)) require.Equal(t, "150", m2["party2"].String()) - mAll := tracker.GetLastEpochTakeFees("asset1", []string{"market1", "market2"}) - require.Equal(t, "500", mAll["party1"].String()) + mAll := tracker.GetLastEpochTakeFees("asset1", []string{"market1", "market2"}, 1) + require.Equal(t, "620", mAll["party1"].String()) require.Equal(t, "1150", mAll["party2"].String()) - mNoMarkets := tracker.GetLastEpochTakeFees("asset1", []string{}) - require.Equal(t, "500", mNoMarkets["party1"].String()) + mNoMarkets := tracker.GetLastEpochTakeFees("asset1", []string{}, 1) + require.Equal(t, "620", mNoMarkets["party1"].String()) require.Equal(t, "1150", mNoMarkets["party2"].String()) require.Equal(t, mAll, mNoMarkets) } +func TestGetLastEpochTakeFeesMultiEpochWindow(t *testing.T) { + epochEngine := &TestEpochEngine{} + ctx := context.Background() + ctrl := gomock.NewController(t) + teams := mocks.NewMockTeams(ctrl) + balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + broker := bmocks.NewMockBroker(ctrl) + 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}) + tracker.SetEligibilityChecker(&EligibilityChecker{}) + + partyScores := tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "a1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_RECEIVED, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 3}) + require.Equal(t, 0, len(partyScores)) + + tracker.MarketProposed("asset1", "market1", "me") + tracker.MarketProposed("asset1", "market2", "me2") + + // update with a few transfers + transfersM1 := []*types.Transfer{ + {Owner: "party1", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(100)}}, + {Owner: "party1", Type: types.TransferTypeMakerFeePay, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(200)}}, + {Owner: "party1", Type: types.TransferTypeInfrastructureFeePay, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(110)}}, + {Owner: "party1", Type: types.TransferTypeLiquidityFeePay, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(10)}}, + {Owner: "party1", Type: types.TransferTypeLiquidityFeeNetDistribute, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(200)}}, + {Owner: "party1", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(400)}}, + {Owner: "party1", Type: types.TransferTypeMakerFeePay, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(300)}}, + {Owner: "party1", Type: types.TransferTypeLiquidityFeeNetDistribute, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(600)}}, + {Owner: "party2", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(900)}}, + {Owner: "party2", Type: types.TransferTypeMakerFeePay, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(800)}}, + {Owner: "party2", Type: types.TransferTypeLiquidityFeeNetDistribute, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(700)}}, + {Owner: "party2", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(600)}}, + {Owner: "party2", Type: types.TransferTypeMakerFeePay, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(200)}}, + {Owner: "party2", Type: types.TransferTypeLiquidityFeeNetDistribute, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(1000)}}, + } + tracker.UpdateFeesFromTransfers("asset1", "market1", transfersM1) + + transfersM2 := []*types.Transfer{ + {Owner: "party1", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "asset2", Amount: num.NewUint(150)}}, + {Owner: "party2", Type: types.TransferTypeMakerFeePay, Amount: &types.FinancialAmount{Asset: "asset2", Amount: num.NewUint(150)}}, + } + tracker.UpdateFeesFromTransfers("asset1", "market2", transfersM2) + + epochEngine.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_END}) + epochEngine.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_START}) + + // double the fees for a window of 2 + tracker.UpdateFeesFromTransfers("asset1", "market1", transfersM1) + tracker.UpdateFeesFromTransfers("asset1", "market2", transfersM2) + + epochEngine.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_END}) + m1 := tracker.GetLastEpochTakeFees("asset1", []string{"market1"}, 1) + require.Equal(t, 2, len(m1)) + require.Equal(t, "620", m1["party1"].String()) + require.Equal(t, "1000", m1["party2"].String()) + + m1 = tracker.GetLastEpochTakeFees("asset1", []string{"market1"}, 2) + require.Equal(t, 2, len(m1)) + require.Equal(t, "1240", m1["party1"].String()) + require.Equal(t, "2000", m1["party2"].String()) + + m2 := tracker.GetLastEpochTakeFees("asset1", []string{"market2"}, 1) + require.Equal(t, 1, len(m2)) + require.Equal(t, "150", m2["party2"].String()) + + m2 = tracker.GetLastEpochTakeFees("asset1", []string{"market2"}, 2) + require.Equal(t, 1, len(m2)) + require.Equal(t, "300", m2["party2"].String()) + + mAll := tracker.GetLastEpochTakeFees("asset1", []string{"market1", "market2"}, 1) + require.Equal(t, "620", mAll["party1"].String()) + require.Equal(t, "1150", mAll["party2"].String()) + + mAll = tracker.GetLastEpochTakeFees("asset1", []string{"market1", "market2"}, 2) + require.Equal(t, "1240", mAll["party1"].String()) + require.Equal(t, "2300", mAll["party2"].String()) + + mNoMarkets := tracker.GetLastEpochTakeFees("asset1", []string{}, 1) + require.Equal(t, "620", mNoMarkets["party1"].String()) + require.Equal(t, "1150", mNoMarkets["party2"].String()) + + mNoMarkets = tracker.GetLastEpochTakeFees("asset1", []string{}, 2) + require.Equal(t, "1240", mNoMarkets["party1"].String()) + require.Equal(t, "2300", mNoMarkets["party2"].String()) + require.Equal(t, mAll, mNoMarkets) +} + func TestFeesTracker(t *testing.T) { epochEngine := &TestEpochEngine{} ctx := context.Background() @@ -1108,6 +1197,104 @@ func TestPositionMetric(t *testing.T) { require.Equal(t, "102.5", scores[0].Score.String()) } +func TestRealisedReturnMetric(t *testing.T) { + epochService := &TestEpochEngine{} + ctx := context.Background() + ctrl := gomock.NewController(t) + teams := mocks.NewMockTeams(ctrl) + balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + broker := bmocks.NewMockBroker(ctrl) + broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() + tracker := common.NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) + epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) + + epochStartTime := time.Now() + epochService.target(context.Background(), types.Epoch{Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: epochStartTime}) + tracker.SetEligibilityChecker(&EligibilityChecker{}) + tracker.MarketProposed("a1", "m1", "p1") + + tracker.RecordFundingPayment("a1", "p1", "m1", num.NewDecimalFromFloat(100)) + tracker.RecordFundingPayment("a1", "p1", "m1", num.NewDecimalFromFloat(-200)) + tracker.RecordRealisedPosition("a1", "p1", "m1", num.DecimalFromFloat(130)) + + // now end the epoch after 600 seconds + epochService.target(context.Background(), types.Epoch{Action: vgproto.EpochAction_EPOCH_ACTION_END, StartTime: epochStartTime, EndTime: epochStartTime.Add(1000 * 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, 1, len(scores)) + require.Equal(t, "p1", scores[0].Party) + require.Equal(t, "30", scores[0].Score.String()) + + 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)) + require.Equal(t, "p1", scores[0].Party) + require.Equal(t, "15", scores[0].Score.String()) + + scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "a1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 3}) + require.Equal(t, 1, len(scores)) + require.Equal(t, "p1", scores[0].Party) + require.Equal(t, "10", scores[0].Score.String()) + + // qualifying the market to m1, expect the same result + scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "a1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 3, Markets: []string{"m1"}}) + require.Equal(t, 1, len(scores)) + require.Equal(t, "p1", scores[0].Party) + require.Equal(t, "10", scores[0].Score.String()) + + // qualifying the market to m2, expect the same result + scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "a1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 3, Markets: []string{"m2"}}) + require.Equal(t, 0, len(scores)) + + epochService.target(context.Background(), types.Epoch{Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: epochStartTime.Add(1000 * time.Second)}) + + tracker.RecordRealisedPosition("a1", "p1", "m1", num.DecimalFromFloat(-45)) + + // end the epoch + epochService.target(context.Background(), types.Epoch{Action: vgproto.EpochAction_EPOCH_ACTION_END, StartTime: epochStartTime.Add(1000 * time.Second), EndTime: epochStartTime.Add(2000 * 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, 1, len(scores)) + require.Equal(t, "p1", scores[0].Party) + require.Equal(t, "-45", scores[0].Score.String()) + + 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)) + require.Equal(t, "p1", scores[0].Party) + require.Equal(t, "-7.5", scores[0].Score.String()) + + scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "a1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 5}) + require.Equal(t, 1, len(scores)) + require.Equal(t, "p1", scores[0].Party) + require.Equal(t, "-3", scores[0].Score.String()) + + // qualify to m1 + scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "a1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 5, Markets: []string{"m1"}}) + require.Equal(t, 1, len(scores)) + require.Equal(t, "p1", scores[0].Party) + require.Equal(t, "-3", scores[0].Score.String()) + + // qualify to m2 + scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "a1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 5, Markets: []string{"m2"}}) + require.Equal(t, 0, len(scores)) + + // now lets lets at an epoch with no activity + epochService.target(context.Background(), types.Epoch{Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: epochStartTime.Add(2000 * time.Second)}) + // 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)) + + 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)) + require.Equal(t, "p1", scores[0].Party) + require.Equal(t, "-22.5", scores[0].Score.String()) + + scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "a1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 4}) + require.Equal(t, 1, len(scores)) + require.Equal(t, "p1", scores[0].Party) + require.Equal(t, "-3.75", scores[0].Score.String()) +} + func TestRelativeReturnMetric(t *testing.T) { ctx := context.Background() epochService := &TestEpochEngine{} @@ -1183,9 +1370,10 @@ func TestRelativeReturnMetric(t *testing.T) { // total m2m = -8 // the time weighted position for the epoch = 160 // therefore r = -0.05 - // max(-0.05, 0) = 0 => nothing is returned scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "a1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_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.05", scores[0].Score.String()) // with window size=2 we get (0.1-0.05)/2 = 0.025 scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "a1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 2}) diff --git a/core/execution/common/mocks/mocks.go b/core/execution/common/mocks/mocks.go index 0eff9107b2..73d0643ac3 100644 --- a/core/execution/common/mocks/mocks.go +++ b/core/execution/common/mocks/mocks.go @@ -312,18 +312,18 @@ func (mr *MockCollateralMockRecorder) ClearPartyOrderMarginAccount(arg0, arg1, a } // ClearSpotMarket mocks base method. -func (m *MockCollateral) ClearSpotMarket(arg0 context.Context, arg1, arg2 string) ([]*types.LedgerMovement, error) { +func (m *MockCollateral) ClearSpotMarket(arg0 context.Context, arg1, arg2 string, arg3 []string) ([]*types.LedgerMovement, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ClearSpotMarket", arg0, arg1, arg2) + ret := m.ctrl.Call(m, "ClearSpotMarket", arg0, arg1, arg2, arg3) ret0, _ := ret[0].([]*types.LedgerMovement) ret1, _ := ret[1].(error) return ret0, ret1 } // ClearSpotMarket indicates an expected call of ClearSpotMarket. -func (mr *MockCollateralMockRecorder) ClearSpotMarket(arg0, arg1, arg2 interface{}) *gomock.Call { +func (mr *MockCollateralMockRecorder) ClearSpotMarket(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClearSpotMarket", reflect.TypeOf((*MockCollateral)(nil).ClearSpotMarket), arg0, arg1, arg2) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClearSpotMarket", reflect.TypeOf((*MockCollateral)(nil).ClearSpotMarket), arg0, arg1, arg2, arg3) } // CreateMarketAccounts mocks base method. diff --git a/core/execution/engine.go b/core/execution/engine.go index ad191e77fb..af6dc079b5 100644 --- a/core/execution/engine.go +++ b/core/execution/engine.go @@ -796,14 +796,14 @@ func (e *Engine) submitSpotMarket(ctx context.Context, marketConfig *types.Marke e.collateral.CreateSpotMarketAccounts(ctx, marketConfig.ID, quoteAsset) - if err := e.propagateSpotInitialNetParams(ctx, mkt); err != nil { + if err := e.propagateSpotInitialNetParams(ctx, mkt, false); err != nil { return err } return nil } -func (e *Engine) propagateSpotInitialNetParams(ctx context.Context, mkt *spot.Market) error { +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) } @@ -848,6 +848,10 @@ func (e *Engine) propagateSpotInitialNetParams(ctx context.Context, mkt *spot.Ma 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 } @@ -1688,7 +1692,7 @@ func (e *Engine) OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(_ context.Co ) } - for _, m := range e.futureMarketsCpy { + for _, m := range e.allMarketsCpy { // Set immediately during opening auction if m.IsOpeningAuction() { m.OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(d) diff --git a/core/execution/engine_snapshot.go b/core/execution/engine_snapshot.go index 66cab76c6b..82ebd5eedc 100644 --- a/core/execution/engine_snapshot.go +++ b/core/execution/engine_snapshot.go @@ -151,7 +151,7 @@ func (e *Engine) restoreSpotMarket(ctx context.Context, em *types.ExecSpotMarket e.spotMarketsCpy = append(e.spotMarketsCpy, mkt) e.allMarkets[marketConfig.ID] = mkt - if err := e.propagateSpotInitialNetParams(ctx, mkt); err != nil { + if err := e.propagateSpotInitialNetParams(ctx, mkt, true); err != nil { return nil, err } // ensure this is set correctly diff --git a/core/execution/engine_snapshot_test.go b/core/execution/engine_snapshot_test.go index d80587d580..89bb5a1b62 100644 --- a/core/execution/engine_snapshot_test.go +++ b/core/execution/engine_snapshot_test.go @@ -40,6 +40,7 @@ import ( "code.vegaprotocol.io/vega/libs/proto" "code.vegaprotocol.io/vega/logging" "code.vegaprotocol.io/vega/protos/vega" + commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" datapb "code.vegaprotocol.io/vega/protos/vega/data/v1" snapshot "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" @@ -124,6 +125,7 @@ func createEngine(t *testing.T) (*execution.Engine, *gomock.Controller) { timeService.EXPECT().GetTimeNow().AnyTimes() collateralService := mocks.NewMockCollateral(ctrl) + collateralService.EXPECT().HasGeneralAccount(gomock.Any(), gomock.Any()).Return(true).AnyTimes() collateralService.EXPECT().GetPartyMargin(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() collateralService.EXPECT().AssetExists(gomock.Any()).AnyTimes().Return(true) collateralService.EXPECT().CreateMarketAccounts(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() @@ -210,6 +212,10 @@ func getSpotMarketConfig() *types.Market { InfrastructureFee: num.DecimalFromFloat(0.1), LiquidityFee: num.DecimalFromFloat(0.1), }, + LiquidityFeeSettings: &types.LiquidityFeeSettings{ + Method: types.LiquidityFeeMethodConstant, + FeeConstant: num.DecimalFromFloat(0.001), + }, }, LiquiditySLAParams: &types.LiquiditySLAParams{ PriceRange: num.DecimalFromFloat(0.05), @@ -504,7 +510,7 @@ func TestValidMarketSnapshot(t *testing.T) { } func TestValidSpotMarketSnapshot(t *testing.T) { - ctx := context.Background() + ctx := vgcontext.WithTraceID(context.Background(), hex.EncodeToString([]byte("0deadbeef"))) engine, ctrl := createEngine(t) defer ctrl.Finish() assert.NotNil(t, engine) @@ -513,6 +519,9 @@ func TestValidSpotMarketSnapshot(t *testing.T) { err := engine.SubmitSpotMarket(ctx, marketConfig, "", time.Now()) assert.NoError(t, err) + marketConfig.State = types.MarketStateActive + engine.OnTick(ctx, time.Now()) + err = engine.SubmitLiquidityProvision(ctx, &types.LiquidityProvisionSubmission{ MarketID: marketConfig.ID, CommitmentAmount: num.NewUint(1000), @@ -580,6 +589,35 @@ func TestValidSpotMarketSnapshot(t *testing.T) { assert.True(t, bytes.Equal(b, b2)) } } + submissionProto := &commandspb.StopOrdersSubmission{ + FallsBelow: &commandspb.StopOrderSetup{ + OrderSubmission: &commandspb.OrderSubmission{ + MarketId: marketConfig.ID, + Price: "100", + Size: 20, + Side: vega.Side_SIDE_BUY, + TimeInForce: vega.Order_TIME_IN_FORCE_FOK, + ExpiresAt: 12345, + Type: vega.Order_TYPE_LIMIT, + Reference: "ref_buy", + }, + }, + RisesAbove: &commandspb.StopOrderSetup{ + OrderSubmission: &commandspb.OrderSubmission{ + MarketId: marketConfig.ID, + Price: "200", + Size: 10, + Side: vega.Side_SIDE_SELL, + TimeInForce: vega.Order_TIME_IN_FORCE_GFA, + ExpiresAt: 54321, + Type: vega.Order_TYPE_MARKET, + Reference: "ref_sell", + }, + }, + } + + stopSubmission, _ := types.NewStopOrderSubmissionFromProto(submissionProto) + require.NotPanics(t, func() { engine2.SubmitStopOrders(ctx, stopSubmission, "zohar", nil, nil, nil) }) } func TestValidSettledMarketSnapshot(t *testing.T) { diff --git a/core/execution/future/auction.go b/core/execution/future/auction.go index 10330d2bfe..66d8368c90 100644 --- a/core/execution/future/auction.go +++ b/core/execution/future/auction.go @@ -21,6 +21,7 @@ import ( "code.vegaprotocol.io/vega/core/execution/common" "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/logging" ) @@ -43,22 +44,17 @@ func (m *Market) checkAuction(ctx context.Context, now time.Time, idgen common.I defer func() { m.triggerStopOrders(ctx, idgen) }() - var ( - trades []*types.Trade - err error - ) + indicativeUncrossingPrice := num.UintZero() checkExceeded := m.mkt.State == types.MarketStatePending // as soon as we have an indicative uncrossing price in opening auction it needs to be passed into the price monitoring engine so statevar calculation can start isOpening := m.as.IsOpeningAuction() if isOpening && !m.pMonitor.Initialised() { - if trades, err = m.matching.GetIndicativeTrades(); err != nil { - m.log.Panic("Can't get indicative trades") - } - if len(trades) > 0 { + indicativeUncrossingPrice = m.matching.OrderBook.GetIndicativePrice() + if !indicativeUncrossingPrice.IsZero() { // pass the first uncrossing trades to price engine so state variables depending on it can be initialised - m.pMonitor.CheckPrice(ctx, m.as, trades, true, true) + m.pMonitor.ResetPriceHistory(indicativeUncrossingPrice) m.OnOpeningAuctionFirstUncrossingPrice() } } @@ -71,15 +67,13 @@ func (m *Market) checkAuction(ctx context.Context, now time.Time, idgen common.I } return } - if len(trades) == 0 { - if trades, err = m.matching.GetIndicativeTrades(); err != nil { - m.log.Panic("Can't get indicative trades") - } + if indicativeUncrossingPrice.IsZero() { + indicativeUncrossingPrice = m.matching.OrderBook.GetIndicativePrice() } // opening auction if isOpening { - if len(trades) == 0 { + if indicativeUncrossingPrice.IsZero() { if checkExceeded && m.as.ExceededMaxOpening(now) { m.log.Debug("Market was cancelled because it failed to leave opening auction in time", logging.MarketID(m.GetID())) m.terminateMarket(ctx, types.MarketStateCancelled, nil) @@ -101,11 +95,6 @@ func (m *Market) checkAuction(ctx context.Context, now time.Time, idgen common.I } // opening auction requirements satisfied at this point, other requirements still need to be checked downstream though m.as.SetReadyToLeave() - m.pMonitor.CheckPrice(ctx, m.as, trades, true, true) - if m.as.ExtensionTrigger() == types.AuctionTriggerPrice { - // this should never, ever happen - m.log.Panic("Leaving opening auction somehow triggered price monitoring to extend the auction") - } // if we don't have yet consensus for the floating point parameters, stay in the opening auction if !m.CanLeaveOpeningAuction() { @@ -143,7 +132,7 @@ func (m *Market) checkAuction(ctx context.Context, now time.Time, idgen common.I m.checkBondBalance(ctx) } if isPrice || m.as.CanLeave() { - m.pMonitor.CheckPrice(ctx, m.as, trades, true, false) + m.pMonitor.CheckPrice(ctx, m.as, indicativeUncrossingPrice, true, true) } end := m.as.CanLeave() if isPrice && end { diff --git a/core/execution/future/event_generation_test.go b/core/execution/future/event_generation_test.go index 29abef84f2..d81bd07be3 100644 --- a/core/execution/future/event_generation_test.go +++ b/core/execution/future/event_generation_test.go @@ -20,6 +20,7 @@ import ( "testing" "time" + "code.vegaprotocol.io/vega/core/events" "code.vegaprotocol.io/vega/core/subscribers" "code.vegaprotocol.io/vega/core/types" vgcrypto "code.vegaprotocol.io/vega/libs/crypto" @@ -79,6 +80,11 @@ func processEventsWithCounter(t *testing.T, tm *testMarket, mdb *subscribers.Mar for _, event := range tm.orderEvents { mdb.Push(event) } + for _, evt := range tm.events { + if co, ok := evt.(*events.CancelledOrders); ok { + mdb.Push(co) + } + } needToQuit := false orders := mdb.GetAllOrders(tm.market.GetID()) for _, order := range orders { @@ -177,8 +183,8 @@ func TestEvents_LeavingAuctionCancelsGFAOrders(t *testing.T) { // Leave auction to force the order to be removed leaveAuction(t, tm, ctx, &now) - // Check we have 6 events (2 additional orders submitted and filled) - assert.Equal(t, uint64(6), tm.orderEventCount) + // Check we have 5 events (2 additional orders submitted and filled) + assert.Equal(t, uint64(5), tm.orderEventCount) processEvents(t, tm, mdb) assert.Equal(t, int64(0), mdb.GetOrderCount(tm.market.GetID())) @@ -246,7 +252,7 @@ func TestEvents_EnteringAuctionCancelsGFNOrders(t *testing.T) { assert.Equal(t, types.AuctionTriggerPrice, tm.market.GetMarketData().Trigger) // Check we have the right amount of events - assert.Equal(t, uint64(12), tm.orderEventCount) + assert.Equal(t, uint64(11), tm.orderEventCount) assert.Equal(t, int64(4), tm.market.GetOrdersOnBookCount()) diff --git a/core/execution/future/isolated_margin.go b/core/execution/future/isolated_margin.go index fe6ae8bb82..6131ff22ad 100644 --- a/core/execution/future/isolated_margin.go +++ b/core/execution/future/isolated_margin.go @@ -62,6 +62,13 @@ func (m *Market) getIsolatedMarginContext(mpos *positions.MarketPosition, order return nil, nil, num.DecimalZero(), nil, num.DecimalZero(), nil, err } increment := m.tradableInstrument.Instrument.Product.GetMarginIncrease(m.timeService.GetTimeNow().UnixNano()) + auctionPrice := m.getAuctionPrice() + marginFactor := m.getMarginFactor(mpos.Party()) + orders := m.matching.GetOrdersPerParty(mpos.Party()) + return marketObservable, pos, increment, auctionPrice, marginFactor, orders, nil +} + +func (m *Market) getAuctionPrice() *num.Uint { var auctionPrice *num.Uint if m.as.InAuction() { auctionPrice = m.matching.GetIndicativePrice() @@ -69,7 +76,5 @@ func (m *Market) getIsolatedMarginContext(mpos *positions.MarketPosition, order auctionPrice = markPrice } } - marginFactor := m.getMarginFactor(mpos.Party()) - orders := m.matching.GetOrdersPerParty(mpos.Party()) - return marketObservable, pos, increment, auctionPrice, marginFactor, orders, nil + return auctionPrice } diff --git a/core/execution/future/liquidation.go b/core/execution/future/liquidation.go index 324b71a43b..2f3cb0b373 100644 --- a/core/execution/future/liquidation.go +++ b/core/execution/future/liquidation.go @@ -26,15 +26,17 @@ import ( ) func (m *Market) checkNetwork(ctx context.Context, now time.Time) error { - // debug + if m.as.InAuction() { + return nil + } // this only returns an error if we couldn't get the price range, incidating no orders on book - order, _ := m.liquidation.OnTick(ctx, now) + order, _ := m.liquidation.OnTick(ctx, now, m.midPrice()) if order == nil { return nil } // register the network order on the positions engine _ = m.position.RegisterOrder(ctx, order) - order.OriginalPrice = num.UintZero().Div(order.Price, m.priceFactor) + order.OriginalPrice, _ = num.UintFromDecimal(order.Price.ToDecimal().Div(m.priceFactor)) m.broker.Send(events.NewOrderEvent(ctx, order)) conf, err := m.matching.SubmitOrder(order) if err != nil { diff --git a/core/execution/future/margin.go b/core/execution/future/margin.go index 1032d30528..eea9e5e603 100644 --- a/core/execution/future/margin.go +++ b/core/execution/future/margin.go @@ -50,7 +50,7 @@ func (m *Market) updateMargin(ctx context.Context, pos []events.MarketPosition) } // we should get any and all risk events we need here increment := m.tradableInstrument.Instrument.Product.GetMarginIncrease(m.timeService.GetTimeNow().UnixNano()) - return m.risk.UpdateMarginsOnSettlement(ctx, margins, price, increment) + return m.risk.UpdateMarginsOnSettlement(ctx, margins, price, increment, m.getAuctionPrice()) } func (m *Market) marginsAuction(ctx context.Context, order *types.Order) ([]events.Risk, []events.MarketPosition, error) { @@ -64,7 +64,7 @@ func (m *Market) marginsAuction(ctx context.Context, order *types.Order) ([]even return nil, nil, err } increment := m.tradableInstrument.Instrument.Product.GetMarginIncrease(m.timeService.GetTimeNow().UnixNano()) - risk, closed := m.risk.UpdateMarginAuction(ctx, []events.Margin{e}, m.getMarketObservable(order.Price.Clone()), increment) + risk, closed := m.risk.UpdateMarginAuction(ctx, []events.Margin{e}, m.getMarketObservable(order.Price.Clone()), increment, m.getAuctionPrice()) if len(closed) > 0 { // this order would take party below maintenance -> stop here return nil, nil, common.ErrMarginCheckInsufficient @@ -80,7 +80,7 @@ func (m *Market) margins(ctx context.Context, mpos *positions.MarketPosition, or return nil, nil, err } increment := m.tradableInstrument.Instrument.Product.GetMarginIncrease(m.timeService.GetTimeNow().UnixNano()) - risk, evt, err := m.risk.UpdateMarginOnNewOrder(ctx, pos, price.Clone(), increment) + risk, evt, err := m.risk.UpdateMarginOnNewOrder(ctx, pos, price.Clone(), increment, m.getAuctionPrice()) if err != nil { return nil, nil, err } diff --git a/core/execution/future/market.go b/core/execution/future/market.go index 4c10a56e82..e4aff333d8 100644 --- a/core/execution/future/market.go +++ b/core/execution/future/market.go @@ -82,7 +82,7 @@ type Market struct { mu sync.Mutex lastTradedPrice *num.Uint - priceFactor *num.Uint + priceFactor num.Decimal // own engines matching *matching.CachedOrderBook @@ -201,9 +201,9 @@ func NewMarket( if err != nil { return nil, fmt.Errorf("unable to instantiate a new market: %w", err) } - priceFactor := num.NewUint(1) - if exp := assetDecimals - mkt.DecimalPlaces; exp != 0 { - priceFactor.Exp(num.NewUint(10), num.NewUint(exp)) + priceFactor := num.DecimalOne() + if exp := int(assetDecimals) - int(mkt.DecimalPlaces); exp != 0 { + priceFactor = num.DecimalFromInt64(10).Pow(num.DecimalFromInt64(int64(exp))) } // @TODO -> the raw auctionstate shouldn't be something exposed to the matching engine @@ -290,7 +290,7 @@ func NewMarket( if mkt.LiquidationStrategy == nil { mkt.LiquidationStrategy = liquidation.GetLegacyStrat() } - le := liquidation.New(log, mkt.LiquidationStrategy, mkt.GetID(), broker, book, auctionState, timeService, marketLiquidity, positionEngine, pMonitor) + le := liquidation.New(log, mkt.LiquidationStrategy, mkt.GetID(), broker, book, auctionState, timeService, positionEngine, pMonitor) marketType := mkt.MarketType() market := &Market{ @@ -694,8 +694,8 @@ func (m *Market) GetMarketState() types.MarketState { // priceToMarketPrecision // It should never return a nil pointer. func (m *Market) priceToMarketPrecision(price *num.Uint) *num.Uint { - // we assume the price is cloned correctly already - return price.Div(price, m.priceFactor) + p, _ := num.UintFromDecimal(price.ToDecimal().Div(m.priceFactor)) + return p } func (m *Market) midPrice() *num.Uint { @@ -749,14 +749,14 @@ func (m *Market) GetMarketData() types.MarketData { } bounds := m.pMonitor.GetCurrentBounds() for _, b := range bounds { - m.priceToMarketPrecision(b.MaxValidPrice) // effictively floors this - m.priceToMarketPrecision(b.MinValidPrice) + b.MaxValidPrice = m.priceToMarketPrecision(b.MaxValidPrice) // effictively floors this + b.MinValidPrice = m.priceToMarketPrecision(b.MinValidPrice) rp, _ := num.UintFromDecimal(b.ReferencePrice) - m.priceToMarketPrecision(rp) + rp = m.priceToMarketPrecision(rp) b.ReferencePrice = num.DecimalFromUint(rp) - if m.priceFactor.NEQ(common.One) { + if m.priceFactor.GreaterThan(num.DecimalOne()) { b.MinValidPrice.AddSum(common.One) // ceil } } @@ -963,6 +963,11 @@ func (m *Market) PostRestore(ctx context.Context) error { } } + // Disposal slippage was set as part of this upgrade, send event to ensure datanode is updated. + if vegacontext.InProgressUpgradeFromMultiple(ctx, "v0.75.8", "v0.75.7") { + m.broker.Send(events.NewMarketUpdatedEvent(ctx, *m.mkt)) + } + return nil } @@ -1043,6 +1048,16 @@ func (m *Market) OnTick(ctx context.Context, t time.Time) bool { // BlockEnd notifies the market of the end of the block. func (m *Market) BlockEnd(ctx context.Context) { defer m.onTxProcessed() + t := m.timeService.GetTimeNow() + if m.mkt.State == types.MarketStateProposed || + m.mkt.State == types.MarketStateCancelled || + m.mkt.State == types.MarketStateRejected || + m.mkt.State == types.MarketStateSettled { + if (m.nextMTM.IsZero() || !m.nextMTM.After(t)) && !m.as.InAuction() { + m.nextMTM = t.Add(m.mtmDelta) + } + return + } // MTM if enough time has elapsed, we are not in auction, and we have a non-zero mark price. // we MTM in leaveAuction before deploying LP orders like we did before, but we do update nextMTM there @@ -1053,7 +1068,6 @@ func (m *Market) BlockEnd(ctx context.Context) { m.idgen = nil }() - t := m.timeService.GetTimeNow() if !m.as.InAuction() { m.markPriceCalculator.CalculateBookMarkPriceAtTimeT(m.tradableInstrument.MarginCalculator.ScalingFactors.InitialMargin, m.mkt.LinearSlippageFactor, m.risk.GetRiskFactors().Short, m.risk.GetRiskFactors().Long, t.UnixNano(), m.matching) if m.internalCompositePriceCalculator != nil { @@ -1073,7 +1087,7 @@ func (m *Market) BlockEnd(ctx context.Context) { t.UnixNano(), m.matching, m.mtmDelta, - m.tradableInstrument.MarginCalculator.ScalingFactors.InitialMargin, m.mkt.LinearSlippageFactor, m.risk.GetRiskFactors().Short, m.risk.GetRiskFactors().Long, false) + m.tradableInstrument.MarginCalculator.ScalingFactors.InitialMargin, m.mkt.LinearSlippageFactor, m.risk.GetRiskFactors().Short, m.risk.GetRiskFactors().Long, false, false) m.nextInternalCompositePriceCalc = t.Add(m.internalCompositePriceFrequency) if (prevInternalCompositePrice == nil || !m.internalCompositePriceCalculator.GetPrice().EQ(prevInternalCompositePrice) || m.settlement.HasTraded()) && !m.getCurrentInternalCompositePrice().IsZero() { @@ -1082,9 +1096,7 @@ 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() { + if (m.nextMTM.IsZero() || !m.nextMTM.After(t)) && !m.as.InAuction() { prevMarkPrice := m.markPriceCalculator.GetPrice() if _, err := m.markPriceCalculator.CalculateMarkPrice( ctx, @@ -1097,7 +1109,7 @@ func (m *Market) BlockEnd(ctx context.Context) { m.mkt.LinearSlippageFactor, m.risk.GetRiskFactors().Short, m.risk.GetRiskFactors().Long, - true); err != nil { + true, false); err != nil { // start the monitoring auction if required if m.as.AuctionStart() { m.enterAuction(ctx) @@ -1258,6 +1270,9 @@ func (m *Market) recordPositionActivity(t *types.Transfer) { t.Type == types.TransferTypePerpFundingWin || t.Type == types.TransferTypePerpFundingLoss { m.marketActivityTracker.RecordM2M(m.settlementAsset, t.Owner, m.mkt.ID, amt) } + if t.Type == types.TransferTypePerpFundingWin || t.Type == types.TransferTypePerpFundingLoss { + m.marketActivityTracker.RecordFundingPayment(m.settlementAsset, t.Owner, m.mkt.ID, amt) + } } func (m *Market) closeMarket(ctx context.Context, t time.Time, finalState types.MarketState, settlementPriceInAsset *num.Uint) error { @@ -1359,7 +1374,7 @@ func (m *Market) getNewPeggedPrice(order *types.Order) (*num.Uint, error) { return num.UintZero(), common.ErrUnableToReprice } - offset := num.UintZero().Mul(order.PeggedOrder.Offset, m.priceFactor) + offset, _ := num.UintFromDecimal(order.PeggedOrder.Offset.ToDecimal().Mul(m.priceFactor)) if order.Side == types.SideSell { price = price.AddSum(offset) // this can only happen when pegged to mid, in which case we want to round to the nearest *better* tick size @@ -1390,8 +1405,7 @@ func (m *Market) repricePeggedOrder(order *types.Order) error { if err != nil { return err } - original := price.Clone() - order.OriginalPrice = original.Div(original, m.priceFactor) // set original price in market precision + order.OriginalPrice, _ = num.UintFromDecimal(price.ToDecimal().Div(m.priceFactor)) // set original price in market precision order.Price = price return nil } @@ -1429,7 +1443,8 @@ func (m *Market) UpdateMarketState(ctx context.Context, changes *types.MarketSta } m.uncrossOrderAtAuctionEnd(ctx) // terminate and settle data (either last traded price for perp, or settlement data provided via governance - m.tradingTerminatedWithFinalState(ctx, final, num.UintZero().Mul(changes.SettlementPrice, m.priceFactor)) + settlement, _ := num.UintFromDecimal(changes.SettlementPrice.ToDecimal().Mul(m.priceFactor)) + m.tradingTerminatedWithFinalState(ctx, final, settlement) } else if changes.UpdateType == types.MarketStateUpdateTypeSuspend { m.mkt.State = types.MarketStateSuspendedViaGovernance m.mkt.TradingMode = types.MarketTradingModeSuspendedViaGovernance @@ -1634,7 +1649,8 @@ func (m *Market) leaveAuction(ctx context.Context, now time.Time) { m.mkt.LinearSlippageFactor, m.risk.GetRiskFactors().Short, m.risk.GetRiskFactors().Long, - true); err != nil { + true, + wasOpeningAuction); err != nil { if evt := m.as.AuctionExtended(ctx, m.timeService.GetTimeNow()); evt != nil { m.broker.Send(evt) } @@ -1645,8 +1661,9 @@ func (m *Market) leaveAuction(ctx context.Context, now time.Time) { } } - if !m.as.InAuction() && wasOpeningAuction && (m.getCurrentMarkPrice().IsZero()) { + if wasOpeningAuction && !m.as.IsOpeningAuction() && m.getCurrentMarkPrice().IsZero() { m.markPriceCalculator.OverridePrice(m.lastTradedPrice) + m.pMonitor.ResetPriceHistory(m.lastTradedPrice) } if m.perp { if m.internalCompositePriceCalculator != nil { @@ -1662,7 +1679,7 @@ func (m *Market) leaveAuction(ctx context.Context, now time.Time) { m.mkt.LinearSlippageFactor, m.risk.GetRiskFactors().Short, m.risk.GetRiskFactors().Long, - false) + false, false) if wasOpeningAuction && (m.getCurrentInternalCompositePrice().IsZero()) { m.internalCompositePriceCalculator.OverridePrice(m.lastTradedPrice) @@ -1676,7 +1693,6 @@ func (m *Market) leaveAuction(ctx context.Context, now time.Time) { m.checkForReferenceMoves(ctx, updatedOrders, true) m.checkBondBalance(ctx) - m.commandLiquidityAuction(ctx) if !m.as.InAuction() { // only send the auction-left event if we actually *left* the auction. @@ -2215,7 +2231,7 @@ func (m *Market) SubmitOrderWithIDGeneratorAndOrderID( order := orderSubmission.IntoOrder(party) if order.Price != nil { order.OriginalPrice = order.Price.Clone() - order.Price.Mul(order.Price, m.priceFactor) + order.Price, _ = num.UintFromDecimal(order.Price.ToDecimal().Mul(m.priceFactor)) } order.CreatedAt = m.timeService.GetTimeNow().UnixNano() order.ID = orderID @@ -2503,18 +2519,18 @@ func (m *Market) checkPriceAndGetTrades(ctx context.Context, order *types.Order) persistent = false } - if m.pMonitor.CheckPrice(ctx, m.as, trades, persistent, false) { - return nil, types.OrderErrorNonPersistentOrderOutOfPriceBounds - } - - if evt := m.as.AuctionExtended(ctx, m.timeService.GetTimeNow()); evt != nil { - m.broker.Send(evt) - } - - // start the monitoring auction if required? - if m.as.AuctionStart() { - m.enterAuction(ctx) - return nil, nil + for _, t := range trades { + if m.pMonitor.CheckPrice(ctx, m.as, t.Price, persistent, false) { + return nil, types.OrderErrorNonPersistentOrderOutOfPriceBounds + } + if evt := m.as.AuctionExtended(ctx, m.timeService.GetTimeNow()); evt != nil { + m.broker.Send(evt) + } + // start the monitoring auction if required? + if m.as.AuctionStart() { + m.enterAuction(ctx) + return nil, nil + } } return trades, nil @@ -2620,6 +2636,25 @@ func (m *Market) handleConfirmationPassiveOrders( } } +func decreasedPosition(p1, p2 events.MarketPosition) int64 { + // was long, still long (or 0) + if p1.Size() > 0 && p2.Size() >= 0 && p2.Size() < p1.Size() { + return p1.Size() - p2.Size() + } + // was short, still short (or 0) + if p1.Size() < 0 && p2.Size() <= 0 && p2.Size() > p1.Size() { + return p2.Size() - p1.Size() + } + // position changed side + if p1.Size()*p2.Size() < 0 { + if p1.Size() > 0 { + return p1.Size() + } + return -p1.Size() + } + return 0 +} + func (m *Market) handleConfirmation(ctx context.Context, conf *types.OrderConfirmation, tradeT *types.TradeType) []*types.Order { // When re-submitting liquidity order, it happen that the pricing is putting // the order at a price which makes it uncross straight away. @@ -2662,8 +2697,23 @@ func (m *Market) handleConfirmation(ctx context.Context, conf *types.OrderConfir } tradeEvts = append(tradeEvts, events.NewTradeEvent(ctx, *trade)) - for _, mp := range m.position.Update(ctx, trade, conf.PassiveOrdersAffected[idx], conf.Order) { + + preTradePositions := m.position.GetPositionsByParty(trade.Buyer, trade.Seller) + for i, mp := range m.position.Update(ctx, trade, conf.PassiveOrdersAffected[idx], conf.Order) { m.marketActivityTracker.RecordPosition(m.settlementAsset, mp.Party(), m.mkt.ID, mp.Size(), trade.Price, m.positionFactor, m.timeService.GetTimeNow()) + if closedPosition := decreasedPosition(preTradePositions[i], mp); closedPosition > 0 { + var reaslisedPosition num.Decimal + if preTradePositions[i].Size() > 0 { + // a party **reduces** their **LONG** position + // (trade price - average entry price) * position delta$$ + reaslisedPosition = trade.Price.ToDecimal().Sub(preTradePositions[i].AverageEntryPrice().ToDecimal()).Mul(num.DecimalFromInt64(closedPosition)).Div(m.positionFactor) + } else { + // a party **reduces** their **SHORT** position + // (average entry price - trade price) * position delta$$ + reaslisedPosition = preTradePositions[i].AverageEntryPrice().ToDecimal().Sub(trade.Price.ToDecimal()).Mul(num.DecimalFromInt64(closedPosition)).Div(m.positionFactor) + } + m.marketActivityTracker.RecordRealisedPosition(m.GetSettlementAsset(), mp.Party(), m.mkt.ID, reaslisedPosition) + } } // if the passive party is in isolated margin we need to update the margin on the position change if m.getMarginMode(conf.PassiveOrdersAffected[idx].Party) == types.MarginModeIsolatedMargin { @@ -2923,7 +2973,7 @@ 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) + okPos, closed = m.risk.ExpectMargins(distressedMarginEvts, m.lastTradedPrice.Clone(), increment, m.getAuctionPrice()) parties := make([]string, 0, len(okPos)) for _, v := range okPos { @@ -2973,6 +3023,17 @@ func (m *Market) finalizePartiesCloseOut( if m.getMarginMode(mp.Party()) == types.MarginModeCrossMargin || (mp.Buy() == 0 && mp.Sell() == 0) { toRemoveFromPosition = append(toRemoveFromPosition, mp) } + var reaslisedPosition num.Decimal + if mp.Size() > 0 { + // a party **closed out** on their **LONG** position + // (trade price - average entry price) * position delta$$ + reaslisedPosition = m.getCurrentMarkPrice().ToDecimal().Sub(mp.AverageEntryPrice().ToDecimal()).Mul(num.DecimalFromInt64(mp.Size())).Div(m.positionFactor) + } else { + // a party **closed out** their **SHORT** position + // (average entry price - trade price) * position delta$$ + reaslisedPosition = mp.AverageEntryPrice().ToDecimal().Sub(m.getCurrentMarkPrice().ToDecimal()).Mul(num.DecimalFromInt64(-mp.Size())).Div(m.positionFactor) + } + m.marketActivityTracker.RecordRealisedPosition(m.settlementAsset, mp.Party(), m.mkt.ID, reaslisedPosition) } m.position.RemoveDistressed(toRemoveFromPosition) // but we want to update the market activity tracker on their 0 position for all of the closed parties @@ -3210,7 +3271,7 @@ func (m *Market) collateralAndRisk(ctx context.Context, settle []events.Transfer } } - crossRiskUpdates := m.risk.UpdateMarginsOnSettlement(ctx, crossEvts, m.getCurrentMarkPrice(), increment) + crossRiskUpdates := m.risk.UpdateMarginsOnSettlement(ctx, crossEvts, m.getCurrentMarkPrice(), 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())) @@ -3282,17 +3343,23 @@ func (m *Market) CancelAllOrders(ctx context.Context, partyID string) ([]*types. }) cancellations := make([]*types.OrderCancellationConfirmation, 0, len(orders)) + orderIDs := make([]string, 0, len(orders)) // now iterate over all orders and cancel one by one. cancelledOrders := make([]*types.Order, 0, len(orders)) for _, order := range orders { - cancellation, err := m.cancelOrder(ctx, partyID, order.ID) + cancellation, err := m.cancelOrderInBatch(ctx, partyID, order.ID) if err != nil { return nil, err } + orderIDs = append(orderIDs, order.ID) cancellations = append(cancellations, cancellation) cancelledOrders = append(cancelledOrders, cancellation.Order) } + cancelEvt := events.NewCancelledOrdersEvent(ctx, m.GetID(), partyID, orderIDs...) + m.broker.Send(cancelEvt) + // we have just cancelled all orders, release excess margin + m.releaseMarginExcess(ctx, partyID) m.checkForReferenceMoves(ctx, cancelledOrders, false) @@ -3368,8 +3435,16 @@ func (m *Market) removeCancelledExpiringStopOrders( } } +func (m *Market) cancelOrderInBatch(ctx context.Context, partyID string, orderID string) (*types.OrderCancellationConfirmation, error) { + return m.cancelSingleOrder(ctx, partyID, orderID, true) +} + // CancelOrder cancels the given order. func (m *Market) cancelOrder(ctx context.Context, partyID, orderID string) (*types.OrderCancellationConfirmation, error) { + return m.cancelSingleOrder(ctx, partyID, orderID, false) +} + +func (m *Market) cancelSingleOrder(ctx context.Context, partyID, orderID string, isBatch bool) (*types.OrderCancellationConfirmation, error) { timer := metrics.NewTimeCounter(m.mkt.ID, "market", "CancelOrder") defer timer.EngineTimeCounterAdd() @@ -3393,7 +3468,9 @@ func (m *Market) cancelOrder(ctx context.Context, partyID, orderID string) (*typ return nil, types.ErrInvalidPartyID } - defer m.releaseMarginExcess(ctx, partyID) + if !isBatch { + defer m.releaseMarginExcess(ctx, partyID) + } if foundOnBook { cancellation, err := m.matching.CancelOrder(order) @@ -3422,7 +3499,9 @@ func (m *Market) cancelOrder(ctx context.Context, partyID, orderID string) (*typ // Publish the changed order details order.UpdatedAt = m.timeService.GetTimeNow().UnixNano() - m.broker.Send(events.NewOrderEvent(ctx, order)) + if !isBatch { + m.broker.Send(events.NewCancelledOrdersEvent(ctx, order.MarketID, order.Party, order.ID)) + } // if the order was found in the book and we're in isolated margin we need to update the // order margin @@ -4316,7 +4395,7 @@ func (m *Market) getStaticMidPrice(side types.Side) (*num.Uint, error) { mid := num.UintZero() one := num.NewUint(1) two := num.Sum(one, one) - one.Mul(one, m.priceFactor) + one, _ = num.UintFromDecimal(one.ToDecimal().Mul(m.priceFactor)) if side == types.SideBuy { mid = mid.Div(num.Sum(bid, ask, one), two) } else { @@ -4372,28 +4451,6 @@ func (m *Market) getSuppliedStake() *num.Uint { return m.liquidityEngine.CalculateSuppliedStake() } -// command liquidity auction checks if liquidity auction should be entered and if it can end. -func (m *Market) commandLiquidityAuction(ctx context.Context) { - // start the liquidity monitoring auction if required - if !m.as.InAuction() && m.as.AuctionStart() { - m.enterAuction(ctx) - } - // end the liquidity monitoring auction if possible - if m.as.InAuction() && m.as.CanLeave() && !m.as.IsOpeningAuction() { - trades, err := m.matching.GetIndicativeTrades() - if err != nil { - m.log.Panic("Can't get indicative trades") - } - m.pMonitor.CheckPrice(ctx, m.as, trades, true, false) - // TODO: Need to also get indicative trades and check how they'd impact target stake, - // see https://github.com/vegaprotocol/vega/issues/3047 - // If price monitoring doesn't trigger auction than leave it - if evt := m.as.AuctionExtended(ctx, m.timeService.GetTimeNow()); evt != nil { - m.broker.Send(evt) - } - } -} - func (m *Market) tradingTerminated(ctx context.Context, tt bool) { targetState := types.MarketStateSettled if m.mkt.State == types.MarketStatePending { @@ -4441,6 +4498,7 @@ func (m *Market) terminateMarket(ctx context.Context, finalState types.MarketSta m.mkt.LinearSlippageFactor, m.risk.GetRiskFactors().Short, m.risk.GetRiskFactors().Long, + false, false) if m.internalCompositePriceCalculator != nil { @@ -4455,6 +4513,7 @@ func (m *Market) terminateMarket(ctx context.Context, finalState types.MarketSta m.mkt.LinearSlippageFactor, m.risk.GetRiskFactors().Short, m.risk.GetRiskFactors().Long, + false, false) } @@ -4609,7 +4668,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) + riskUpdates := m.risk.UpdateMarginsOnSettlement(ctx, crossEvts, m.getCurrentMarkPrice(), 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())) @@ -4921,7 +4980,7 @@ func (m *Market) switchMarginMode(ctx context.Context, party string, marginMode // switching from isolated margin to cross margin // 1. Any funds in the order margin account will be moved to the margin account. // 2. At this point trading can continue with the account switched to the cross margining account type. If there are excess funds in the margin account they will be freed at the next margin release cycle. - risk := m.risk.SwitchFromIsolatedMargin(ctx, margins, marketObservable, increment) + risk := m.risk.SwitchFromIsolatedMargin(ctx, margins, marketObservable, increment, m.getAuctionPrice()) err = m.transferMargins(ctx, []events.Risk{risk}, nil) if err != nil { return err diff --git a/core/execution/future/market_snapshot.go b/core/execution/future/market_snapshot.go index f51b2766b0..7d5209c5f5 100644 --- a/core/execution/future/market_snapshot.go +++ b/core/execution/future/market_snapshot.go @@ -37,6 +37,7 @@ import ( "code.vegaprotocol.io/vega/core/risk" "code.vegaprotocol.io/vega/core/settlement" "code.vegaprotocol.io/vega/core/types" + vgcontext "code.vegaprotocol.io/vega/libs/context" "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/libs/ptr" "code.vegaprotocol.io/vega/logging" @@ -140,8 +141,8 @@ func NewMarketFromSnapshot( return nil, fmt.Errorf("unable to instantiate price monitoring engine: %w", err) } - exp := assetDecimals - mkt.DecimalPlaces - priceFactor := num.UintZero().Exp(num.NewUint(10), num.NewUint(exp)) + 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 @@ -154,9 +155,16 @@ func NewMarketFromSnapshot( pMonitor, book, as, asset, mkt.ID, stateVarEngine, positionFactor, mkt.LiquiditySLAParams) equityShares := common.NewEquitySharesFromSnapshot(em.EquityShare) - marketLiquidity := common.NewMarketLiquidity( + // if we're upgrading and the market liquidity state is nil, all we can do is take the old SLA values which will *probably* be the right ones + if vgcontext.InProgressUpgrade(ctx) && em.MarketLiquidity == nil { + em.MarketLiquidity = &snapshot.MarketLiquidity{ + PriceRange: mkt.LiquiditySLAParams.PriceRange.String(), + } + } + + marketLiquidity := common.NewMarketLiquidityFromSnapshot( log, liquidityEngine, collateralEngine, broker, book, equityShares, marketActivityTracker, - feeEngine, common.FutureMarketType, mkt.ID, asset, priceFactor, mkt.LiquiditySLAParams.PriceRange, + feeEngine, common.FutureMarketType, mkt.ID, asset, priceFactor, em.MarketLiquidity, ) // backward compatibility check for nil @@ -178,8 +186,11 @@ func NewMarketFromSnapshot( // this can be removed once this parameter is no longer optional if mkt.LiquidationStrategy == nil { mkt.LiquidationStrategy = liquidation.GetLegacyStrat() + } else if mkt.LiquidationStrategy.DisposalSlippage.IsZero() { + // @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, marketLiquidity, positionEngine, pMonitor) + 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 { @@ -339,6 +350,7 @@ func (m *Market) GetState() *types.ExecMarket { FeesStats: m.fee.GetState(assetQuantum), PartyMarginFactors: partyMarginFactors, MarkPriceCalculator: m.markPriceCalculator.IntoProto(), + MarketLiquidity: m.liquidity.GetState(), } if m.perp && m.internalCompositePriceCalculator != nil { em.InternalCompositePriceCalculator = m.internalCompositePriceCalculator.IntoProto() diff --git a/core/execution/future/market_test.go b/core/execution/future/market_test.go index fb2af900c6..cd6f9539a6 100644 --- a/core/execution/future/market_test.go +++ b/core/execution/future/market_test.go @@ -461,6 +461,7 @@ func mustOrderFromProto(o *vegapb.Order) *types.Order { func (tm *testMarket) lastOrderUpdate(id string) *types.Order { var order *types.Order + cancel := false for _, e := range tm.events { switch evt := e.(type) { case *events.Order: @@ -468,8 +469,13 @@ func (tm *testMarket) lastOrderUpdate(id string) *types.Order { if ord.Id == id { order = mustOrderFromProto(ord) } + case *events.CancelledOrders: + cancel = true } } + if cancel { + order.Status = types.OrderStatusCancelled + } return order } @@ -5191,7 +5197,17 @@ func TestMarket_LeaveAuctionAndRepricePeggedOrders(t *testing.T) { require.NotNil(t, o2conf) require.NoError(t, err) - require.Equal(t, int64(2), tm.market.GetOrdersOnBookCount()) + o3 := getMarketOrder(tm, now, types.OrderTypeLimit, types.OrderTimeInForceGTC, "Order03", types.SideSell, "party-A", 1, 1000) + o3conf, err := tm.market.SubmitOrder(ctx, o3) + require.NotNil(t, o3conf) + require.NoError(t, err) + + o4 := getMarketOrder(tm, now, types.OrderTypeLimit, types.OrderTimeInForceGTC, "Order04", types.SideBuy, "party-A", 1, 1000) + o4conf, err := tm.market.SubmitOrder(ctx, o4) + require.NotNil(t, o4conf) + require.NoError(t, err) + + require.Equal(t, int64(4), tm.market.GetOrdersOnBookCount()) lps := &types.LiquidityProvisionSubmission{ Fee: num.DecimalFromFloat(0.01), diff --git a/core/execution/future/order_test.go b/core/execution/future/order_test.go index 5eccec6819..3505870d68 100644 --- a/core/execution/future/order_test.go +++ b/core/execution/future/order_test.go @@ -338,9 +338,16 @@ func TestAmendMarginCheckFails(t *testing.T) { found := false for _, v := range tm.events { - if o, ok := v.(*events.Order); ok && o.Order().Id == orderID { - assert.Equal(t, o.Order().Status, types.OrderStatusCancelled) - found = true + if co, ok := v.(*events.CancelledOrders); ok { + for _, oid := range co.OrderIDs() { + if oid == orderID { + found = true + break + } + } + if found { + break + } } } assert.True(t, found) diff --git a/core/execution/future/special_orders.go b/core/execution/future/special_orders.go index e6393ac470..1878bfb5ee 100644 --- a/core/execution/future/special_orders.go +++ b/core/execution/future/special_orders.go @@ -84,8 +84,7 @@ func (m *Market) repricePeggedOrders( } else { // Repriced so all good make sure status is correct order.Price = price.Clone() - order.OriginalPrice = price.Clone() - order.OriginalPrice.Div(order.OriginalPrice, m.priceFactor) + order.OriginalPrice, _ = num.UintFromDecimal(price.ToDecimal().Div(m.priceFactor)) order.Status = types.OrderStatusActive order.UpdatedAt = m.timeService.GetTimeNow().UnixNano() toSubmit = append(toSubmit, order) diff --git a/core/execution/liquidation/engine.go b/core/execution/liquidation/engine.go index 8df84c4c36..71884c8c4e 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,MarketLiquidity,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 type PriceMonitor interface { GetValidPriceRange() (num.WrappedDecimal, num.WrappedDecimal) @@ -42,10 +42,6 @@ type Book interface { GetVolumeAtPrice(price *num.Uint, side types.Side) uint64 } -type MarketLiquidity interface { - ValidOrdersPriceRange() (*num.Uint, *num.Uint, error) -} - type IDGen interface { NextID() string } @@ -66,7 +62,6 @@ type Engine struct { as common.AuctionState nextStep time.Time tSvc common.TimeService - ml MarketLiquidity position Positions stopped bool pmon PriceMonitor @@ -79,6 +74,7 @@ var ( DisposalFraction: num.DecimalFromFloat(0.1), FullDisposalSize: 20, MaxFractionConsumed: num.DecimalFromFloat(0.05), + DisposalSlippage: num.DecimalFromFloat(0.1), } // this comes closest to the existing behaviour (trying to close the network position in full in one go). @@ -87,6 +83,7 @@ var ( DisposalFraction: num.DecimalOne(), FullDisposalSize: math.MaxUint64, MaxFractionConsumed: num.DecimalOne(), + DisposalSlippage: num.DecimalFromFloat(10.0), } ) @@ -103,7 +100,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, ml MarketLiquidity, 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) *Engine { // NOTE: This can be removed after protocol upgrade if cfg == nil { cfg = legacyStrat.DeepClone() @@ -116,7 +113,6 @@ func New(log *logging.Logger, cfg *types.LiquidationStrategy, mktID string, brok book: book, as: as, tSvc: tSvc, - ml: ml, position: pe, pos: &Pos{}, pmon: pmon, @@ -132,14 +128,21 @@ func (e *Engine) Update(cfg *types.LiquidationStrategy) { e.cfg = cfg } -func (e *Engine) OnTick(ctx context.Context, now time.Time) (*types.Order, error) { - if e.pos.open == 0 || e.as.InAuction() || e.nextStep.After(now) { +func (e *Engine) OnTick(ctx context.Context, now time.Time, midPrice *num.Uint) (*types.Order, error) { + if e.pos.open == 0 || e.as.InAuction() || e.nextStep.After(now) || midPrice.IsZero() { return nil, nil } - minP, maxP, err := e.ml.ValidOrdersPriceRange() - if err != nil { - return nil, err + + one := num.DecimalOne() + // get the min/max price from the range based on slippage parameter + mpDec := num.DecimalFromUint(midPrice) + minP := num.UintZero() + if e.cfg.DisposalSlippage.LessThan(one) { + minD := mpDec.Mul(one.Sub(e.cfg.DisposalSlippage)) + minP, _ = num.UintFromDecimal(minD) } + maxD := mpDec.Mul(one.Add(e.cfg.DisposalSlippage)) + maxP, _ := num.UintFromDecimal(maxD) minB, maxB := e.pmon.GetValidPriceRange() diff --git a/core/execution/liquidation/engine_test.go b/core/execution/liquidation/engine_test.go index 196906f48b..9fff759c66 100644 --- a/core/execution/liquidation/engine_test.go +++ b/core/execution/liquidation/engine_test.go @@ -17,7 +17,6 @@ package liquidation_test import ( "context" - "errors" "fmt" "testing" "time" @@ -41,7 +40,6 @@ type tstEngine struct { *liquidation.Engine ctrl *gomock.Controller book *mocks.MockBook - ml *mocks.MockMarketLiquidity idgen *mocks.MockIDGen as *cmocks.MockAuctionState broker *bmocks.MockBroker @@ -107,23 +105,22 @@ func TestNetworkReducesOverTime(t *testing.T) { require.Equal(t, len(closed), len(pos)) require.Equal(t, len(closed), len(parties)) require.Equal(t, closed[0].Party(), parties[0]) + midPrice := num.NewUint(100) t.Run("call to ontick within the time step does nothing", func(t *testing.T) { now = now.Add(2 * time.Second) eng.as.EXPECT().InAuction().Times(1).Return(false) - order, err := eng.OnTick(ctx, now) + order, err := eng.OnTick(ctx, now, midPrice) require.Nil(t, order) require.NoError(t, err) }) t.Run("after the time step passes, the first batch is disposed of", func(t *testing.T) { now = now.Add(3 * time.Second) - minP, maxP := num.UintZero(), num.UintOne() eng.as.EXPECT().InAuction().Times(1).Return(false) - eng.ml.EXPECT().ValidOrdersPriceRange().Times(1).Return(minP, maxP, nil) // return a large volume so the full step is disposed eng.book.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(1000)) - order, err := eng.OnTick(ctx, now) + order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.NotNil(t, order) require.Equal(t, uint64(5), order.Size) @@ -132,7 +129,7 @@ func TestNetworkReducesOverTime(t *testing.T) { t.Run("ensure the next time step is set", func(t *testing.T) { now = now.Add(2 * time.Second) eng.as.EXPECT().InAuction().Times(1).Return(false) - order, err := eng.OnTick(ctx, now) + order, err := eng.OnTick(ctx, now, midPrice) require.Nil(t, order) require.NoError(t, err) }) @@ -142,28 +139,16 @@ func TestNetworkReducesOverTime(t *testing.T) { // pass another step now = now.Add(3 * time.Second) eng.as.EXPECT().InAuction().Times(1).Return(true) - order, err := eng.OnTick(ctx, now) + order, err := eng.OnTick(ctx, now, midPrice) require.Nil(t, order) require.NoError(t, err) }) - t.Run("when not in auction, if there is no price range, there is no trade", func(t *testing.T) { - eng.as.EXPECT().InAuction().Times(1).Return(false) - mlErr := errors.New("some error") - eng.ml.EXPECT().ValidOrdersPriceRange().Times(1).Return(nil, nil, mlErr) - order, err := eng.OnTick(ctx, now) - require.Nil(t, order) - require.Error(t, err) - require.Equal(t, mlErr, err) - }) - t.Run("No longer in auction and we have a price range finally generates the order", func(t *testing.T) { - minP, maxP := num.UintZero(), num.UintOne() eng.as.EXPECT().InAuction().Times(1).Return(false) - eng.ml.EXPECT().ValidOrdersPriceRange().Times(1).Return(minP, maxP, nil) // return a large volume so the full step is disposed eng.book.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(1000)) - order, err := eng.OnTick(ctx, now) + order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.NotNil(t, order) require.Equal(t, uint64(5), order.Size) @@ -191,12 +176,10 @@ func TestNetworkReducesOverTime(t *testing.T) { totalSize++ // now increase time by 4 seconds should dispose 5.1 -> 5 now = now.Add(4 * time.Second) - minP, maxP := num.UintZero(), num.UintOne() eng.as.EXPECT().InAuction().Times(1).Return(false) - eng.ml.EXPECT().ValidOrdersPriceRange().Times(1).Return(minP, maxP, nil) // return a large volume so the full step is disposed eng.book.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(1000)) - order, err := eng.OnTick(ctx, now) + order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.NotNil(t, order) require.Equal(t, uint64(num.DecimalFromFloat(float64(totalSize)).Div(num.DecimalFromFloat(float64(10))).Ceil().IntPart()), order.Size) @@ -205,7 +188,7 @@ func TestNetworkReducesOverTime(t *testing.T) { t.Run("Updating the config changes the time left until the next step", func(t *testing.T) { now = now.Add(time.Second) eng.as.EXPECT().InAuction().Times(1).Return(false) - order, err := eng.OnTick(ctx, now) + order, err := eng.OnTick(ctx, now, midPrice) require.Nil(t, order) require.NoError(t, err) // 4s to go, but... @@ -213,12 +196,10 @@ func TestNetworkReducesOverTime(t *testing.T) { eng.Update(config.DeepClone()) now = now.Add(2 * time.Second) // only 3 seconds later and we dispose of the next batch - minP, maxP := num.UintZero(), num.UintOne() eng.as.EXPECT().InAuction().Times(1).Return(false) - eng.ml.EXPECT().ValidOrdersPriceRange().Times(1).Return(minP, maxP, nil) // return a large volume so the full step is disposed eng.book.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(1000)) - order, err = eng.OnTick(ctx, now) + order, err = eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.NotNil(t, order) require.Equal(t, uint64(num.DecimalFromFloat(float64(totalSize)).Div(num.DecimalFromFloat(float64(10))).Ceil().IntPart()), order.Size) @@ -237,12 +218,10 @@ func TestNetworkReducesOverTime(t *testing.T) { require.True(t, uint64(eng.GetNetworkPosition().Size()) <= config.FullDisposalSize) now = now.Add(3 * time.Second) // only 3 seconds later and we dispose of the next batch - minP, maxP := num.UintZero(), num.UintOne() eng.as.EXPECT().InAuction().Times(1).Return(false) - eng.ml.EXPECT().ValidOrdersPriceRange().Times(1).Return(minP, maxP, nil) // return a large volume so the full step is disposed eng.book.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(1000)) - order, err := eng.OnTick(ctx, now) + order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.NotNil(t, order) require.Equal(t, config.FullDisposalSize, order.Size) @@ -255,8 +234,10 @@ func testOrderbookHasNoVolume(t *testing.T) { eng := getTestEngine(t, mID, nil) defer eng.Finish() + minP, midPrice := num.NewUint(90), num.NewUint(100) + // make sure the lower bound does not override the price range eng.pmon.EXPECT().GetValidPriceRange().AnyTimes().Return( - num.NewWrappedDecimal(num.UintZero(), num.DecimalZero()), + num.NewWrappedDecimal(num.NewUint(90), num.DecimalFromFloat(90.0)), num.NewWrappedDecimal(num.MaxUint(), num.MaxDecimal()), ) @@ -280,11 +261,9 @@ func testOrderbookHasNoVolume(t *testing.T) { require.Equal(t, len(closed), len(parties)) require.Equal(t, closed[0].Party(), parties[0]) // now when we close out, the book returns a volume of 0 is available - minP, maxP := num.UintZero(), num.UintOne() eng.as.EXPECT().InAuction().Times(1).Return(false) - eng.ml.EXPECT().ValidOrdersPriceRange().Times(1).Return(minP, maxP, nil) eng.book.EXPECT().GetVolumeAtPrice(minP, types.SideBuy).Times(1).Return(uint64(0)) - order, err := eng.OnTick(ctx, now) + order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.Nil(t, order) } @@ -297,6 +276,7 @@ func testOrderbookFractionRounding(t *testing.T) { DisposalFraction: num.DecimalOne(), FullDisposalSize: 1000000, // plenty MaxFractionConsumed: num.DecimalFromFloat(0.5), + DisposalSlippage: num.DecimalFromFloat(10), } eng := getTestEngine(t, mID, &config) defer eng.Finish() @@ -330,11 +310,10 @@ func testOrderbookFractionRounding(t *testing.T) { require.Equal(t, closed[0].Party(), parties[0]) // now the available volume on the book is 1, with the fraction that gets rounded to 0.5 // which should be rounded UP to 1. - minP, maxP := num.UintZero(), num.UintOne() + minP, midPrice := num.UintZero(), num.NewUint(100) eng.as.EXPECT().InAuction().Times(1).Return(false) - eng.ml.EXPECT().ValidOrdersPriceRange().Times(1).Return(minP, maxP, nil) eng.book.EXPECT().GetVolumeAtPrice(minP, types.SideBuy).Times(1).Return(uint64(1)) - order, err := eng.OnTick(ctx, now) + order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.Equal(t, uint64(1), order.Size) } @@ -347,6 +326,7 @@ func testOrderbookExceedsVolume(t *testing.T) { DisposalFraction: num.DecimalOne(), FullDisposalSize: 1000000, // plenty MaxFractionConsumed: num.DecimalFromFloat(0.5), + DisposalSlippage: num.DecimalFromFloat(10), } eng := getTestEngine(t, mID, &config) defer eng.Finish() @@ -378,12 +358,11 @@ func testOrderbookExceedsVolume(t *testing.T) { require.Equal(t, len(closed), len(pos)) require.Equal(t, len(closed), len(parties)) require.Equal(t, closed[0].Party(), parties[0]) - minP, maxP := num.UintZero(), num.UintOne() + minP, midPrice := num.UintZero(), num.NewUint(100) eng.as.EXPECT().InAuction().Times(1).Return(false) - eng.ml.EXPECT().ValidOrdersPriceRange().Times(1).Return(minP, maxP, nil) // 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)) - order, err := eng.OnTick(ctx, now) + order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.Equal(t, uint64(netVol), order.Size) } @@ -396,12 +375,13 @@ func testOrderCappedByPriceMonitor(t *testing.T) { DisposalFraction: num.DecimalOne(), FullDisposalSize: 1000000, // plenty MaxFractionConsumed: num.DecimalFromFloat(0.5), + DisposalSlippage: num.DecimalFromFloat(10), } eng := getTestEngine(t, mID, &config) defer eng.Finish() // these are the bounds given by the order book - minP, maxP := num.NewUint(100), num.NewUint(200) + midPrice := num.NewUint(150) // these are the price monitoring bounds minB := num.NewUint(150) @@ -434,11 +414,10 @@ func testOrderCappedByPriceMonitor(t *testing.T) { require.Equal(t, closed[0].Party(), parties[0]) eng.as.EXPECT().InAuction().Times(1).Return(false) - eng.ml.EXPECT().ValidOrdersPriceRange().Times(1).Return(minP, maxP, nil) // we will check for volume at the price monitoring minimum eng.book.EXPECT().GetVolumeAtPrice(minB, types.SideBuy).Times(1).Return(uint64(netVol * 10)) - order, err := eng.OnTick(ctx, now) + order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.Equal(t, uint64(netVol), order.Size) } @@ -501,11 +480,10 @@ func TestLegacySupport(t *testing.T) { require.Equal(t, len(closed), len(parties)) require.Equal(t, closed[0].Party(), parties[0]) // now we should see an order for size 15 returned - minP, maxP := num.UintZero(), num.UintOne() + minP, midPrice := num.UintZero(), num.NewUint(100) eng.as.EXPECT().InAuction().Times(1).Return(false) - eng.ml.EXPECT().ValidOrdersPriceRange().Times(1).Return(minP, maxP, nil) eng.book.EXPECT().GetVolumeAtPrice(minP, types.SideBuy).Times(1).Return(uint64(netVol)) - order, err := eng.OnTick(ctx, now) + order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.Equal(t, uint64(netVol), order.Size) // now reduce the network size through distressed short position @@ -533,7 +511,7 @@ func TestLegacySupport(t *testing.T) { require.Equal(t, closed[0].Party(), parties[0]) require.Equal(t, netVol, eng.GetNetworkPosition().Size()) // now we should see no error, and no order returned - order, err = eng.OnTick(ctx, now) + order, err = eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.Nil(t, order) // now just make sure stopping for snapshots works as expected @@ -625,19 +603,17 @@ func getTestEngine(t *testing.T, marketID string, config *types.LiquidationStrat t.Helper() ctrl := gomock.NewController(t) book := mocks.NewMockBook(ctrl) - ml := mocks.NewMockMarketLiquidity(ctrl) idgen := mocks.NewMockIDGen(ctrl) as := cmocks.NewMockAuctionState(ctrl) broker := bmocks.NewMockBroker(ctrl) tSvc := cmocks.NewMockTimeService(ctrl) pe := mocks.NewMockPositions(ctrl) pmon := mocks.NewMockPriceMonitor(ctrl) - engine := liquidation.New(logging.NewDevLogger(), config, marketID, broker, book, as, tSvc, ml, pe, pmon) + engine := liquidation.New(logging.NewDevLogger(), config, marketID, broker, book, as, tSvc, pe, pmon) return &tstEngine{ Engine: engine, ctrl: ctrl, book: book, - ml: ml, idgen: idgen, as: as, broker: broker, diff --git a/core/execution/liquidation/mocks/mocks.go b/core/execution/liquidation/mocks/mocks.go index 24b220e4ea..3656484759 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,MarketLiquidity,IDGen,Positions,PriceMonitor) +// Source: code.vegaprotocol.io/vega/core/execution/liquidation (interfaces: Book,IDGen,Positions,PriceMonitor) // Package mocks is a generated GoMock package. package mocks @@ -53,45 +53,6 @@ func (mr *MockBookMockRecorder) GetVolumeAtPrice(arg0, arg1 interface{}) *gomock return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetVolumeAtPrice", reflect.TypeOf((*MockBook)(nil).GetVolumeAtPrice), arg0, arg1) } -// MockMarketLiquidity is a mock of MarketLiquidity interface. -type MockMarketLiquidity struct { - ctrl *gomock.Controller - recorder *MockMarketLiquidityMockRecorder -} - -// MockMarketLiquidityMockRecorder is the mock recorder for MockMarketLiquidity. -type MockMarketLiquidityMockRecorder struct { - mock *MockMarketLiquidity -} - -// NewMockMarketLiquidity creates a new mock instance. -func NewMockMarketLiquidity(ctrl *gomock.Controller) *MockMarketLiquidity { - mock := &MockMarketLiquidity{ctrl: ctrl} - mock.recorder = &MockMarketLiquidityMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockMarketLiquidity) EXPECT() *MockMarketLiquidityMockRecorder { - return m.recorder -} - -// ValidOrdersPriceRange mocks base method. -func (m *MockMarketLiquidity) ValidOrdersPriceRange() (*num.Uint, *num.Uint, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ValidOrdersPriceRange") - ret0, _ := ret[0].(*num.Uint) - ret1, _ := ret[1].(*num.Uint) - ret2, _ := ret[2].(error) - return ret0, ret1, ret2 -} - -// ValidOrdersPriceRange indicates an expected call of ValidOrdersPriceRange. -func (mr *MockMarketLiquidityMockRecorder) ValidOrdersPriceRange() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidOrdersPriceRange", reflect.TypeOf((*MockMarketLiquidity)(nil).ValidOrdersPriceRange)) -} - // MockIDGen is a mock of IDGen interface. type MockIDGen struct { ctrl *gomock.Controller diff --git a/core/execution/liquidation/snapshot.go b/core/execution/liquidation/snapshot.go index 2239188968..a8b1767cd6 100644 --- a/core/execution/liquidation/snapshot.go +++ b/core/execution/liquidation/snapshot.go @@ -57,9 +57,13 @@ func (e *Engine) LoadState(ctx context.Context, pl *types.Payload) ([]types.Stat if d.Config != nil { e.cfg = d.Config.DeepClone() } else { - // @NOTE this can be removed after protocol upgrade has completed + // this can probably be removed now e.cfg = GetLegacyStrat() } + // @NOTE this should have a protocol upgrade guard around it + if e.cfg.DisposalFraction.IsZero() { + e.cfg.DisposalFraction = defaultStrat.DisposalSlippage + } default: return nil, types.ErrUnknownSnapshotType } diff --git a/core/execution/spot/auction.go b/core/execution/spot/auction.go index 1ce54a6f73..c53fd105be 100644 --- a/core/execution/spot/auction.go +++ b/core/execution/spot/auction.go @@ -21,6 +21,7 @@ import ( "code.vegaprotocol.io/vega/core/execution/common" "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/logging" ) @@ -44,21 +45,17 @@ func (m *Market) checkAuction(ctx context.Context, now time.Time, idgen common.I m.triggerStopOrders(ctx, idgen) }() - var ( - trades []*types.Trade - err error - ) + indicativeUncrossingPrice := num.UintZero() checkExceeded := m.mkt.State == types.MarketStatePending // as soon as we have an indicative uncrossing price in opening auction it needs to be passed into the price monitoring engine so statevar calculation can start isOpening := m.as.IsOpeningAuction() if isOpening && !m.pMonitor.Initialised() { - if trades, err = m.matching.GetIndicativeTrades(); err != nil { - m.log.Panic("Can't get indicative trades") - } - if len(trades) > 0 { - // pass the first uncrossing trades to price engine so state variables depending on it can be initialised - m.pMonitor.CheckPrice(ctx, m.as, trades, true, true) + indicativeUncrossingPrice = m.matching.OrderBook.GetIndicativePrice() + + if !indicativeUncrossingPrice.IsZero() { + // pass the first uncrossing price to price monitoring engine so state variables depending on it can be initialised + m.pMonitor.ResetPriceHistory(indicativeUncrossingPrice) m.OnOpeningAuctionFirstUncrossingPrice() } if checkExceeded && m.as.ExceededMaxOpening(now) { @@ -73,41 +70,22 @@ func (m *Market) checkAuction(ctx context.Context, now time.Time, idgen common.I } return } - if len(trades) == 0 { - if trades, err = m.matching.GetIndicativeTrades(); err != nil { - m.log.Panic("Can't get indicative trades") - } + if indicativeUncrossingPrice.IsZero() { + indicativeUncrossingPrice = m.matching.OrderBook.GetIndicativePrice() } // opening auction if isOpening { - if len(trades) == 0 { + if indicativeUncrossingPrice.IsZero() { if checkExceeded && m.as.ExceededMaxOpening(now) { m.closeSpotMarket(ctx) } return } - // check that from liquidity point of view we can leave the opening auction - _, bestStaticBidVolume, _ := m.getBestStaticBidPriceAndVolume() - _, bestStaticAskVolume, _ := m.getBestStaticAskPriceAndVolume() - if m.getSuppliedStake().GTE(m.getTargetStake()) && bestStaticBidVolume > 0 && bestStaticAskVolume > 0 { - m.as.SetReadyToLeave() - } - - if !m.as.CanLeave() { - if e := m.as.AuctionExtended(ctx, now); e != nil { - m.broker.Send(e) - } - return - } - // opening auction requirements satisfied at this point, other requirements still need to be checked downstream though + // opening auction period has expired, and we have trades, we should be ready to leave + // other requirements still need to be checked downstream though m.as.SetReadyToLeave() - m.pMonitor.CheckPrice(ctx, m.as, trades, true, false) - if m.as.ExtensionTrigger() == types.AuctionTriggerPrice { - // this should never, ever happen - m.log.Panic("Leaving opening auction somehow triggered price monitoring to extend the auction") - } // if we don't have yet consensus for the floating point parameters, stay in the opening auction if !m.CanLeaveOpeningAuction() { @@ -135,7 +113,7 @@ func (m *Market) checkAuction(ctx context.Context, now time.Time, idgen common.I isPrice := m.as.IsPriceAuction() || m.as.IsPriceExtension() if isPrice || m.as.CanLeave() { - m.pMonitor.CheckPrice(ctx, m.as, trades, true, false) + m.pMonitor.CheckPrice(ctx, m.as, indicativeUncrossingPrice, true, true) } end := m.as.CanLeave() if evt := m.as.AuctionExtended(ctx, m.timeService.GetTimeNow()); evt != nil { diff --git a/core/execution/spot/holding_account_tracker.go b/core/execution/spot/holding_account_tracker.go index 0068944dac..e3a3dfe203 100644 --- a/core/execution/spot/holding_account_tracker.go +++ b/core/execution/spot/holding_account_tracker.go @@ -172,8 +172,10 @@ func (hat *HoldingAccountTracker) ReleaseQuantityHoldingAccountAuctionEnd(ctx co if !effectiveFee.IsZero() { lockedFee, ok := hat.orderIDToFee[orderID] - if !ok || (!lockedFee.IsZero() && lockedFee.LT(effectiveFee)) { - return nil, fmt.Errorf("insufficient locked fee to release for order %s", orderID) + if !ok { + effectiveFee = num.UintZero() + } else { + effectiveFee = num.Min(effectiveFee, lockedFee) } } lockedQuantity, ok := hat.orderIDToQuantity[orderID] diff --git a/core/execution/spot/market.go b/core/execution/spot/market.go index 069884b6d6..cf71a400d2 100644 --- a/core/execution/spot/market.go +++ b/core/execution/spot/market.go @@ -74,7 +74,7 @@ type Market struct { lastTradedPrice *num.Uint markPrice *num.Uint - priceFactor *num.Uint + priceFactor num.Decimal // own engines matching *matching.CachedOrderBook @@ -164,9 +164,9 @@ func NewMarket( } positionFactor := num.DecimalFromFloat(10).Pow(num.DecimalFromInt64(mkt.PositionDecimalPlaces)) - priceFactor := num.NewUint(1) - if exp := quoteAssetDetails.DecimalPlaces() - mkt.DecimalPlaces; exp != 0 { - priceFactor.Exp(num.NewUint(10), num.NewUint(exp)) + priceFactor := num.DecimalOne() + if exp := int(quoteAssetDetails.DecimalPlaces()) - int(mkt.DecimalPlaces); exp != 0 { + priceFactor = num.DecimalFromInt64(10).Pow(num.DecimalFromInt64(int64(exp))) } baseFactor := num.DecimalFromFloat(10).Pow(num.DecimalFromInt64(int64(baseAssetDetails.DecimalPlaces()) - mkt.PositionDecimalPlaces)) book := matching.NewCachedOrderBook(log, matchingConfig, mkt.ID, as.InAuction(), peggedOrderNotify) @@ -267,6 +267,15 @@ func (m *Market) IsOpeningAuction() bool { return m.as.IsOpeningAuction() } +func (m *Market) getParties() []string { + parties := make([]string, 0, len(m.parties)) + for k := range m.parties { + parties = append(parties, k) + } + sort.Strings(parties) + return parties +} + func (m *Market) GetPartiesStats() *types.MarketStats { return &types.MarketStats{} } @@ -351,7 +360,8 @@ func (m *Market) GetMarketState() types.MarketState { } func (m *Market) priceToMarketPrecision(price *num.Uint) *num.Uint { - return price.Div(price, m.priceFactor) + p, _ := num.UintFromDecimal(price.ToDecimal().Div(m.priceFactor)) + return p } func (m *Market) GetMarketData() types.MarketData { @@ -389,14 +399,14 @@ func (m *Market) GetMarketData() types.MarketData { targetStake := m.getTargetStake().String() bounds := m.pMonitor.GetCurrentBounds() for _, b := range bounds { - m.priceToMarketPrecision(b.MaxValidPrice) // effictively floors this - m.priceToMarketPrecision(b.MinValidPrice) + b.MaxValidPrice = m.priceToMarketPrecision(b.MaxValidPrice) // effictively floors this + b.MinValidPrice = m.priceToMarketPrecision(b.MinValidPrice) rp, _ := num.UintFromDecimal(b.ReferencePrice) - m.priceToMarketPrecision(rp) + rp = m.priceToMarketPrecision(rp) b.ReferencePrice = num.DecimalFromUint(rp) - if m.priceFactor.NEQ(common.One) { + if m.priceFactor.GreaterThan(num.DecimalOne()) { b.MinValidPrice.AddSum(common.One) // ceil } } @@ -643,22 +653,31 @@ func (m *Market) BeginBlock(_ context.Context) {} // BlockEnd notifies the market of the end of the block. func (m *Market) BlockEnd(ctx context.Context) { + t := m.timeService.GetTimeNow() + if m.mkt.State == types.MarketStateProposed || + m.mkt.State == types.MarketStateCancelled || + m.mkt.State == types.MarketStateRejected || + m.mkt.State == types.MarketStateSettled { + if (m.nextMTM.IsZero() || !m.nextMTM.After(t)) && !m.as.InAuction() { + m.nextMTM = t.Add(m.mtmDelta) + } + return + } // simplified version of updating mark price every MTM interval mp := m.getLastTradedPrice() if !m.hasTraded && m.markPrice != nil { // no trades happened, make sure we're just using the current mark price mp = m.markPrice.Clone() } - t := m.timeService.GetTimeNow() - if mp != nil && !mp.IsZero() && !m.as.InAuction() && (m.nextMTM.IsZero() || !m.nextMTM.After(t)) { - if !m.pMonitor.CheckPrice(ctx, m.as, []*types.Trade{{Price: mp, Size: 1}}, true, true) { + + 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.markPrice = mp + m.lastTradedPrice = mp.Clone() + m.hasTraded = false } - m.nextMTM = t.Add(m.mtmDelta) // add delta here - - // last traded price should not reflect the closeout trades - m.lastTradedPrice = mp.Clone() - m.hasTraded = false + m.nextMTM = t.Add(m.mtmDelta) } m.tsCalc.RecordTotalStake(m.liquidity.CalculateSuppliedStake().Uint64(), m.timeService.GetTimeNow()) m.liquidity.EndBlock(m.markPrice, m.midPrice(), m.positionFactor) @@ -699,7 +718,7 @@ func (m *Market) removeOrders(ctx context.Context) { // cleanMarketWithState clears the collateral state of the market and clears up state vars and sets the terminated state of the market // NB: should it actually go to settled?. func (m *Market) cleanMarketWithState(ctx context.Context, mktState types.MarketState) error { - clearMarketTransfers, err := m.collateral.ClearSpotMarket(ctx, m.GetID(), m.quoteAsset) + clearMarketTransfers, err := m.collateral.ClearSpotMarket(ctx, m.GetID(), m.quoteAsset, m.getParties()) if err != nil { m.log.Error("Clear market error", logging.MarketID(m.GetID()), @@ -800,7 +819,7 @@ func (m *Market) getNewPeggedPrice(order *types.Order) (*num.Uint, error) { return num.UintZero(), common.ErrUnableToReprice } - offset := num.UintZero().Mul(order.PeggedOrder.Offset, m.priceFactor) + offset, _ := num.UintFromDecimal(order.PeggedOrder.Offset.ToDecimal().Mul(m.priceFactor)) if order.Side == types.SideSell { price = price.AddSum(offset) // this can only happen when pegged to mid, in which case we want to round to the nearest *better* tick size @@ -831,8 +850,7 @@ func (m *Market) repricePeggedOrder(order *types.Order) error { if err != nil { return err } - original := price.Clone() - order.OriginalPrice = original.Div(original, m.priceFactor) // set original price in market precision + order.OriginalPrice, _ = num.UintFromDecimal(price.ToDecimal().Div(m.priceFactor)) // set original price in market precision order.Price = price return nil } @@ -1124,9 +1142,17 @@ func (m *Market) SubmitStopOrdersWithIDGeneratorAndOrderIDs( return nil, common.ErrTradingNotAllowed } + now := m.timeService.GetTimeNow() orderCnt := 0 - if fallsBelow != nil { + if fallsBelow.SizeOverrideSetting == types.StopOrderSizeOverrideSettingPosition { + rejectStopOrders(types.StopOrderRejectionSizeOverrideUnsupportedForSpot, fallsBelow, risesAbove) + return nil, common.ErrStopOrderSizeOverrideNotSupportedForSpots + } + if fallsBelow.Expiry.Expires() && fallsBelow.Expiry.ExpiresAt.Before(now) { + rejectStopOrders(types.StopOrderRejectionExpiryInThePast, fallsBelow, risesAbove) + return nil, common.ErrStopOrderExpiryInThePast + } if fallsBelow.OrderSubmission.Side == types.SideBuy && !m.collateral.HasGeneralAccount(party, m.quoteAsset) { rejectStopOrders(types.StopOrderRejectionNotClosingThePosition, fallsBelow, risesAbove) return nil, common.ErrStopOrderSideNotClosingThePosition @@ -1138,6 +1164,14 @@ func (m *Market) SubmitStopOrdersWithIDGeneratorAndOrderIDs( orderCnt++ } if risesAbove != nil { + if risesAbove.SizeOverrideSetting == types.StopOrderSizeOverrideSettingPosition { + rejectStopOrders(types.StopOrderRejectionSizeOverrideUnsupportedForSpot, fallsBelow, risesAbove) + return nil, common.ErrStopOrderSizeOverrideNotSupportedForSpots + } + if risesAbove.Expiry.Expires() && risesAbove.Expiry.ExpiresAt.Before(now) { + rejectStopOrders(types.StopOrderRejectionExpiryInThePast, fallsBelow, risesAbove) + return nil, common.ErrStopOrderExpiryInThePast + } if risesAbove.OrderSubmission.Side == types.SideBuy && !m.collateral.HasGeneralAccount(party, m.quoteAsset) { rejectStopOrders(types.StopOrderRejectionNotClosingThePosition, fallsBelow, risesAbove) return nil, common.ErrStopOrderSideNotClosingThePosition @@ -1149,6 +1183,13 @@ func (m *Market) SubmitStopOrdersWithIDGeneratorAndOrderIDs( orderCnt++ } + if risesAbove != nil && fallsBelow != nil { + if risesAbove.Expiry.Expires() && fallsBelow.Expiry.Expires() && risesAbove.Expiry.ExpiresAt.Compare(*fallsBelow.Expiry.ExpiresAt) == 0 { + rejectStopOrders(types.StopOrderRejectionOCONotAllowedSameExpiryTime, fallsBelow, risesAbove) + return nil, common.ErrStopOrderNotAllowedSameExpiry + } + } + // now check if that party hasn't exceeded the max amount per market if m.stopOrders.CountForParty(party)+uint64(orderCnt) > m.maxStopOrdersPerParties.Uint64() { rejectStopOrders(types.StopOrderRejectionMaxStopOrdersPerPartyReached, fallsBelow, risesAbove) @@ -1162,7 +1203,7 @@ func (m *Market) SubmitStopOrdersWithIDGeneratorAndOrderIDs( // or no order is triggered // let's just submit it straight away if m.as.InAuction() || !triggered { - m.poolStopOrders(ctx, fallsBelow, risesAbove) + m.poolStopOrders(fallsBelow, risesAbove) return nil, nil } @@ -1200,26 +1241,20 @@ func (m *Market) SubmitStopOrdersWithIDGeneratorAndOrderIDs( } func (m *Market) poolStopOrders( - ctx context.Context, fallsBelow, risesAbove *types.StopOrder, ) { - evts := []events.Event{} if fallsBelow != nil { m.stopOrders.Insert(fallsBelow) if fallsBelow.Expiry.Expires() { - m.expiringStopOrders.Insert(fallsBelow.ID, fallsBelow.CreatedAt.UnixNano()) + m.expiringStopOrders.Insert(fallsBelow.ID, fallsBelow.Expiry.ExpiresAt.UnixNano()) } - evts = append(evts, events.NewStopOrderEvent(ctx, fallsBelow)) } if risesAbove != nil { m.stopOrders.Insert(risesAbove) if risesAbove.Expiry.Expires() { - m.expiringStopOrders.Insert(risesAbove.ID, risesAbove.CreatedAt.UnixNano()) + m.expiringStopOrders.Insert(risesAbove.ID, risesAbove.Expiry.ExpiresAt.UnixNano()) } - evts = append(evts, events.NewStopOrderEvent(ctx, risesAbove)) } - - m.broker.SendBatch(evts) } func (m *Market) stopOrderWouldTriggerAtSubmission( @@ -1229,13 +1264,15 @@ func (m *Market) stopOrderWouldTriggerAtSubmission( return false } + lastTradedPrice := m.priceToMarketPrecision(m.getLastTradedPrice()) + switch stopOrder.Trigger.Direction { case types.StopOrderTriggerDirectionFallsBelow: - if m.lastTradedPrice.LTE(stopOrder.Trigger.Price()) { + if lastTradedPrice.LTE(stopOrder.Trigger.Price()) { return true } case types.StopOrderTriggerDirectionRisesAbove: - if m.lastTradedPrice.GTE(stopOrder.Trigger.Price()) { + if lastTradedPrice.GTE(stopOrder.Trigger.Price()) { return true } } @@ -1249,13 +1286,21 @@ func (m *Market) triggerStopOrders( if m.lastTradedPrice == nil { return nil } + lastTradedPrice := m.priceToMarketPrecision(m.getLastTradedPrice()) + triggered, cancelled := m.stopOrders.PriceUpdated(lastTradedPrice) - triggered, cancelled := m.stopOrders.PriceUpdated(m.lastTradedPrice) - - if len(triggered) <= 0 { + if len(triggered) <= 0 && len(cancelled) <= 0 { return nil } + now := m.timeService.GetTimeNow() + // remove from expiring orders + set updatedAt + for _, v := range append(triggered, cancelled...) { + v.UpdatedAt = now + if v.Expiry.Expires() { + m.expiringStopOrders.RemoveOrder(v.Expiry.ExpiresAt.UnixNano(), v.ID) + } + } evts := make([]events.Event, 0, len(cancelled)) for _, v := range cancelled { evts = append(evts, events.NewStopOrderEvent(ctx, v)) @@ -1263,6 +1308,10 @@ func (m *Market) triggerStopOrders( m.broker.SendBatch(evts) + if len(triggered) <= 0 { + return nil + } + confirmations := m.submitStopOrders(ctx, triggered, types.StopOrderStatusTriggered, idgen) return append(m.triggerStopOrders(ctx, idgen), confirmations...) @@ -1290,7 +1339,7 @@ func (m *Market) SubmitOrderWithIDGeneratorAndOrderID(ctx context.Context, order order := orderSubmission.IntoOrder(party) if order.Price != nil { order.OriginalPrice = order.Price.Clone() - order.Price.Mul(order.Price, m.priceFactor) + order.Price, _ = num.UintFromDecimal(order.Price.ToDecimal().Mul(m.priceFactor)) } order.CreatedAt = m.timeService.GetTimeNow().UnixNano() order.ID = orderID @@ -1308,10 +1357,8 @@ func (m *Market) SubmitOrderWithIDGeneratorAndOrderID(ctx context.Context, order } if !m.as.InAuction() { - m.checkForReferenceMoves( - ctx, false) + m.checkForReferenceMoves(ctx, false) } - return conf, nil } @@ -1356,6 +1403,35 @@ func (m *Market) submitOrder(ctx context.Context, order *types.Order) (*types.Or return orderConf, orderUpdates, err } +func (m *Market) canCoverTradesAndFees(party string, partySide types.Side, trades []*types.Trade) error { + // check that the party can afford the traded amount + fees + if partySide == types.SideBuy { + totalTraded := num.UintZero() + for _, t := range trades { + fees, err := m.calculateFeesForTrades([]*types.Trade{t}) + if err != nil { + m.log.Panic("failed to calculate fees for trade", logging.Trade(t)) + } + size := num.NewUint(t.Size) + totalTraded.AddSum(size.Mul(size, t.Price), fees.TotalFeesAmountPerParty()[party]) + } + totalTraded, _ = num.UintFromDecimal(totalTraded.ToDecimal().Div(m.positionFactor)) + if err := m.collateral.PartyHasSufficientBalance(m.quoteAsset, party, totalTraded); err != nil { + return err + } + } else { + sizeTraded := uint64(0) + for _, t := range trades { + sizeTraded += t.Size + } + totalTraded := scaleBaseQuantityToAssetDP(sizeTraded, m.baseFactor) + if err := m.collateral.PartyHasSufficientBalance(m.baseAsset, party, totalTraded); err != nil { + return err + } + } + return nil +} + // submitValidatedOrder submits a new order. func (m *Market) submitValidatedOrder(ctx context.Context, order *types.Order) (*types.OrderConfirmation, []*types.Order, error) { isPegged := order.PeggedOrder != nil @@ -1394,6 +1470,13 @@ func (m *Market) submitValidatedOrder(ctx context.Context, order *types.Order) ( // not be an issue } + // check that the party can afford the trade and fees + if trades != nil { + if err := m.canCoverTradesAndFees(order.Party, order.Side, trades); err != nil { + return nil, nil, m.unregisterAndReject(ctx, order, err) + } + } + // if an auction is ongoing and the order is pegged, park it and return if m.as.InAuction() && isPegged { if isPegged { @@ -1451,18 +1534,20 @@ func (m *Market) checkPriceAndGetTrades(ctx context.Context, order *types.Order) persistent = false } - if m.pMonitor.CheckPrice(ctx, m.as, trades, persistent, false) { - return nil, types.OrderErrorNonPersistentOrderOutOfPriceBounds - } + for _, trade := range trades { + if m.pMonitor.CheckPrice(ctx, m.as, trade.Price, persistent, false) { + return nil, types.OrderErrorNonPersistentOrderOutOfPriceBounds + } - if evt := m.as.AuctionExtended(ctx, m.timeService.GetTimeNow()); evt != nil { - m.broker.Send(evt) - } + if evt := m.as.AuctionExtended(ctx, m.timeService.GetTimeNow()); evt != nil { + m.broker.Send(evt) + } - // start the monitoring auction if required? - if m.as.AuctionStart() { - m.enterAuction(ctx) - return nil, nil + // start the monitoring auction if required? + if m.as.AuctionStart() { + m.enterAuction(ctx) + return nil, nil + } } return trades, nil @@ -1694,16 +1779,20 @@ func (m *Market) CancelAllOrders(ctx context.Context, partyID string) ([]*types. }) cancellations := make([]*types.OrderCancellationConfirmation, 0, len(orders)) + orderIDs := make([]string, 0, len(orders)) // now iterate over all orders and cancel one by one. for _, order := range orders { - cancellation, err := m.cancelOrder(ctx, partyID, order.ID) + cancellation, err := m.cancelOrderInBatch(ctx, partyID, order.ID) if err != nil { return nil, err } cancellations = append(cancellations, cancellation) + orderIDs = append(orderIDs, order.ID) } + m.broker.Send(events.NewCancelledOrdersEvent(ctx, m.GetID(), partyID, orderIDs...)) + m.checkForReferenceMoves(ctx, false) return cancellations, nil @@ -1718,7 +1807,7 @@ func (m *Market) CancelStopOrder( } stopOrders, err := m.stopOrders.Cancel(partyID, orderID) - if err != nil { + if err != nil || len(stopOrders) <= 0 { // could return just an empty slice return err } @@ -1771,8 +1860,17 @@ func (m *Market) CancelOrderWithIDGenerator(ctx context.Context, partyID, orderI return conf, nil } -// CancelOrder cancels the given order. If the order is found on the book, we release locked funds from holding account to the general account of the party. +func (m *Market) cancelOrderInBatch(ctx context.Context, partyID, orderID string) (*types.OrderCancellationConfirmation, error) { + return m.cancelSingleOrder(ctx, partyID, orderID, true) +} + +// cancelOrder cancels the given order. If the order is found on the book, we release locked funds from holding account to the general account of the party. func (m *Market) cancelOrder(ctx context.Context, partyID, orderID string) (*types.OrderCancellationConfirmation, error) { + return m.cancelSingleOrder(ctx, partyID, orderID, false) +} + +// cancelSingleOrder cancels the given order. If the order is found on the book, we release locked funds from holding account to the general account of the party. +func (m *Market) cancelSingleOrder(ctx context.Context, partyID, orderID string, inBatch bool) (*types.OrderCancellationConfirmation, error) { timer := metrics.NewTimeCounter(m.mkt.ID, "market", "CancelOrder") defer timer.EngineTimeCounterAdd() @@ -1823,7 +1921,9 @@ func (m *Market) cancelOrder(ctx context.Context, partyID, orderID string) (*typ // Publish the changed order details order.UpdatedAt = m.timeService.GetTimeNow().UnixNano() - m.broker.Send(events.NewOrderEvent(ctx, order)) + if !inBatch { + m.broker.Send(events.NewCancelledOrdersEvent(ctx, m.GetID(), partyID, orderID)) + } return &types.OrderCancellationConfirmation{Order: order}, nil } @@ -2125,6 +2225,12 @@ func (m *Market) amendOrder(ctx context.Context, orderAmendment *types.OrderAmen if ret.Order.Side == types.SideSell { asset = m.baseAsset } + + // verify that the party has sufficient funds in their general account to cover for this amount + if err := m.collateral.PartyHasSufficientBalance(asset, ret.Order.Party, num.Sum(amt, fees)); err != nil { + return nil, nil, err + } + transfer, err := m.orderHoldingTracker.TransferToHoldingAccount(ctx, ret.Order.ID, ret.Order.Party, asset, amt, fees) if err != nil { m.log.Panic("failed to transfer funds to holding account for order", logging.Order(ret.Order), logging.Error(err)) @@ -2215,7 +2321,7 @@ func (m *Market) validateOrderAmendment(order *types.Order, amendment *types.Ord } price := order.Price if amendment.Price != nil { - price = num.UintZero().Mul(amendment.Price, m.priceFactor) + price, _ = num.UintFromDecimal(amendment.Price.ToDecimal().Mul(m.priceFactor)) } if order.PeggedOrder != nil { p, err := m.getNewPeggedPrice(order) @@ -2258,6 +2364,7 @@ func (m *Market) StopSnapshots() { } func (m *Market) orderCancelReplace(ctx context.Context, existingOrder, newOrder *types.Order) (conf *types.OrderConfirmation, orders []*types.Order, err error) { + wasInAuction := m.as.InAuction() defer func() { if err != nil { return @@ -2265,7 +2372,8 @@ func (m *Market) orderCancelReplace(ctx context.Context, existingOrder, newOrder orders = m.handleConfirmation(ctx, conf) m.handleConfirmationPassiveOrders(ctx, conf) - if !conf.Order.IsFinished() && !m.as.InAuction() { + // if we were in auction before we handled the transfer already, if we're finished, there's nothing to do here. + if !conf.Order.IsFinished() && !wasInAuction { amt := m.calculateAmountBySide(newOrder.Side, newOrder.Price, newOrder.TrueRemaining()) asset := m.quoteAsset if newOrder.Side == types.SideSell { @@ -2332,6 +2440,13 @@ func (m *Market) orderCancelReplace(ctx context.Context, existingOrder, newOrder return nil, nil, errors.New("couldn't insert order in book") } + // check that the party can afford the trade - if not return error and ignore the update + if trades != nil { + if err := m.canCoverTradesAndFees(newOrder.Party, newOrder.Side, trades); err != nil { + return nil, nil, err + } + } + // "hot-swap" of the orders conf, err = m.matching.ReplaceOrder(existingOrder, newOrder) if err != nil { @@ -2417,10 +2532,57 @@ func (m *Market) removeExpiredStopOrders(ctx context.Context, timestamp int64, i toExpire := m.expiringStopOrders.Expire(timestamp) stopOrders := m.stopOrders.RemoveExpired(toExpire) + // ensure any OCO orders are also expire + toExpireSet := map[string]struct{}{} + for _, v := range toExpire { + toExpireSet[v] = struct{}{} + } + + for _, so := range stopOrders { + if _, ok := toExpireSet[so.ID]; !ok { + if so.Expiry.Expires() { + m.expiringStopOrders.RemoveOrder(so.Expiry.ExpiresAt.UnixNano(), so.ID) + } + } + } + + updatedAt := m.timeService.GetTimeNow() + + if m.as.InAuction() { + m.removeExpiredStopOrdersInAuction(ctx, updatedAt, stopOrders) + return nil + } + + return m.removeExpiredStopOrdersInContinuous(ctx, updatedAt, stopOrders, idgen) +} + +func (m *Market) removeExpiredStopOrdersInAuction( + ctx context.Context, + updatedAt time.Time, + stopOrders []*types.StopOrder, +) { + evts := []events.Event{} + for _, v := range stopOrders { + v.UpdatedAt = updatedAt + v.Status = types.StopOrderStatusExpired + // nothing to do, can send the event now + evts = append(evts, events.NewStopOrderEvent(ctx, v)) + } + + m.broker.SendBatch(evts) +} + +func (m *Market) removeExpiredStopOrdersInContinuous( + ctx context.Context, + updatedAt time.Time, + stopOrders []*types.StopOrder, + idgen common.IDGenerator, +) []*types.OrderConfirmation { evts := []events.Event{} filteredOCO := []*types.StopOrder{} for _, v := range stopOrders { - if v.Expiry.Expires() && *v.Expiry.ExpiryStrategy == types.StopOrderExpiryStrategySubmit && len(v.OCOLinkID) <= 0 { + v.UpdatedAt = updatedAt + if v.Status == types.StopOrderStatusExpired && v.Expiry.Expires() && *v.Expiry.ExpiryStrategy == types.StopOrderExpiryStrategySubmit { filteredOCO = append(filteredOCO, v) continue } @@ -2539,7 +2701,7 @@ func (m *Market) getStaticMidPrice(side types.Side) (*num.Uint, error) { mid := num.UintZero() one := num.NewUint(1) two := num.Sum(one, one) - one.Mul(one, m.priceFactor) + one, _ = num.UintFromDecimal(one.ToDecimal().Mul(m.priceFactor)) if side == types.SideBuy { mid = mid.Div(num.Sum(bid, ask, one), two) } else { @@ -2596,7 +2758,17 @@ func (m *Market) canTrade() bool { // at this point no fees would have been collected or anything like this. func (m *Market) cleanupOnReject(ctx context.Context) { m.stopAllLiquidityProvisionOnReject(ctx) - tresps, err := m.collateral.ClearSpotMarket(ctx, m.GetID(), m.quoteAsset) + + stopOrders := m.stopOrders.Settled() + evts := make([]events.Event, 0, len(stopOrders)) + for _, o := range stopOrders { + evts = append(evts, events.NewStopOrderEvent(ctx, o)) + } + if len(evts) > 0 { + m.broker.SendBatch(evts) + } + + tresps, err := m.collateral.ClearSpotMarket(ctx, m.GetID(), m.quoteAsset, m.getParties()) if err != nil { m.log.Panic("unable to cleanup a rejected market", logging.String("market-id", m.GetID()), @@ -2779,7 +2951,8 @@ func (m *Market) processFeesReleaseOnLeaveAuction(ctx context.Context) { if o.Side == types.SideBuy && o.PeggedOrder == nil { transfer, err := m.orderHoldingTracker.ReleaseFeeFromHoldingAccount(ctx, o.ID, party, m.quoteAsset) if err != nil { - m.log.Panic("failed to release fee from holding account at the end of an auction", logging.Order(o), logging.Error(err)) + // it's valid, if fees for the order were zero, we don't update the holding account + // cache so it can be legitimately not there. continue } transfers = append(transfers, transfer) @@ -2810,13 +2983,9 @@ func (m *Market) handleTrade(ctx context.Context, trade *types.Trade) []*types.L // release buyer's trade + fees quote quantity from the holding account var transfer *types.LedgerMovement var err error - if m.as.IsMonitorAuction() || m.as.IsOpeningAuction() { - // in auction the buyer and seller split the fees, but that just means that total they need to have in the holding account - // is still quantity + fees/2 because the other half of the fees (the seller half) is paid out of what is supposed to go to the seller - transfer, err = m.orderHoldingTracker.ReleaseQuantityHoldingAccountAuctionEnd(ctx, trade.BuyOrder, trade.Buyer, m.quoteAsset, scaleQuoteQuantityToAssetDP(trade.Size, trade.Price, m.positionFactor), fee) - } else { - transfer, err = m.orderHoldingTracker.ReleaseQuantityHoldingAccount(ctx, trade.BuyOrder, trade.Buyer, m.quoteAsset, scaleQuoteQuantityToAssetDP(trade.Size, trade.Price, m.positionFactor), fee) - } + // in auction the buyer and seller split the fees, but that just means that total they need to have in the holding account + // is still quantity + fees/2 because the other half of the fees (the seller half) is paid out of what is supposed to go to the seller + transfer, err = m.orderHoldingTracker.ReleaseQuantityHoldingAccountAuctionEnd(ctx, trade.BuyOrder, trade.Buyer, m.quoteAsset, scaleQuoteQuantityToAssetDP(trade.Size, trade.Price, m.positionFactor), fee) if err != nil { m.log.Panic("failed to release funds from holding account for trade", logging.Trade(trade), logging.Error(err)) @@ -2879,6 +3048,12 @@ func (m *Market) transferToHoldingAccount(ctx context.Context, order *types.Orde if order.Side == types.SideSell { asset = m.baseAsset } + + // verify that the party has sufficient funds in their general account to cover for this amount + if err := m.collateral.PartyHasSufficientBalance(asset, order.Party, num.Sum(amt, fees)); err != nil { + return err + } + transfer, err := m.orderHoldingTracker.TransferToHoldingAccount(ctx, order.ID, order.Party, asset, amt, fees) if err != nil { m.log.Panic("failed to transfer funds to holding account for order", logging.Order(order), logging.Error(err)) diff --git a/core/execution/spot/market_snapshot.go b/core/execution/spot/market_snapshot.go index 920b9e4f2f..f067c5483f 100644 --- a/core/execution/spot/market_snapshot.go +++ b/core/execution/spot/market_snapshot.go @@ -35,8 +35,10 @@ import ( "code.vegaprotocol.io/vega/core/risk" "code.vegaprotocol.io/vega/core/settlement" "code.vegaprotocol.io/vega/core/types" + vgcontext "code.vegaprotocol.io/vega/libs/context" "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" ) @@ -69,10 +71,9 @@ func NewMarketFromSnapshot( return nil, common.ErrEmptyMarketID } positionFactor := num.DecimalFromFloat(10).Pow(num.DecimalFromInt64(mkt.PositionDecimalPlaces)) - - priceFactor := num.NewUint(1) - if exp := quoteAssetDetails.DecimalPlaces() - mkt.DecimalPlaces; exp != 0 { - priceFactor.Exp(num.NewUint(10), num.NewUint(exp)) + priceFactor := num.DecimalOne() + if exp := int(quoteAssetDetails.DecimalPlaces()) - int(mkt.DecimalPlaces); exp != 0 { + priceFactor = num.DecimalFromInt64(10).Pow(num.DecimalFromInt64(int64(exp))) } baseFactor := num.DecimalFromFloat(10).Pow(num.DecimalFromInt64(int64(baseAssetDetails.DecimalPlaces()) - mkt.PositionDecimalPlaces)) as := monitor.NewAuctionStateFromSnapshot(mkt, em.AuctionState) @@ -117,7 +118,15 @@ func NewMarketFromSnapshot( } els := common.NewEquitySharesFromSnapshot(em.EquityShare) liquidity := liquidity.NewSnapshotEngine(liquidityConfig, log, timeService, broker, riskModel, pMonitor, book, as, quoteAsset, mkt.ID, stateVarEngine, positionFactor, mkt.LiquiditySLAParams) - marketLiquidity := common.NewMarketLiquidity(log, liquidity, collateralEngine, broker, book, els, marketActivityTracker, feeEngine, common.SpotMarketType, mkt.ID, quoteAsset, priceFactor, mkt.LiquiditySLAParams.PriceRange) + + // if we're upgrading and the market liquidity state is nil, all we can do is take the old SLA values which will *probably* be the right ones + if vgcontext.InProgressUpgrade(ctx) && em.MarketLiquidity == nil { + em.MarketLiquidity = &snapshot.MarketLiquidity{ + PriceRange: mkt.LiquiditySLAParams.PriceRange.String(), + } + } + + marketLiquidity := common.NewMarketLiquidityFromSnapshot(log, liquidity, collateralEngine, broker, book, els, marketActivityTracker, feeEngine, common.SpotMarketType, mkt.ID, quoteAsset, priceFactor, em.MarketLiquidity) // backward compatibility check for nil stopOrders := stoporders.New(log) @@ -216,6 +225,9 @@ func (m *Market) GetState() *types.ExecSpotMarket { Closed: m.closed, HasTraded: m.hasTraded, FeesStats: m.fee.GetState(quoteAssetQuantum), + MarketLiquidity: m.liquidity.GetState(), + StopOrders: m.stopOrders.ToProto(), + ExpiringStopOrders: m.expiringStopOrders.GetState(), } return em diff --git a/core/execution/spot/special_orders.go b/core/execution/spot/special_orders.go index a0e670c3bd..66f43e2b44 100644 --- a/core/execution/spot/special_orders.go +++ b/core/execution/spot/special_orders.go @@ -78,8 +78,7 @@ func (m *Market) repricePeggedOrders(ctx context.Context, changes uint8) (parked } else { // Repriced so all good make sure status is correct order.Price = price.Clone() - order.OriginalPrice = price.Clone() - order.OriginalPrice.Div(order.OriginalPrice, m.priceFactor) + order.OriginalPrice, _ = num.UintFromDecimal(price.ToDecimal().Div(m.priceFactor)) order.Status = types.OrderStatusActive order.UpdatedAt = m.timeService.GetTimeNow().UnixNano() toSubmit = append(toSubmit, order) diff --git a/core/governance/engine.go b/core/governance/engine.go index 4e5cddc26c..b76a649ff7 100644 --- a/core/governance/engine.go +++ b/core/governance/engine.go @@ -88,7 +88,7 @@ type Assets interface { SetRejected(ctx context.Context, assetID string) error SetPendingListing(ctx context.Context, assetID string) error ValidateAsset(assetID string) error - ExistsForEthereumAddress(address string) bool + ValidateEthereumAddress(address, chainID string) error } type Banking interface { @@ -406,6 +406,44 @@ func (e *Engine) OnTick(ctx context.Context, t time.Time) ([]*ToEnact, []*VoteCl } } + // then do the same thing for batches + acceptedBatches, rejectedBatches := e.nodeProposalValidation.OnTickBatch(t) + for _, p := range acceptedBatches { + e.log.Info("proposal has been validated by nodes, starting now", + logging.String("proposal-id", p.ID)) + p.Open() + + e.broker.Send(events.NewProposalEventFromProto(ctx, p.ToProto())) + proposalsEvents := []events.Event{} + for _, v := range p.Proposals { + proposalsEvents = append(proposalsEvents, events.NewProposalEvent(ctx, *v)) + } + e.broker.SendBatch(proposalsEvents) + + e.startValidatedBatchProposal(p) // can't fail, and proposal has been validated at an ulterior time + } + + for _, p := range rejectedBatches { + e.log.Info("proposal has not been validated by nodes", + logging.String("proposal-id", p.ID)) + p.Reject(types.ProposalErrorNodeValidationFailed) + e.broker.Send(events.NewProposalEventFromProto(ctx, p.ToProto())) + proposalsEvents := []events.Event{} + for _, v := range p.Proposals { + proposalsEvents = append(proposalsEvents, events.NewProposalEvent(ctx, *v)) + } + e.broker.SendBatch(proposalsEvents) + + for _, v := range p.Proposals { + // if it's an asset proposal we need to update it's + // state in the asset engine + switch v.Terms.Change.GetTermType() { + case types.ProposalTermsTypeNewAsset: + e.assets.SetRejected(ctx, v.ID) + } + } + } + toBeEnacted := []*ToEnact{} for i, ep := range preparedToEnact { // this is the new market proposal, and should already be in the slice @@ -645,10 +683,18 @@ func (e *Engine) startValidatedProposal(p *proposal) { e.activeProposals = append(e.activeProposals, p) } +func (e *Engine) startValidatedBatchProposal(p *batchProposal) { + e.activeBatchProposals[p.ID] = p +} + func (e *Engine) startTwoStepsProposal(ctx context.Context, p *types.Proposal) error { return e.nodeProposalValidation.Start(ctx, p) } +func (e *Engine) startTwoStepsBatchProposal(ctx context.Context, p *types.BatchProposal) error { + return e.nodeProposalValidation.StartBatch(ctx, p) +} + func (e *Engine) isTwoStepsProposal(p *types.Proposal) bool { return e.nodeProposalValidation.IsNodeValidationRequired(p) } @@ -1115,14 +1161,21 @@ func (e *Engine) validateNewAssetProposal(newAsset *types.NewAsset) (types.Propo continue } if source := p.Changes.GetERC20(); source != nil { + if source.ChainID != erc20.ChainID { + continue + } + if strings.EqualFold(source.ContractAddress, erc20.ContractAddress) { return types.ProposalErrorERC20AddressAlreadyInUse, ErrErc20AddressAlreadyInUse } } } - if e.assets.ExistsForEthereumAddress(erc20.ContractAddress) { - return types.ProposalErrorERC20AddressAlreadyInUse, ErrErc20AddressAlreadyInUse + if err := e.assets.ValidateEthereumAddress(erc20.ContractAddress, erc20.ChainID); err != nil { + if err == assets.ErrErc20AddressAlreadyInUse { + return types.ProposalErrorERC20AddressAlreadyInUse, err + } + return types.ProposalErrorInvalidAssetDetails, err } return types.ProposalErrorUnspecified, nil @@ -1188,8 +1241,8 @@ func (e *Engine) updatedSpotMarketFromProposal(p *proposal) (*types.Market, type newMarket := &types.NewSpotMarket{ Changes: &types.NewSpotMarketConfiguration{ Instrument: &types.InstrumentConfiguration{ - Name: existingMarket.TradableInstrument.Instrument.Name, - Code: existingMarket.TradableInstrument.Instrument.Code, + Name: terms.Changes.Instrument.Name, + Code: terms.Changes.Instrument.Code, Product: &types.InstrumentConfigurationSpot{ Spot: &types.SpotProduct{ Name: existingMarket.TradableInstrument.Instrument.GetSpot().Name, @@ -1198,13 +1251,14 @@ func (e *Engine) updatedSpotMarketFromProposal(p *proposal) (*types.Market, type }, }, }, - DecimalPlaces: existingMarket.DecimalPlaces, - PositionDecimalPlaces: existingMarket.PositionDecimalPlaces, + PriceDecimalPlaces: existingMarket.DecimalPlaces, + SizeDecimalPlaces: existingMarket.PositionDecimalPlaces, Metadata: terms.Changes.Metadata, PriceMonitoringParameters: terms.Changes.PriceMonitoringParameters, TargetStakeParameters: terms.Changes.TargetStakeParameters, SLAParams: terms.Changes.SLAParams, TickSize: terms.Changes.TickSize, + LiquidityFeeSettings: terms.Changes.LiquidityFeeSettings, }, } @@ -1351,6 +1405,7 @@ func (e *Engine) updatedAssetFromProposal(p *proposal) (*types.Asset, types.Prop ContractAddress: erc20.Address(), LifetimeLimit: src.ERC20Update.LifetimeLimit.Clone(), WithdrawThreshold: src.ERC20Update.WithdrawThreshold.Clone(), + ChainID: erc20.ChainID(), }, } default: diff --git a/core/governance/engine_batch.go b/core/governance/engine_batch.go index 8f4de2ff59..34ab96a4f9 100644 --- a/core/governance/engine_batch.go +++ b/core/governance/engine_batch.go @@ -72,9 +72,10 @@ func (e *Engine) SubmitBatchProposal( Reference: bp.Reference, Rationale: bp.Rationale, Terms: &types.ProposalTerms{ - ClosingTimestamp: bp.ClosingTimestamp, - EnactmentTimestamp: change.EnactmentTime, - Change: change.Change, + ClosingTimestamp: bp.ClosingTimestamp, + EnactmentTimestamp: change.EnactmentTime, + ValidationTimestamp: change.ValidationTime, + Change: change.Change, }, } @@ -121,11 +122,38 @@ func (e *Engine) SubmitBatchProposal( return nil, errs } - e.startBatchProposal(bp) + if e.isTwoStepsBatchProposal(bp) { + // set all proposals as WaitForNodeVote then + bp.WaitForNodeVote() + // reset events here as we will need to send another updated one instead + proposalsEvents = []events.Event{} + for _, p := range bp.Proposals { + proposalsEvents = append(proposalsEvents, events.NewProposalEvent(ctx, *p)) + } + + if err := e.startTwoStepsBatchProposal(ctx, bp); err != nil { + bp.RejectWithErr(types.ProposalErrorNodeValidationFailed, err) + proposalsEvents = []events.Event{} + for _, p := range bp.Proposals { + proposalsEvents = append(proposalsEvents, events.NewProposalEvent(ctx, *p)) + } + if e.log.IsDebug() { + e.log.Debug("Proposal rejected", + logging.String("batch-proposal-id", bp.ID)) + } + return nil, err + } + } else { + e.startBatchProposal(bp) + } return toSubmits, nil } +func (e *Engine) isTwoStepsBatchProposal(p *types.BatchProposal) bool { + return e.nodeProposalValidation.IsNodeValidationRequiredBatch(p) +} + func (e *Engine) RejectBatchProposal( ctx context.Context, proposalID string, r types.ProposalError, errorDetails error, ) error { @@ -262,7 +290,16 @@ func (e *Engine) evaluateBatchProposals( func (e *Engine) getBatchProposal(id string) (*batchProposal, bool) { bp, ok := e.activeBatchProposals[id] - return bp, ok + if ok { + return bp, ok + } + + nbp, ok := e.nodeProposalValidation.getBatchProposal(id) + if !ok { + return nil, false + } + + return nbp.batchProposal, ok } func (e *Engine) validateProposalFromBatch( diff --git a/core/governance/engine_new_asset_test.go b/core/governance/engine_new_asset_test.go index 3d850ec4d3..6f38a4a270 100644 --- a/core/governance/engine_new_asset_test.go +++ b/core/governance/engine_new_asset_test.go @@ -40,6 +40,7 @@ func TestProposalForNewAsset(t *testing.T) { t.Run("Submitting a proposal for new asset with closing time before validation time fails", testSubmittingProposalForNewAssetWithClosingTimeBeforeValidationTimeFails) t.Run("Voting during validation of proposal for new asset succeeds", testVotingDuringValidationOfProposalForNewAssetSucceeds) t.Run("Rejects erc20 proposals for address already used", testRejectsERC20ProposalForAddressAlreadyUsed) + t.Run("Rejects erc20 proposals for unknown chain id", testRejectsERC20ProposalForUnknownChainID) } func testRejectsERC20ProposalForAddressAlreadyUsed(t *testing.T) { @@ -55,12 +56,13 @@ func testRejectsERC20ProposalForAddressAlreadyUsed(t *testing.T) { ContractAddress: "0x690B9A9E9aa1C9dB991C7721a92d351Db4FaC990", LifetimeLimit: num.NewUint(1), WithdrawThreshold: num.NewUint(1), + ChainID: "1", }, } proposal.Terms.Change = newAssetERC20 // setup - eng.assets.EXPECT().ExistsForEthereumAddress("0x690B9A9E9aa1C9dB991C7721a92d351Db4FaC990").Times(1).Return(true) + eng.assets.EXPECT().ValidateEthereumAddress("0x690B9A9E9aa1C9dB991C7721a92d351Db4FaC990", "1").Times(1).Return(assets.ErrErc20AddressAlreadyInUse) // setup eng.expectRejectedProposalEvent(t, party.Id, proposal.ID, types.ProposalErrorERC20AddressAlreadyInUse) @@ -68,7 +70,7 @@ func testRejectsERC20ProposalForAddressAlreadyUsed(t *testing.T) { // when toSubmit, err := eng.submitProposal(t, proposal) - require.EqualError(t, err, governance.ErrErc20AddressAlreadyInUse.Error()) + require.EqualError(t, err, assets.ErrErc20AddressAlreadyInUse.Error()) require.Nil(t, toSubmit) } @@ -220,6 +222,112 @@ func testVotingDuringValidationOfProposalForNewAssetSucceeds(t *testing.T) { assert.EqualError(t, err, governance.ErrProposalDoesNotExist.Error()) } +func TestVotingDuringValidationOfProposalForNewAssetInBatchSucceeds(t *testing.T) { + eng := getTestEngine(t, time.Now()) + + now := eng.tsvc.GetTimeNow().Add(2 * time.Hour) + + // when + proposer := vgrand.RandomStr(5) + batchID := eng.newProposalID() + + newAssetProposal := eng.newProposalForNewAsset(proposer, now) + + // setup + var bAsset *assets.Asset + var fcheck func(interface{}, bool) + var rescheck validators.Resource + eng.assets.EXPECT().NewAsset(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).DoAndReturn(func(_ context.Context, ref string, assetDetails *types.AssetDetails) (string, error) { + bAsset = assets.NewAsset(builtin.New(ref, assetDetails)) + return ref, nil + }) + eng.assets.EXPECT().Get(gomock.Any()).Times(1).DoAndReturn(func(id string) (*assets.Asset, error) { + return bAsset, nil + }) + eng.witness.EXPECT().StartCheck(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Do(func(r validators.Resource, f func(interface{}, bool), _ time.Time) error { + fcheck = f + rescheck = r + return nil + }) + eng.ensureStakingAssetTotalSupply(t, 9) + eng.ensureAllAssetEnabled(t) + eng.ensureTokenBalanceForParty(t, proposer, 1) + + // expect + eng.expectProposalWaitingForNodeVoteEvent(t, proposer, batchID) + + // eng.expectOpenProposalEvent(t, proposer, batchID) + eng.expectProposalEvents(t, []expectedProposal{ + { + partyID: proposer, + proposalID: newAssetProposal.ID, + state: types.ProposalStateWaitingForNodeVote, + reason: types.ProposalErrorUnspecified, + }, + }) + + batchClosingTime := now.Add(48 * time.Hour) + + // when + _, err := eng.submitBatchProposal(t, eng.newBatchSubmission( + batchClosingTime.Unix(), + newAssetProposal, + ), batchID, proposer) + + assert.NoError(t, err) + + // given + voter1 := vgrand.RandomStr(5) + + // setup + eng.ensureTokenBalanceForParty(t, voter1, 7) + + // expect + eng.expectVoteEvent(t, voter1, batchID) + + // then + err = eng.addYesVote(t, voter1, batchID) + require.NoError(t, err) + + _ = fcheck + _ = rescheck + // call success on the validation + fcheck(rescheck, true) + + // then + afterValidation := time.Unix(newAssetProposal.Terms.ValidationTimestamp, 0).Add(time.Second) + + // setup + eng.ensureTokenBalanceForParty(t, voter1, 7) + + // expect + eng.expectOpenProposalEvent(t, proposer, batchID) + // and the inner proposals + eng.broker.EXPECT().SendBatch(gomock.Any()).Times(1) + // eng.expectGetMarketState(t, ID) + + // when + eng.OnTick(context.Background(), afterValidation) + + // given + afterClosing := time.Unix(newAssetProposal.Terms.ClosingTimestamp, 0).Add(time.Second) + + // // expect + eng.expectPassedProposalEvent(t, batchID) + // and the inner proposals + eng.broker.EXPECT().SendBatch(gomock.Any()).Times(1) + + // // when + eng.OnTick(context.Background(), afterClosing) + + eng.assets.EXPECT().SetPendingListing(gomock.Any(), newAssetProposal.ID).Times(1) + eng.OnTick(context.Background(), afterClosing.Add(1*time.Minute)) + + // when + toBeEnacted, _ := eng.OnTick(context.Background(), afterClosing.Add(48*time.Hour)) + require.Len(t, toBeEnacted, 1) +} + func TestNoVotesAnd0RequiredFails(t *testing.T) { eng := getTestEngine(t, time.Now()) @@ -300,3 +408,34 @@ func TestNoVotesAnd0RequiredFails(t *testing.T) { // then require.Len(t, toBeEnacted, 0) } + +func testRejectsERC20ProposalForUnknownChainID(t *testing.T) { + eng := getTestEngine(t, time.Now()) + + // given + party := eng.newValidParty("a-valid-party", 123456789) + proposal := eng.newProposalForNewAsset(party.Id, eng.tsvc.GetTimeNow().Add(48*time.Hour)) + + newAssetERC20 := newAssetTerms() + newAssetERC20.NewAsset.Changes.Source = &types.AssetDetailsErc20{ + ERC20: &types.ERC20{ + ContractAddress: "0x690B9A9E9aa1C9dB991C7721a92d351Db4FaC990", + LifetimeLimit: num.NewUint(1), + WithdrawThreshold: num.NewUint(1), + ChainID: "666", + }, + } + proposal.Terms.Change = newAssetERC20 + + // setup + eng.assets.EXPECT().ValidateEthereumAddress("0x690B9A9E9aa1C9dB991C7721a92d351Db4FaC990", "666").Times(1).Return(assets.ErrUnknownChainID) + + // setup + eng.expectRejectedProposalEvent(t, party.Id, proposal.ID, types.ProposalErrorInvalidAssetDetails) + + // when + toSubmit, err := eng.submitProposal(t, proposal) + + require.EqualError(t, err, assets.ErrUnknownChainID.Error()) + require.Nil(t, toSubmit) +} diff --git a/core/governance/engine_new_market_test.go b/core/governance/engine_new_market_test.go index 537953b63b..60f4170774 100644 --- a/core/governance/engine_new_market_test.go +++ b/core/governance/engine_new_market_test.go @@ -57,6 +57,7 @@ func TestProposalForNewMarket(t *testing.T) { t.Run("Submitting a duplicated proposal with internal time termination for new market fails", testSubmittingDuplicatedProposalWithInternalTimeTerminationForNewMarketFails) t.Run("Submitting a proposal for new market with bad risk parameter fails", testSubmittingProposalForNewMarketWithBadRiskParameterFails) t.Run("Submitting a proposal for new market with internal time termination with bad risk parameter fails", testSubmittingProposalForNewMarketWithInternalTimeTerminationWithBadRiskParameterFails) + t.Run("Submitting a proposal for a ne market without disposal slippage range fails", testSubmittingProposalWithoutDisposalSlippageFails) t.Run("Rejecting a proposal for new market succeeds", testRejectingProposalForNewMarketSucceeds) @@ -64,6 +65,7 @@ func TestProposalForNewMarket(t *testing.T) { t.Run("Voting with a majority of 'yes' makes the new market proposal passed", testVotingWithMajorityOfYesMakesNewMarketProposalPassed) t.Run("Voting with a majority of 'no' makes the new market proposal declined", testVotingWithMajorityOfNoMakesNewMarketProposalDeclined) t.Run("Voting with insufficient participation makes the new market proposal declined", testVotingWithInsufficientParticipationMakesNewMarketProposalDeclined) + t.Run("Invalid combination of decimals for market", testInvalidDecimalPlace) } func TestProposalForSuccessorMarket(t *testing.T) { @@ -473,6 +475,7 @@ func testSubmittingProposalWithInternalTimeSettlingForNewMarketFails(t *testing. DisposalFraction: num.DecimalFromFloat(0.1), FullDisposalSize: 20, MaxFractionConsumed: num.DecimalFromFloat(0.01), + DisposalSlippage: num.DecimalFromFloat(0.1), }, TickSize: num.UintOne(), }, @@ -554,6 +557,7 @@ func testSubmittingProposalWithEmptySettlingDataForNewMarketFails(t *testing.T) DisposalFraction: num.DecimalFromFloat(0.1), FullDisposalSize: 20, MaxFractionConsumed: num.DecimalFromFloat(0.01), + DisposalSlippage: num.DecimalFromFloat(0.1), }, TickSize: num.UintOne(), }, @@ -644,6 +648,7 @@ func testSubmittingProposalWithEmptyTerminationDataForNewMarketFails(t *testing. DisposalFraction: num.DecimalFromFloat(0.1), FullDisposalSize: 20, MaxFractionConsumed: num.DecimalFromFloat(0.01), + DisposalSlippage: num.DecimalFromFloat(0.1), }, TickSize: num.UintOne(), }, @@ -759,6 +764,7 @@ func testSubmittingProposalWithInternalTimeTerminationWithLessThanEqualCondition DisposalFraction: num.DecimalFromFloat(0.1), FullDisposalSize: 20, MaxFractionConsumed: num.DecimalFromFloat(0.01), + DisposalSlippage: num.DecimalFromFloat(0.1), }, TickSize: num.UintOne(), }, @@ -829,6 +835,7 @@ func testSubmittingProposalWithInternalTimeTerminationWithLessThanEqualCondition DisposalFraction: num.DecimalFromFloat(0.1), FullDisposalSize: 20, MaxFractionConsumed: num.DecimalFromFloat(0.01), + DisposalSlippage: num.DecimalFromFloat(0.1), }, TickSize: num.UintOne(), }, @@ -964,6 +971,7 @@ func testSubmittingProposalWithInternalTimeTriggerTerminationFails(t *testing.T) DisposalFraction: num.DecimalFromFloat(0.1), FullDisposalSize: 20, MaxFractionConsumed: num.DecimalFromFloat(0.01), + DisposalSlippage: num.DecimalFromFloat(0.1), }, TickSize: num.UintOne(), }, @@ -1065,6 +1073,7 @@ func testSubmittingProposalWithInternalTimeTriggerSettlementFails(t *testing.T) DisposalFraction: num.DecimalFromFloat(0.1), FullDisposalSize: 20, MaxFractionConsumed: num.DecimalFromFloat(0.01), + DisposalSlippage: num.DecimalFromFloat(0.1), }, TickSize: num.UintOne(), }, @@ -1225,6 +1234,31 @@ func testSubmittingProposalForNewMarketWithInternalTimeTerminationWithBadRiskPar assert.Contains(t, err.Error(), "invalid risk parameter") } +func testSubmittingProposalWithoutDisposalSlippageFails(t *testing.T) { + eng := getTestEngine(t, time.Now()) + // given + party := eng.newValidParty("a-valid-party", 1) + eng.ensureAllAssetEnabled(t) + + proposal := eng.newProposalForNewMarket(party.Id, eng.tsvc.GetTimeNow().Add(2*time.Hour), nil, nil, false) + proposal.Terms.GetNewMarket().Changes.LiquidationStrategy = &types.LiquidationStrategy{ + DisposalTimeStep: time.Second * 10, + DisposalFraction: num.DecimalFromFloat(0.2), + FullDisposalSize: 10, + MaxFractionConsumed: num.DecimalFromFloat(0.5), + } + + // setup + eng.broker.EXPECT().Send(gomock.Any()).Times(1) + + // when + _, err := eng.submitProposal(t, proposal) + + // then + require.Error(t, err) + assert.Contains(t, err.Error(), "liquidation strategy must specify a disposal slippage range > 0") +} + func testOutOfRangeRiskParamFail(t *testing.T, lnm *types.LogNormalRiskModel) { t.Helper() eng := getTestEngine(t, time.Now()) @@ -1689,3 +1723,27 @@ func testSubmittingProposalForNewPerpsMarketWithPastInitialTimeFails(t *testing. require.EqualError(t, err, "time trigger starts in the past") require.Nil(t, toSubmit) } + +func testInvalidDecimalPlace(t *testing.T) { + eng := getTestEngine(t, time.Now()) + defer eng.ctrl.Finish() + + // given + party := eng.newValidParty("a-valid-party", 123456789) + proposal := eng.newProposalForNewPerpsMarket(party.Id, eng.tsvc.GetTimeNow().Add(2*time.Hour), nil, nil, true) + + proposal.Terms.GetNewMarket().Changes.DecimalPlaces = 12 + proposal.Terms.GetNewMarket().Changes.PositionDecimalPlaces = 7 + + // set the time differently to start e.g sometimes after the enactment ti + enactAt := proposal.Terms.EnactmentTimestamp + proposal.Terms.Change.(*types.ProposalTermsNewMarket).NewMarket.Changes.Instrument.Product.(*types.InstrumentConfigurationPerps).Perps.DataSourceSpecForSettlementSchedule.GetInternalTimeTriggerSpecConfiguration().Triggers[0].Initial = ptr.From(time.Unix(enactAt, 0).Add(60 * time.Minute)) + + // setup + eng.ensureAllAssetEnabled(t) + eng.expectRejectedProposalEvent(t, party.Id, proposal.ID, types.ProposalErrorTooManyMarketDecimalPlaces) + + // when + _, err := eng.submitProposal(t, proposal) + require.Equal(t, "market decimal + position decimals must be less than or equal to asset decimals", err.Error()) +} diff --git a/core/governance/engine_new_spot_market_test.go b/core/governance/engine_new_spot_market_test.go index 0cc0374230..3167bddde5 100644 --- a/core/governance/engine_new_spot_market_test.go +++ b/core/governance/engine_new_spot_market_test.go @@ -40,6 +40,8 @@ func TesSpottProposalForNewMarket(t *testing.T) { t.Run("Voting with a majority of 'yes' makes the new spot market proposal passed", testVotingWithMajorityOfYesMakesNewSpotMarketProposalPassed) t.Run("Voting with a majority of 'no' makes the new spot market proposal declined", testVotingWithMajorityOfNoMakesNewSpotMarketProposalDeclined) t.Run("Voting with insufficient participation makes the new spot market proposal declined", testVotingWithInsufficientParticipationMakesNewSpotMarketProposalDeclined) + t.Run("Invalid combination of spot decimals for market", testInvalidSpotDecimalPlace) + t.Run("Invalid combination of position decimals for base asset", testInvalidSpotPositionDecimalPlace) } func testSubmittingProposalForNewSpotMarketSucceeds(t *testing.T) { @@ -475,3 +477,44 @@ func testVotingWithInsufficientParticipationMakesNewSpotMarketProposalDeclined(t // then assert.Empty(t, toBeEnacted) } + +func testInvalidSpotDecimalPlace(t *testing.T) { + eng := getTestEngine(t, time.Now()) + defer eng.ctrl.Finish() + + // given + party := eng.newValidParty("a-valid-party", 123456789) + proposal := eng.newProposalForNewSpotMarket(party.Id, eng.tsvc.GetTimeNow().Add(2*time.Hour)) + + proposal.Terms.GetNewSpotMarket().Changes.PriceDecimalPlaces = 12 + proposal.Terms.GetNewSpotMarket().Changes.SizeDecimalPlaces = 7 + + // setup + eng.ensureAllAssetEnabled(t) + eng.expectRejectedProposalEvent(t, party.Id, proposal.ID, types.ProposalErrorTooManyMarketDecimalPlaces) + + // when + _, err := eng.submitProposal(t, proposal) + require.Equal(t, "market decimal + position decimals must be less than or equal to asset decimals", err.Error()) +} + +func testInvalidSpotPositionDecimalPlace(t *testing.T) { + eng := getTestEngine(t, time.Now()) + defer eng.ctrl.Finish() + + // given + party := eng.newValidParty("a-valid-party", 123456789) + proposal := eng.newProposalForNewSpotMarket(party.Id, eng.tsvc.GetTimeNow().Add(2*time.Hour)) + + proposal.Terms.GetNewSpotMarket().Changes.PriceDecimalPlaces = 0 + proposal.Terms.GetNewSpotMarket().Changes.SizeDecimalPlaces = 6 + + // setup + spot := proposal.Terms.GetNewSpotMarket().Changes.Instrument.IntoProto().GetSpot() + eng.ensureAllAssetEnabledWithDP(t, spot.BaseAsset, spot.QuoteAsset, 5, 10) + eng.expectRejectedProposalEvent(t, party.Id, proposal.ID, types.ProposalErrorInvalidSizeDecimalPlaces) + + // when + _, err := eng.submitProposal(t, proposal) + require.Equal(t, "number of position decimal places must be less than or equal to the number base asset decimal places", err.Error()) +} diff --git a/core/governance/engine_test.go b/core/governance/engine_test.go index 33cfb75370..5792675dd4 100644 --- a/core/governance/engine_test.go +++ b/core/governance/engine_test.go @@ -1455,7 +1455,7 @@ func getTestEngine(t *testing.T, now time.Time) *tstEngine { // ensure the balance is always returned as expected broker.EXPECT().Send(gomock.Any()).Times(1) - tEng.netp.Update(context.Background(), netparams.BlockchainsEthereumConfig, "{\"network_id\":\"1\",\"chain_id\":\"1\",\"collateral_bridge_contract\":{\"address\":\"0x23872549cE10B40e31D6577e0A920088B0E0666a\"},\"confirmations\":64,\"staking_bridge_contract\":{\"address\":\"0x195064D33f09e0c42cF98E665D9506e0dC17de68\",\"deployment_block_height\":13146644},\"token_vesting_contract\":{\"address\":\"0x23d1bFE8fA50a167816fBD79D7932577c06011f4\",\"deployment_block_height\":12834524},\"multisig_control_contract\":{\"address\":\"0xDD2df0E7583ff2acfed5e49Df4a424129cA9B58F\",\"deployment_block_height\":15263593}}") + tEng.netp.Update(context.Background(), netparams.BlockchainsPrimaryEthereumConfig, "{\"network_id\":\"1\",\"chain_id\":\"1\",\"collateral_bridge_contract\":{\"address\":\"0x23872549cE10B40e31D6577e0A920088B0E0666a\"},\"confirmations\":64,\"staking_bridge_contract\":{\"address\":\"0x195064D33f09e0c42cF98E665D9506e0dC17de68\",\"deployment_block_height\":13146644},\"token_vesting_contract\":{\"address\":\"0x23d1bFE8fA50a167816fBD79D7932577c06011f4\",\"deployment_block_height\":12834524},\"multisig_control_contract\":{\"address\":\"0xDD2df0E7583ff2acfed5e49Df4a424129cA9B58F\",\"deployment_block_height\":15263593}}") tEng.accounts.EXPECT().GetAvailableBalance(gomock.Any()).AnyTimes().DoAndReturn(func(p string) (*num.Uint, error) { b, ok := tEng.tokenBal[p] if !ok { @@ -1628,6 +1628,7 @@ func newMarketTerms(termFilter *dstypes.SpecFilter, termBinding *datasource.Spec DisposalFraction: num.DecimalFromFloat(0.1), FullDisposalSize: 20, MaxFractionConsumed: num.DecimalFromFloat(0.01), + DisposalSlippage: num.DecimalFromFloat(0.1), }, TickSize: num.NewUint(1), }, @@ -1718,6 +1719,7 @@ func newPerpsMarketTerms(termFilter *dstypes.SpecFilter, binding *datasource.Spe DisposalFraction: num.DecimalFromFloat(0.1), FullDisposalSize: 20, MaxFractionConsumed: num.DecimalFromFloat(0.01), + DisposalSlippage: num.DecimalFromFloat(0.1), }, TickSize: num.UintOne(), }, @@ -1763,8 +1765,8 @@ func newSpotMarketTerms() *types.ProposalTermsNewSpotMarket { }, }, }, - Metadata: []string{"asset_class:spot/crypto", "product:spot"}, - DecimalPlaces: 0, + Metadata: []string{"asset_class:spot/crypto", "product:spot"}, + PriceDecimalPlaces: 0, SLAParams: &types.LiquiditySLAParams{ PriceRange: num.DecimalOne(), CommitmentMinTimeFraction: num.DecimalFromFloat(0.5), @@ -1782,6 +1784,10 @@ func updateSpotMarketTerms() *types.ProposalTermsUpdateSpotMarket { UpdateSpotMarket: &types.UpdateSpotMarket{ MarketID: vgrand.RandomStr(5), Changes: &types.UpdateSpotMarketConfiguration{ + Instrument: &types.InstrumentConfiguration{ + Name: "some name", + Code: "some code", + }, RiskParameters: &types.UpdateSpotMarketConfigurationLogNormal{ LogNormal: &types.LogNormalRiskModel{ RiskAversionParameter: num.DecimalFromFloat(0.02), @@ -1907,6 +1913,7 @@ func updateMarketTerms(termFilter *dstypes.SpecFilter, termBinding *datasource.S DisposalFraction: num.DecimalFromFloat(0.1), FullDisposalSize: 20, MaxFractionConsumed: num.DecimalFromFloat(0.01), + DisposalSlippage: num.DecimalFromFloat(0.1), }, TickSize: num.UintOne(), }, @@ -1987,9 +1994,10 @@ func (e *tstEngine) newBatchSubmission( for _, proposal := range proposals { sub.Terms.Changes = append(sub.Terms.Changes, types.BatchProposalChange{ - ID: proposal.ID, - Change: proposal.Terms.Change, - EnactmentTime: proposal.Terms.EnactmentTimestamp, + ID: proposal.ID, + Change: proposal.Terms.Change, + EnactmentTime: proposal.Terms.EnactmentTimestamp, + ValidationTime: proposal.Terms.ValidationTimestamp, }) } @@ -2397,6 +2405,28 @@ func (e *tstEngine) ensureAllAssetEnabled(t *testing.T) { e.assets.EXPECT().IsEnabled(gomock.Any()).AnyTimes().Return(true) } +func (e *tstEngine) ensureAllAssetEnabledWithDP(t *testing.T, base, quote string, baseDecimals, quoteDecimals uint64) { + t.Helper() + baseDetails := newAssetTerms() + baseDetails.NewAsset.Changes.Symbol = base + baseDetails.NewAsset.Changes.Decimals = baseDecimals + + quoteDetails := newAssetTerms() + quoteDetails.NewAsset.Changes.Symbol = quote + quoteDetails.NewAsset.Changes.Decimals = quoteDecimals + + e.assets.EXPECT().Get(gomock.Any()).AnyTimes().DoAndReturn(func(id string) (*assets.Asset, error) { + if id == base { + ret := assets.NewAsset(builtin.New(id, baseDetails.NewAsset.Changes)) + return ret, nil + } else { + ret := assets.NewAsset(builtin.New(id, quoteDetails.NewAsset.Changes)) + return ret, nil + } + }) + e.assets.EXPECT().IsEnabled(gomock.Any()).AnyTimes().Return(true) +} + func (e *tstEngine) ensureEquityLikeShareForMarketAndParty(t *testing.T, market, party string, share float64) { t.Helper() mels, ok := e.els[market] diff --git a/core/governance/market.go b/core/governance/market.go index df0e28ddc5..8f9378a3b2 100644 --- a/core/governance/market.go +++ b/core/governance/market.go @@ -326,8 +326,8 @@ func buildSpotMarketFromProposal( infraFeeDec, _ := num.DecimalFromString(infraFee) market := &types.Market{ ID: marketID, - DecimalPlaces: definition.Changes.DecimalPlaces, - PositionDecimalPlaces: definition.Changes.PositionDecimalPlaces, + DecimalPlaces: definition.Changes.PriceDecimalPlaces, + PositionDecimalPlaces: definition.Changes.SizeDecimalPlaces, Fees: &types.Fees{ Factors: &types.FeeFactors{ MakerFee: makerFeeDec, @@ -364,7 +364,7 @@ func buildSpotMarketFromProposal( return market, types.ProposalErrorUnspecified, nil } -func validateAssetBasic(assetID string, assets Assets, deepCheck bool) (types.ProposalError, error) { +func validateAssetBasic(assetID string, assets Assets, positionDecimals int64, deepCheck bool) (types.ProposalError, error) { if len(assetID) <= 0 { return types.ProposalErrorInvalidAsset, errors.New("missing asset ID") } @@ -373,7 +373,7 @@ func validateAssetBasic(assetID string, assets Assets, deepCheck bool) (types.Pr return types.ProposalErrorUnspecified, nil } - _, err := assets.Get(assetID) + as, err := assets.Get(assetID) if err != nil { return types.ProposalErrorInvalidAsset, err } @@ -381,10 +381,14 @@ func validateAssetBasic(assetID string, assets Assets, deepCheck bool) (types.Pr return types.ProposalErrorInvalidAsset, fmt.Errorf("asset is not enabled %v", assetID) } + if positionDecimals > int64(as.DecimalPlaces()) { + return types.ProposalErrorInvalidSizeDecimalPlaces, fmt.Errorf("number of position decimal places must be less than or equal to the number base asset decimal places") + } + return types.ProposalErrorUnspecified, nil } -func validateAsset(assetID string, decimals uint64, assets Assets, deepCheck bool) (types.ProposalError, error) { +func validateAsset(assetID string, decimals uint64, positionDecimals int64, assets Assets, deepCheck bool) (types.ProposalError, error) { if len(assetID) <= 0 { return types.ProposalErrorInvalidAsset, errors.New("missing asset ID") } @@ -399,26 +403,24 @@ func validateAsset(assetID string, decimals uint64, assets Assets, deepCheck boo } if !assets.IsEnabled(assetID) { return types.ProposalErrorInvalidAsset, - fmt.Errorf("assets is not enabled %v", assetID) + fmt.Errorf("asset is not enabled %v", assetID) } - // decimal places asset less than market -> invalid. - // @TODO add a specific error for this validation? - if asset.DecimalPlaces() < decimals { - return types.ProposalErrorTooManyMarketDecimalPlaces, errors.New("market cannot have more decimal places than assets") + if int64(decimals)+positionDecimals > int64(asset.DecimalPlaces()) { + return types.ProposalErrorTooManyMarketDecimalPlaces, errors.New("market decimal + position decimals must be less than or equal to asset decimals") } return types.ProposalErrorUnspecified, nil } -func validateSpot(spot *types.SpotProduct, decimals uint64, assets Assets, deepCheck bool) (types.ProposalError, error) { - propError, err := validateAsset(spot.QuoteAsset, decimals, assets, deepCheck) +func validateSpot(spot *types.SpotProduct, decimals uint64, positionDecimals int64, assets Assets, deepCheck bool) (types.ProposalError, error) { + propError, err := validateAsset(spot.QuoteAsset, decimals, positionDecimals, assets, deepCheck) if err != nil { return propError, err } - return validateAssetBasic(spot.BaseAsset, assets, deepCheck) + return validateAssetBasic(spot.BaseAsset, assets, positionDecimals, deepCheck) } -func validateFuture(future *types.FutureProduct, decimals uint64, 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) (types.ProposalError, error) { future.DataSourceSpecForSettlementData = setDatasourceDefinitionDefaults(future.DataSourceSpecForSettlementData, et) future.DataSourceSpecForTradingTermination = setDatasourceDefinitionDefaults(future.DataSourceSpecForTradingTermination, et) @@ -522,10 +524,10 @@ func validateFuture(future *types.FutureProduct, decimals uint64, assets Assets, } } - return validateAsset(future.SettlementAsset, decimals, assets, deepCheck) + return validateAsset(future.SettlementAsset, decimals, positionDecimals, assets, deepCheck) } -func validatePerps(perps *types.PerpsProduct, decimals uint64, assets Assets, et *enactmentTime, currentTime time.Time, deepCheck bool, evmChainIDs []uint64) (types.ProposalError, error) { +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) @@ -628,19 +630,19 @@ func validatePerps(perps *types.PerpsProduct, decimals uint64, assets Assets, et } } - return validateAsset(perps.SettlementAsset, decimals, assets, deepCheck) + return validateAsset(perps.SettlementAsset, decimals, positionDecimals, assets, deepCheck) } -func validateNewInstrument(instrument *types.InstrumentConfiguration, decimals uint64, 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) (types.ProposalError, error) { switch product := instrument.Product.(type) { case nil: return types.ProposalErrorNoProduct, ErrMissingProduct case *types.InstrumentConfigurationFuture: - return validateFuture(product.Future, decimals, assets, et, deepCheck, evmChainIDs) + return validateFuture(product.Future, decimals, positionDecimals, assets, et, deepCheck, evmChainIDs) case *types.InstrumentConfigurationPerps: - return validatePerps(product.Perps, decimals, assets, et, *currentTime, deepCheck, evmChainIDs) + return validatePerps(product.Perps, decimals, positionDecimals, assets, et, *currentTime, deepCheck, evmChainIDs) case *types.InstrumentConfigurationSpot: - return validateSpot(product.Spot, decimals, assets, deepCheck) + return validateSpot(product.Spot, decimals, positionDecimals, assets, deepCheck) default: return types.ProposalErrorUnsupportedProduct, ErrUnsupportedProduct } @@ -671,6 +673,10 @@ func validateRiskParameters(rp interface{}) (types.ProposalError, error) { return validateLogNormalRiskParams(r.LogNormal) case *types.UpdateMarketConfigurationLogNormal: return validateLogNormalRiskParams(r.LogNormal) + case *types.NewSpotMarketConfigurationSimple: + return types.ProposalErrorUnspecified, nil + case *types.UpdateSpotMarketConfigurationSimple: + return types.ProposalErrorUnspecified, nil case *types.NewSpotMarketConfigurationLogNormal: return validateLogNormalRiskParams(r.LogNormal) case *types.UpdateSpotMarketConfigurationLogNormal: @@ -699,6 +705,9 @@ func validateLiquidationStrategy(ls *types.LiquidationStrategy) (types.ProposalE } else if ls.DisposalTimeStep > time.Hour { return types.ProposalErrorInvalidMarket, fmt.Errorf("liquidation strategy time step can't be more than 1h") } + if ls.DisposalSlippage.IsZero() || ls.DisposalSlippage.IsNegative() { + return types.ProposalErrorInvalidMarket, fmt.Errorf("liquidation strategy must specify a disposal slippage range > 0") + } return types.ProposalErrorUnspecified, nil } @@ -754,7 +763,7 @@ func validateSlippageFactor(slippageFactor num.Decimal, isLinear bool) (types.Pr func getEVMChainIDs(netp NetParams) []uint64 { ethCfg := &proto.EthereumConfig{} - if err := netp.GetJSONStruct(netparams.BlockchainsEthereumConfig, ethCfg); err != nil { + if err := netp.GetJSONStruct(netparams.BlockchainsPrimaryEthereumConfig, ethCfg); err != nil { panic(fmt.Sprintf("could not load ethereum config from network parameter, this should never happen: %v", err)) } cID, err := strconv.ParseUint(ethCfg.ChainId, 10, 64) @@ -787,7 +796,7 @@ func validateNewSpotMarketChange( openingAuctionDuration time.Duration, etu *enactmentTime, ) (types.ProposalError, error) { - if perr, err := validateNewInstrument(terms.Changes.Instrument, terms.Changes.DecimalPlaces, 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)); err != nil { return perr, err } if perr, err := validateAuctionDuration(openingAuctionDuration, netp); err != nil { @@ -819,7 +828,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, 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)); 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 fe2bb32908..29544e9f29 100644 --- a/core/governance/market_cp_restore_test.go +++ b/core/governance/market_cp_restore_test.go @@ -194,10 +194,11 @@ func createExecutionEngine(t *testing.T, tm time.Time) (*execution.Engine, *gove epochEngine := emocks.NewMockEpochEngine(ctrl) epochEngine.EXPECT().NotifyOnEpoch(gomock.Any(), gomock.Any()).Times(1) - bridgeView := amocks.NewMockERC20BridgeView(ctrl) + primaryBridgeView := amocks.NewMockERC20BridgeView(ctrl) + secondaryBridgeView := amocks.NewMockERC20BridgeView(ctrl) notary := amocks.NewMockNotary(ctrl) - asset := assets.New(log, assets.NewDefaultConfig(), getNodeWallet().Ethereum, nil, broker, bridgeView, notary, false) + asset, _ := assets.New(context.Background(), log, assets.NewDefaultConfig(), getNodeWallet().Ethereum, nil, nil, broker, primaryBridgeView, secondaryBridgeView, notary, false) teams := emocks.NewMockTeams(ctrl) bc := emocks.NewMockAccountBalanceChecker(ctrl) marketTracker := common.NewMarketActivityTracker(log, teams, bc, broker) diff --git a/core/governance/mocks/mocks.go b/core/governance/mocks/mocks.go index aed7ce70ed..c8c5a33bd1 100644 --- a/core/governance/mocks/mocks.go +++ b/core/governance/mocks/mocks.go @@ -232,20 +232,6 @@ func (m *MockAssets) EXPECT() *MockAssetsMockRecorder { return m.recorder } -// ExistsForEthereumAddress mocks base method. -func (m *MockAssets) ExistsForEthereumAddress(arg0 string) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ExistsForEthereumAddress", arg0) - ret0, _ := ret[0].(bool) - return ret0 -} - -// ExistsForEthereumAddress indicates an expected call of ExistsForEthereumAddress. -func (mr *MockAssetsMockRecorder) ExistsForEthereumAddress(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExistsForEthereumAddress", reflect.TypeOf((*MockAssets)(nil).ExistsForEthereumAddress), arg0) -} - // Get mocks base method. func (m *MockAssets) Get(arg0 string) (*assets.Asset, error) { m.ctrl.T.Helper() @@ -332,6 +318,20 @@ func (mr *MockAssetsMockRecorder) ValidateAsset(arg0 interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateAsset", reflect.TypeOf((*MockAssets)(nil).ValidateAsset), arg0) } +// ValidateEthereumAddress mocks base method. +func (m *MockAssets) ValidateEthereumAddress(arg0, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValidateEthereumAddress", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ValidateEthereumAddress indicates an expected call of ValidateEthereumAddress. +func (mr *MockAssetsMockRecorder) ValidateEthereumAddress(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateEthereumAddress", reflect.TypeOf((*MockAssets)(nil).ValidateEthereumAddress), arg0, arg1) +} + // MockTimeService is a mock of TimeService interface. type MockTimeService struct { ctrl *gomock.Controller diff --git a/core/governance/node_validation.go b/core/governance/node_validation.go index 618b81dfc8..932c611bfc 100644 --- a/core/governance/node_validation.go +++ b/core/governance/node_validation.go @@ -25,7 +25,9 @@ import ( "code.vegaprotocol.io/vega/core/types" vgcrypto "code.vegaprotocol.io/vega/libs/crypto" + vgerrors "code.vegaprotocol.io/vega/libs/errors" "code.vegaprotocol.io/vega/logging" + snapshotpb "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" ) const ( @@ -47,11 +49,12 @@ const ( ) type NodeValidation struct { - log *logging.Logger - assets Assets - currentTimestamp time.Time - nodeProposals []*nodeProposal - witness Witness + log *logging.Logger + assets Assets + currentTimestamp time.Time + nodeProposals []*nodeProposal + nodeBatchProposals []*nodeBatchProposal + witness Witness } type nodeProposal struct { @@ -60,18 +63,60 @@ type nodeProposal struct { checker func() error } +type nodeBatchProposal struct { + *batchProposal + nodeProposals []*nodeProposal + state atomic.Uint32 +} + +func (n *nodeBatchProposal) UpdateState() { + pending, failed := 0, 0 + + for _, v := range n.nodeProposals { + switch v.state.Load() { + case okProposal: + continue + case pendingValidationProposal: + pending++ + case rejectedProposal: + failed++ + } + } + + // nothing to do + if pending > 0 { + return + } + + // if at least 1 failure and no pending, then the whole batch is failed. + if failed > 0 { + n.state.Store(rejectedProposal) + return + } + + n.state.Store(okProposal) +} + func (n *nodeProposal) GetID() string { return n.ID } +func (n *nodeProposal) GetChainID() string { + switch na := n.Terms.Change.(type) { + case *types.ProposalTermsNewAsset: + if erc20 := na.NewAsset.Changes.GetERC20(); erc20 != nil { + return erc20.ChainID + } + } + return "" +} + func (n *nodeProposal) GetType() types.NodeVoteType { return types.NodeVoteTypeGovernanceValidateAsset } -func (n *nodeProposal) Check(ctx context.Context) error { - // always keep the last error - err := n.checker() - if err != nil { +func (n *nodeProposal) Check(_ context.Context) error { + if err := n.checker(); err != nil { return err } @@ -85,11 +130,12 @@ func NewNodeValidation( witness Witness, ) *NodeValidation { return &NodeValidation{ - log: log, - nodeProposals: []*nodeProposal{}, - assets: assets, - currentTimestamp: now, - witness: witness, + log: log, + nodeProposals: []*nodeProposal{}, + nodeBatchProposals: []*nodeBatchProposal{}, + assets: assets, + currentTimestamp: now, + witness: witness, } } @@ -136,10 +182,23 @@ func (n *NodeValidation) getProposal(id string) (*nodeProposal, bool) { return nil, false } +func (n *NodeValidation) getBatchProposal(id string) (*nodeBatchProposal, bool) { + for _, v := range n.nodeBatchProposals { + if v.ID == id { + return v, true + } + } + return nil, false +} + func (n *NodeValidation) getProposals() []*nodeProposal { return n.nodeProposals } +func (n *NodeValidation) getBatchProposals() []*nodeBatchProposal { + return n.nodeBatchProposals +} + func (n *NodeValidation) removeProposal(id string) { for i, p := range n.nodeProposals { if p.ID == id { @@ -151,6 +210,17 @@ func (n *NodeValidation) removeProposal(id string) { } } +func (n *NodeValidation) removeBatchProposal(id string) { + for i, p := range n.nodeBatchProposals { + if p.ID == id { + copy(n.nodeBatchProposals[i:], n.nodeBatchProposals[i+1:]) + n.nodeBatchProposals[len(n.nodeBatchProposals)-1] = nil + n.nodeBatchProposals = n.nodeBatchProposals[:len(n.nodeBatchProposals)-1] + return + } + } +} + // OnTick returns validated proposal by all nodes. func (n *NodeValidation) OnTick(t time.Time) (accepted []*proposal, rejected []*proposal) { //revive:disable:unexported-return n.currentTimestamp = t @@ -180,6 +250,37 @@ func (n *NodeValidation) OnTick(t time.Time) (accepted []*proposal, rejected []* return accepted, rejected } +// OnTickBatch returns validated proposal by all nodes. +func (n *NodeValidation) OnTickBatch(t time.Time) (accepted []*batchProposal, rejected []*batchProposal) { //revive:disable:unexported-return + n.currentTimestamp = t + + toRemove := []string{} // id of proposals to remove + + // check that any proposal is ready + for _, prop := range n.nodeBatchProposals { + // update the top level batch proposal + prop.UpdateState() + // this proposal has passed the node-voting period, or all nodes have voted/approved + // time expired, or all vote aggregated, and own vote sent + switch prop.state.Load() { + case pendingValidationProposal: + continue + case okProposal: + accepted = append(accepted, prop.batchProposal) + case rejectedProposal: + rejected = append(rejected, prop.batchProposal) + } + toRemove = append(toRemove, prop.ID) + } + + // now we iterate over all proposal ids to remove them from the list + for _, id := range toRemove { + n.removeBatchProposal(id) + } + + return accepted, rejected +} + // IsNodeValidationRequired returns true if the given proposal require validation from a node. func (n *NodeValidation) IsNodeValidationRequired(p *types.Proposal) bool { switch p.Terms.Change.(type) { @@ -190,6 +291,83 @@ func (n *NodeValidation) IsNodeValidationRequired(p *types.Proposal) bool { } } +func (n *NodeValidation) IsNodeValidationRequiredBatch(p *types.BatchProposal) (is bool) { + for _, v := range p.Proposals { + is = is || n.IsNodeValidationRequired(v) + } + + return is +} + +// Start the node validation of a proposal. +func (n *NodeValidation) StartBatch(ctx context.Context, p *types.BatchProposal) error { + if !n.IsNodeValidationRequiredBatch(p) { + n.log.Error("no node validation required", logging.String("ref", p.ID)) + return ErrNoNodeValidationRequired + } + + if _, ok := n.getBatchProposal(p.ID); ok { + return ErrProposalReferenceDuplicate + } + + if err := n.checkBatchProposal(p); err != nil { + return err + } + + nodeProposals := []*nodeProposal{} + for _, v := range p.Proposals { + if !n.IsNodeValidationRequired(v) { + // nothing to do here + continue + } + checker, err := n.getChecker(ctx, v) + if err != nil { + return err + } + + np := &nodeProposal{ + proposal: &proposal{ + Proposal: v, + yes: map[string]*types.Vote{}, + no: map[string]*types.Vote{}, + invalidVotes: map[string]*types.Vote{}, + }, + state: atomic.Uint32{}, + checker: checker, + } + + np.state.Store(pendingValidationProposal) + nodeProposals = append(nodeProposals, np) + } + + nbp := &nodeBatchProposal{ + batchProposal: &batchProposal{ + BatchProposal: p, + yes: map[string]*types.Vote{}, + no: map[string]*types.Vote{}, + invalidVotes: map[string]*types.Vote{}, + }, + nodeProposals: nodeProposals, + state: atomic.Uint32{}, + } + nbp.state.Store(pendingValidationProposal) + n.nodeBatchProposals = append(n.nodeBatchProposals, nbp) + + errs := vgerrors.NewCumulatedErrors() + for _, v := range nbp.nodeProposals { + err := n.witness.StartCheck(v, n.onResChecked, time.Unix(v.Terms.ValidationTimestamp, 0)) + if err != nil { + errs.Add(err) + } + } + + if errs.HasAny() { + return errs + } + + return nil +} + // Start the node validation of a proposal. func (n *NodeValidation) Start(ctx context.Context, p *types.Proposal) error { if !n.IsNodeValidationRequired(p) { @@ -223,8 +401,58 @@ func (n *NodeValidation) Start(ctx context.Context, p *types.Proposal) error { np.state.Store(pendingValidationProposal) n.nodeProposals = append(n.nodeProposals, np) - return n.witness.StartCheck( - np, n.onResChecked, time.Unix(p.Terms.ValidationTimestamp, 0)) + return n.witness.StartCheck(np, n.onResChecked, time.Unix(p.Terms.ValidationTimestamp, 0)) +} + +func (n *NodeValidation) restoreBatch(ctx context.Context, pProto *snapshotpb.BatchProposalData) (*types.BatchProposal, error) { + p := types.BatchProposalFromSnapshotProto(pProto.BatchProposal.Proposal, pProto.Proposals) + nodeProposals := []*nodeProposal{} + for _, v := range p.Proposals { + if !n.IsNodeValidationRequired(v) { + // nothing to do here + continue + } + checker, err := n.getChecker(ctx, v) + if err != nil { + return nil, err + } + + np := &nodeProposal{ + proposal: &proposal{ + Proposal: v, + yes: map[string]*types.Vote{}, + no: map[string]*types.Vote{}, + invalidVotes: map[string]*types.Vote{}, + }, + state: atomic.Uint32{}, + checker: checker, + } + + np.state.Store(pendingValidationProposal) + nodeProposals = append(nodeProposals, np) + } + + nbp := &nodeBatchProposal{ + batchProposal: &batchProposal{ + BatchProposal: p, + yes: map[string]*types.Vote{}, + no: map[string]*types.Vote{}, + invalidVotes: map[string]*types.Vote{}, + }, + nodeProposals: nodeProposals, + state: atomic.Uint32{}, + } + + nbp.state.Store(pendingValidationProposal) + n.nodeBatchProposals = append(n.nodeBatchProposals, nbp) + + for _, v := range nbp.nodeProposals { + if err := n.witness.RestoreResource(v, n.onResChecked); err != nil { + n.log.Panic("unable to restore witness resource", logging.String("id", v.ID), logging.Error(err)) + } + } + + return p, nil } func (n *NodeValidation) restore(ctx context.Context, p *types.ProposalData) error { @@ -289,3 +517,17 @@ func (n *NodeValidation) checkProposal(prop *types.Proposal) error { } return nil } + +func (n *NodeValidation) checkBatchProposal(prop *types.BatchProposal) error { + for _, v := range prop.Proposals { + if !n.IsNodeValidationRequired(v) { + continue + } + + if err := n.checkProposal(v); err != nil { + return err + } + } + + return nil +} diff --git a/core/governance/snapshot.go b/core/governance/snapshot.go index 7f7d553201..f459601acd 100644 --- a/core/governance/snapshot.go +++ b/core/governance/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/num" "code.vegaprotocol.io/vega/libs/proto" "code.vegaprotocol.io/vega/logging" @@ -74,6 +75,30 @@ func (e *Engine) OnStateLoaded(ctx context.Context) error { } } + // update market events may require updating to set the liquidation strategy slippage + if vgcontext.InProgressUpgradeFromMultiple(ctx, "v0.75.8", "v0.75.7") { + evts := make([]events.Event, 0, len(e.activeProposals)/2) + for _, p := range e.activeProposals { + if !p.Proposal.IsMarketUpdate() { + continue + } + mID := p.Proposal.MarketUpdate().MarketID + changes := p.Proposal.MarketUpdate().Changes + if changes.LiquidationStrategy != nil && changes.LiquidationStrategy.DisposalSlippage.IsZero() { + existingMarket, ok := e.markets.GetMarket(mID, false) + if !ok { + continue + } + // execution engine has already been restored at this point, so we can get the current slippage value from the market itself. + changes.LiquidationStrategy.DisposalSlippage = existingMarket.LiquidationStrategy.DisposalSlippage + evts = append(evts, events.NewProposalEvent(ctx, *p.Proposal)) + } + } + if len(evts) > 0 { + e.broker.SendBatch(evts) + } + } + return nil } @@ -164,7 +189,9 @@ func (e *Engine) serialiseEnactedProposals() ([]byte, error) { // serialiseNodeProposals returns the engine's proposals waiting for node validation. func (e *Engine) serialiseNodeProposals() ([]byte, error) { nodeProposals := e.nodeProposalValidation.getProposals() + nodeBatchProposals := e.nodeProposalValidation.getBatchProposals() proposals := make([]*types.ProposalData, 0, len(nodeProposals)) + batchProposals := make([]*snapshotpb.BatchProposalData, 0, len(nodeBatchProposals)) for _, np := range nodeProposals { proposals = append(proposals, &types.ProposalData{ @@ -175,10 +202,29 @@ func (e *Engine) serialiseNodeProposals() ([]byte, error) { }) } + for _, proposal := range nodeBatchProposals { + bp := &snapshotpb.BatchProposalData{ + BatchProposal: &snapshotpb.ProposalData{ + Proposal: proposal.ToProto(), + Yes: votesAsProtoSlice(proposal.yes), + No: votesAsProtoSlice(proposal.no), + Invalid: votesAsProtoSlice(proposal.invalidVotes), + }, + Proposals: make([]*vegapb.Proposal, 0, len(proposal.Proposals)), + } + + for _, proposal := range proposal.Proposals { + bp.Proposals = append(bp.Proposals, proposal.IntoProto()) + } + + batchProposals = append(batchProposals, bp) + } + pl := types.Payload{ Data: &types.PayloadGovernanceNode{ GovernanceNode: &types.GovernanceNode{ - ProposalData: proposals, + ProposalData: proposals, + BatchProposalData: batchProposals, }, }, } @@ -252,6 +298,11 @@ func (e *Engine) restoreActiveProposals(ctx context.Context, active *types.Gover vevts := []events.Event{} e.log.Debug("restoring active proposals snapshot", logging.Int("nproposals", len(active.Proposals))) for _, p := range active.Proposals { + if vgcontext.InProgressUpgradeFromMultiple(ctx, "v0.75.8", "v0.75.7") { + if p.Proposal.IsNewMarket() || p.Proposal.IsMarketUpdate() { + setLiquidationSlippage(p.Proposal) + } + } pp := &proposal{ Proposal: p.Proposal, yes: votesAsMap(p.Yes), @@ -287,6 +338,22 @@ func (e *Engine) restoreActiveProposals(ctx context.Context, active *types.Gover return err } +func setLiquidationSlippage(p *types.Proposal) { + if p.IsNewMarket() { + if !p.NewMarket().Changes.LiquidationStrategy.DisposalSlippage.IsZero() { + return + } + changes := p.NewMarket().Changes + changes.LiquidationStrategy.DisposalSlippage = changes.LiquiditySLAParameters.PriceRange + return + } + // this must be a market update + changes := p.MarketUpdate().Changes + if changes.LiquidationStrategy != nil && changes.LiquiditySLAParameters != nil && changes.LiquidationStrategy.DisposalSlippage.IsZero() { + changes.LiquidationStrategy.DisposalSlippage = changes.LiquiditySLAParameters.PriceRange + } +} + func (e *Engine) restoreBatchActiveProposals(ctx context.Context, active *types.GovernanceBatchActive, p *types.Payload) error { e.activeBatchProposals = make(map[string]*batchProposal, len(active.BatchProposals)) @@ -304,6 +371,11 @@ func (e *Engine) restoreBatchActiveProposals(ctx context.Context, active *types. evts = append(evts, events.NewProposalEventFromProto(ctx, bp.BatchProposal.ToProto())) for _, p := range bp.BatchProposal.Proposals { + if vgcontext.InProgressUpgradeFromMultiple(ctx, "v0.75.8", "v0.75.7") { + if p.IsMarketUpdate() || p.IsNewMarket() { + setLiquidationSlippage(p) + } + } evts = append(evts, events.NewProposalEvent(ctx, *p)) } @@ -383,6 +455,11 @@ func (e *Engine) restoreNodeProposals(ctx context.Context, node *types.Governanc e.broker.Send(events.NewProposalEvent(ctx, *p.Proposal)) } + for _, p := range node.BatchProposalData { + prop, _ := e.nodeProposalValidation.restoreBatch(ctx, p) + e.broker.Send(events.NewProposalEventFromProto(ctx, prop.ToProto())) + } + var err error e.gss.serialisedNodeValidation, err = proto.Marshal(p.IntoProto()) return err diff --git a/core/integration/execution_test.go b/core/integration/execution_test.go index f96337e6aa..4bad416d96 100644 --- a/core/integration/execution_test.go +++ b/core/integration/execution_test.go @@ -161,6 +161,28 @@ func (e *exEng) AddSubmitOrderToBatch(order *types.OrderSubmission, party string return nil } +func (e *exEng) AddCancelOrderToBatch(order *types.OrderCancellation, party string) error { + if e.batch == nil { + return ErrBatchInstructionNotStarted + } + if e.batch.party != party { + return ErrBatchInstructionStartedWithDifferentParty + } + e.batch.bmi.Cancellations = append(e.batch.bmi.Cancellations, order.IntoProto()) + return nil +} + +func (e *exEng) AddAmendOrderToBatch(order *types.OrderAmendment, party string) error { + if e.batch == nil { + return ErrBatchInstructionNotStarted + } + if e.batch.party != party { + return ErrBatchInstructionStartedWithDifferentParty + } + e.batch.bmi.Amendments = append(e.batch.bmi.Amendments, order.IntoProto()) + return nil +} + func (e *exEng) ProcessBatch(ctx context.Context, party string) error { if e.batch == nil { return ErrBatchInstructionNotStarted diff --git a/core/integration/features/auctions/opening-auction-expiry.feature b/core/integration/features/auctions/opening-auction-expiry.feature index 4baffc7d78..a1e194952c 100644 --- a/core/integration/features/auctions/opening-auction-expiry.feature +++ b/core/integration/features/auctions/opening-auction-expiry.feature @@ -6,7 +6,7 @@ Feature: Set up a market, create indiciative price different to actual opening a | 0.1 | 0.1 | 2 | -3 | 0.2 | Given 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/DEC19 | BTC | BTC | my-simple-risk-model | default-margin-calculator | 5 | default-none | default-basic | default-eth-for-future | 0.25 | 0 | default-futures | + | ETH/DEC19 | BTC | ETH | my-simple-risk-model | default-margin-calculator | 5 | default-none | default-basic | default-eth-for-future | 0.25 | 0 | default-futures | And the following network parameters are set: | name | value | | market.auction.minimumDuration | 5 | @@ -16,41 +16,72 @@ Feature: Set up a market, create indiciative price different to actual opening a | limits.markets.maxPeggedOrders | 2 | @DebugAuctionMax @Expires - Scenario: Simple test verifying the market is cancelled if it failes to leave opening auction + Scenario: 0043-MKTL-012 Simple test verifying the market is cancelled if it failes to leave opening auction # setup accounts Given the parties deposit on asset's general account the following amount: - | party | asset | amount | - | party1 | BTC | 100000000 | - | party2 | BTC | 100000000 | - | party3 | BTC | 100000000 | - | party4 | BTC | 100000000 | - | party5 | BTC | 100000000 | - | party6 | BTC | 100000000 | - | party7 | BTC | 100000000 | - | lpprov | BTC | 100000000 | + | party | asset | amount | + | party1 | ETH | 100000 | + | party5 | ETH | 10000 | + | party6 | ETH | 10000 | + | lpprov | ETH | 10000 | # Start market with some dead time And the network moves ahead "5" blocks + Then the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | party1 | party1 | ETH/DEC19 | 30000 | 0.1 | submission | + Then the market data for the market "ETH/DEC19" should be: | trading mode | | TRADING_MODE_OPENING_AUCTION | # Ensure an indicative price/volume of 10, although we will not uncross at this price point And the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | reference | - | party6 | ETH/DEC19 | buy | 1 | 10 | 0 | TYPE_LIMIT | TIF_GFA | t6-b-1 | + | party6 | ETH/DEC19 | buy | 1 | 20 | 0 | TYPE_LIMIT | TIF_GFA | t6-b-1 | When the network moves ahead "1" blocks Then the market data for the market "ETH/DEC19" should be: | trading mode | | TRADING_MODE_OPENING_AUCTION | And the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | reference | - | party5 | ETH/DEC19 | buy | 1 | 10 | 0 | TYPE_LIMIT | TIF_GFA | t5-s-1 | + | party5 | ETH/DEC19 | sell | 1 | 21 | 0 | TYPE_LIMIT | TIF_GFA | t5-s-1 | # place orders to set the actual price point at which we'll uncross to be 10000 When the network moves ahead "1" blocks Then the market data for the market "ETH/DEC19" should be: | trading mode | | TRADING_MODE_OPENING_AUCTION | + + Then the parties should have the following account balances: + | party | asset | market id | margin | general | bond | + | party1 | ETH | ETH/DEC19 | 0 | 70000 | 30000 | + | party5 | ETH | ETH/DEC19 | 3 | 9997 | | + | party6 | ETH | ETH/DEC19 | 2 | 9998 | | When the network moves ahead "10" blocks # Now the market should be cancelled Then the last market state should be "STATE_CANCELLED" for the market "ETH/DEC19" + + #orders are cancelled + And the orders should have the following status: + | party | reference | status | + | party5 | t5-s-1 | STATUS_CANCELLED | + | party6 | t6-b-1 | STATUS_CANCELLED | + + #asset is released for party with orders and LP commitment + Then "party1" should have general account balance of "100000" for asset "ETH" + Then "party5" should have general account balance of "10000" for asset "ETH" + Then "party6" should have general account balance of "10000" for asset "ETH" + + # Then debug transfers + # check transfers for asset releasing + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | party1 | party1 | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_GENERAL | ETH/DEC19 | 30000 | ETH | + + Then the parties should have the following account balances: + | party | asset | market id | margin | general | bond | + | party1 | ETH | ETH/DEC19 | 0 | 100000 | 0 | + | party5 | ETH | ETH/DEC19 | 0 | 10000 | | + | party6 | ETH | ETH/DEC19 | 0 | 10000 | | + + diff --git a/core/integration/features/auctions/opening-auction-price-manipulation.feature b/core/integration/features/auctions/opening-auction-price-manipulation.feature new file mode 100644 index 0000000000..cece77e1bb --- /dev/null +++ b/core/integration/features/auctions/opening-auction-price-manipulation.feature @@ -0,0 +1,80 @@ +Feature: Set up a market with an opening auction manipulate price to low level with low collateral, move price to higher level, manipulator orders should get cancelled + + Background: + + Given 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/DEC19 | BTC | BTC | default-simple-risk-model-4 | default-margin-calculator | 10 | default-none | default-none | default-eth-for-future | 0.25 | 0 | default-futures | + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | manipulator1 | BTC | 3 | + | manipulator2 | BTC | 3 | + | party3 | BTC | 100000000 | + | party4 | BTC | 100000000 | + | party5 | BTC | 100000000 | + And the following network parameters are set: + | name | value | + | limits.markets.maxPeggedOrders | 2 | + | network.markPriceUpdateMaximumFrequency | 1s | + + Scenario: + When the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | manipulator1 | ETH/DEC19 | buy | 10 | 2 | 0 | TYPE_LIMIT | TIF_GTC | mani-1 | + | manipulator2 | ETH/DEC19 | sell | 10 | 2 | 0 | TYPE_LIMIT | TIF_GTC | mani-2 | + Then the parties should have the following margin levels: + | party | market id | maintenance | + | manipulator1 | ETH/DEC19 | 2 | + | manipulator2 | ETH/DEC19 | 2 | + And the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | manipulator1 | ETH/DEC19 | mani-1 | buy | 10 | 10 | 2 | STATUS_ACTIVE | + | manipulator2 | ETH/DEC19 | mani-2 | sell | 10 | 10 | 2 | STATUS_ACTIVE | + And the market data for the market "ETH/DEC19" should be: + | trading mode | open interest | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 0 | 2 | 10 | + + + When the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | ETH/DEC19 | buy | 20 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/DEC19 | sell | 20 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + Then the parties should have the following margin levels: + | party | market id | maintenance | + | manipulator1 | ETH/DEC19 | 2 | + | manipulator2 | ETH/DEC19 | 2 | + | party3 | ETH/DEC19 | 200 | + | party4 | ETH/DEC19 | 200 | + Then the market data for the market "ETH/DEC19" should be: + | trading mode | open interest | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 0 | 100 | 20 | + + # 0019-MCAL-234 + When the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/DEC19 | buy | 10 | 3 | 0 | TYPE_LIMIT | TIF_GTC | + Then the parties should have the following margin levels: + | party | market id | maintenance | + | party5 | ETH/DEC19 | 100 | + + When the network moves ahead "5" blocks + Then the parties should have the following margin levels: + | party | market id | maintenance | + | manipulator1 | ETH/DEC19 | 2 | + | manipulator2 | ETH/DEC19 | 2 | + | party3 | ETH/DEC19 | 200 | + | party4 | ETH/DEC19 | 200 | + And the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | manipulator1 | ETH/DEC19 | mani-1 | buy | 10 | 10 | 2 | STATUS_ACTIVE | + | manipulator2 | ETH/DEC19 | mani-2 | sell | 10 | 10 | 2 | STATUS_ACTIVE | + + When the network moves ahead "11" blocks + Then the market data for the market "ETH/DEC19" should be: + | trading mode | open interest | + | TRADING_MODE_CONTINUOUS | 20 | + Then debug orders + And the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | manipulator1 | ETH/DEC19 | mani-1 | buy | 10 | 10 | 2 | STATUS_STOPPED | + | manipulator2 | ETH/DEC19 | mani-2 | sell | 10 | 0 | 2 | STATUS_FILLED | diff --git a/core/integration/features/auctions/opening-auction-price.feature b/core/integration/features/auctions/opening-auction-price.feature index 6e4146b87b..7d773ba2f5 100644 --- a/core/integration/features/auctions/opening-auction-price.feature +++ b/core/integration/features/auctions/opening-auction-price.feature @@ -69,13 +69,13 @@ Feature: Set up a market, create indiciative price different to actual opening a | party2 | ETH/DEC19 | sell | 3 | 3000 | 0 | TYPE_LIMIT | TIF_GFA | t2-s-3 | | party7 | ETH/DEC19 | sell | 1 | 11000 | 0 | TYPE_LIMIT | TIF_GFA | t7-s-1 | And the parties should have the following margin levels: - | party | market id | maintenance | search | initial | release | - | party1 | ETH/DEC19 | 11200 | 12320 | 13440 | 15680 | - | party2 | ETH/DEC19 | 10901 | 11991 | 13081 | 15261 | + | party | market id | maintenance | + | party1 | ETH/DEC19 | 14000 | + | party2 | ETH/DEC19 | 13000 | And the parties should have the following account balances: | party | asset | market id | margin | general | - | party1 | BTC | ETH/DEC19 | 13440 | 99986560 | - | party2 | BTC | ETH/DEC19 | 13081 | 99986919 | + | party1 | BTC | ETH/DEC19 | 16800 | 99983200 | + | party2 | BTC | ETH/DEC19 | 15600 | 99984400 | When the opening auction period ends for market "ETH/DEC19" Then the following trades should be executed: | buyer | price | size | seller | @@ -146,13 +146,13 @@ Feature: Set up a market, create indiciative price different to actual opening a | lpprov | ETH/DEC19 | 2 | 1 | buy | MID | 50 | 100 | | lpprov | ETH/DEC19 | 2 | 1 | sell | MID | 50 | 100 | Then the parties should have the following margin levels: - | party | market id | maintenance | search | initial | release | - | party1 | ETH/DEC19 | 11200 | 12320 | 13440 | 15680 | - | party2 | ETH/DEC19 | 10901 | 11991 | 13081 | 15261 | + | party | market id | maintenance | + | party1 | ETH/DEC19 | 14000 | + | party2 | ETH/DEC19 | 13000 | And the parties should have the following account balances: | party | asset | market id | margin | general | - | party1 | BTC | ETH/DEC19 | 13440 | 99986560 | - | party2 | BTC | ETH/DEC19 | 13081 | 99986919 | + | party1 | BTC | ETH/DEC19 | 16800 | 99983200 | + | party2 | BTC | ETH/DEC19 | 15600 | 99984400 | # moves forwards several blocks When the opening auction period ends for market "ETH/DEC19" ## We're seeing these events twice for some reason @@ -227,13 +227,13 @@ Feature: Set up a market, create indiciative price different to actual opening a | party1 | ETH/DEC19 | buy | 4 | 3000 | 0 | TYPE_LIMIT | TIF_GFA | t1-b-3 | | party2 | ETH/DEC19 | sell | 3 | 3000 | 0 | TYPE_LIMIT | TIF_GFA | t2-s-3 | And the parties should have the following margin levels: - | party | market id | maintenance | search | initial | release | - | party1 | ETH/DEC19 | 11200 | 12320 | 13440 | 15680 | - | party2 | ETH/DEC19 | 10901 | 11991 | 13081 | 15261 | + | party | market id | maintenance | + | party1 | ETH/DEC19 | 14000 | + | party2 | ETH/DEC19 | 13000 | And the parties should have the following account balances: | party | asset | market id | margin | general | - | party1 | BTC | ETH/DEC19 | 13440 | 99986560 | - | party2 | BTC | ETH/DEC19 | 13081 | 99986919 | + | party1 | BTC | ETH/DEC19 | 16800 | 99983200 | + | party2 | BTC | ETH/DEC19 | 15600 | 99984400 | When the opening auction period ends for market "ETH/DEC19" ## We're seeing these events twice for some reason Then the following trades should be executed: @@ -316,12 +316,12 @@ Feature: Set up a market, create indiciative price different to actual opening a | party1 | ETH/DEC19 | buy | 4 | 3000 | 0 | TYPE_LIMIT | TIF_GFA | t1-b-3 | | party2 | ETH/DEC19 | sell | 3 | 3000 | 0 | TYPE_LIMIT | TIF_GFA | t2-s-3 | And the parties should have the following margin levels: - | party | market id | maintenance | search | initial | release | - | party2 | ETH/DEC19 | 10901 | 11991 | 13081 | 15261 | + | party | market id | maintenance | + | party2 | ETH/DEC19 | 13000 | And the parties should have the following account balances: | party | asset | market id | margin | general | - | party1 | BTC | ETH/DEC19 | 13440 | 99986560 | - | party2 | BTC | ETH/DEC19 | 13081 | 99986919 | + | party1 | BTC | ETH/DEC19 | 16800 | 99983200 | + | party2 | BTC | ETH/DEC19 | 15600 | 99984400 | # values before uint #| party1 | BTC | ETH/DEC19 | 30241 | 99969759 | When the opening auction period ends for market "ETH/DEC19" diff --git a/core/integration/features/auctions/opening-auction-uncross.feature b/core/integration/features/auctions/opening-auction-uncross.feature index ee425306c4..f61ef0229f 100644 --- a/core/integration/features/auctions/opening-auction-uncross.feature +++ b/core/integration/features/auctions/opening-auction-uncross.feature @@ -37,21 +37,21 @@ Feature: Set up a market, with an opening auction, then uncross the book | lpprov | ETH/DEC19 | 2 | 1 | buy | MID | 50 | 100 | | lpprov | ETH/DEC19 | 2 | 1 | sell | MID | 50 | 100 | Then the parties should have the following margin levels: - | party | market id | maintenance | search | initial | release | - | party1 | ETH/DEC19 | 11200 | 12320 | 13440 | 15680 | - | party2 | ETH/DEC19 | 10901 | 11991 | 13081 | 15261 | + | party | market id | maintenance | + | party1 | ETH/DEC19 | 14000 | + | party2 | ETH/DEC19 | 13000 | Then the parties should have the following account balances: | party | asset | market id | margin | general | - | party1 | BTC | ETH/DEC19 | 13440 | 99986560 | - | party2 | BTC | ETH/DEC19 | 13081 | 99986919 | + | party1 | BTC | ETH/DEC19 | 16800 | 99983200 | + | party2 | BTC | ETH/DEC19 | 15600 | 99984400 | When the parties withdraw the following assets: | party | asset | amount | | party1 | BTC | 99949760 | | party2 | BTC | 99951320 | Then the parties should have the following account balances: | party | asset | market id | margin | general | - | party1 | BTC | ETH/DEC19 | 13440 | 36800 | - | party2 | BTC | ETH/DEC19 | 13081 | 35599 | + | party1 | BTC | ETH/DEC19 | 16800 | 33440 | + | party2 | BTC | ETH/DEC19 | 15600 | 33080 | Then the opening auction period ends for market "ETH/DEC19" And the following trades should be executed: | buyer | price | size | seller | @@ -187,3 +187,19 @@ Feature: Set up a market, with an opening auction, then uncross the book | buy | 900 | 1 | | buy | 899 | 100000 | | buy | 850 | 106 | + +Scenario: max volume doesn't come from best bid and ask only + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/DEC19 | buy | 2 | 99 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/DEC19 | sell | 2 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | party3 | ETH/DEC19 | buy | 3 | 90 | 0 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/DEC19 | sell | 3 | 7 | 0 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/DEC19" should be: + | indicative price | indicative volume | + | 48 | 5 | + + When the opening auction period ends for market "ETH/DEC19" + Then the market data for the market "ETH/DEC19" should be: + | mark price | open interest | + | 48 | 5 | \ No newline at end of file diff --git a/core/integration/features/closeouts/0012-POSR-009.feature b/core/integration/features/closeouts/0012-POSR-009.feature index 72cf1b3ce6..f6c6026bb9 100644 --- a/core/integration/features/closeouts/0012-POSR-009.feature +++ b/core/integration/features/closeouts/0012-POSR-009.feature @@ -2,8 +2,8 @@ Feature: When a party is distressed and gets closed out the network's position g Background: Given the liquidation strategies: - | name | disposal step | disposal fraction | full disposal size | max fraction consumed | - | disposal-strat | 10 | 1.0 | 1000 | 1.0 | + | name | disposal step | disposal fraction | full disposal size | max fraction consumed | disposal slippage range | + | disposal-strat | 10 | 1.0 | 1000 | 1.0 | 0.1 | Given 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 | liquidation strategy | @@ -13,7 +13,6 @@ Feature: When a party is distressed and gets closed out the network's position g | market.auction.minimumDuration | 1 | | network.markPriceUpdateMaximumFrequency | 0s | - @NoPerp Scenario: Implement trade and order network # setup accounts Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/closeouts/0012-POSR-010.feature b/core/integration/features/closeouts/0012-POSR-010.feature index 57a39148ef..0ba0bd12f6 100644 --- a/core/integration/features/closeouts/0012-POSR-010.feature +++ b/core/integration/features/closeouts/0012-POSR-010.feature @@ -3,8 +3,8 @@ Feature: When the network party holds a non-zero position and there are not enou Background: Given the liquidation strategies: - | name | disposal step | disposal fraction | full disposal size | max fraction consumed | - | disposal-strat | 1000 | 1.0 | 1000 | 1.0 | + | name | disposal step | disposal fraction | full disposal size | max fraction consumed | disposal slippage range | + | disposal-strat | 1000 | 1.0 | 1000 | 1.0 | 0.1 | Given 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 | liquidation strategy | @@ -14,7 +14,6 @@ Feature: When the network party holds a non-zero position and there are not enou | market.auction.minimumDuration | 1 | | network.markPriceUpdateMaximumFrequency | 0s | - @NoPerp Scenario: Implement trade and order network. Covers both 0012-POSR-012 and 0012-POSR-011 # setup accounts Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/closeouts/0012-POSR-031.feature b/core/integration/features/closeouts/0012-POSR-031.feature new file mode 100644 index 0000000000..09a392729e --- /dev/null +++ b/core/integration/features/closeouts/0012-POSR-031.feature @@ -0,0 +1,114 @@ +Feature: Covers 0012-POSR-031 + + Background: + # disposal strategy every 5 seconds, 20% until 10 or less, max 10% of the book used, slippage is set to 10 so price range is always wide enough + Given the liquidation strategies: + | name | disposal step | disposal fraction | full disposal size | max fraction consumed | disposal slippage range | + | disposal-strat-1 | 5 | 0.2 | 10 | 1 | 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 | liquidation strategy | + | ETH/DEC19 | BTC | BTC | default-simple-risk-model-4 | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 0.25 | 0 | default-futures | disposal-strat-1 | + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 2 | + + Scenario: A network disposal order can not cross with orders outside the disposal price range. + # setup accounts + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | tt_4 | BTC | 500000 | + | tt_5 | BTC | 100 | + | tt_6 | BTC | 100000000 | + | tt_10 | BTC | 10000000 | + | tt_11 | BTC | 10000000 | + | tt_aux | BTC | 100000000 | + | t2_aux | BTC | 100000000 | + | lpprov | BTC | 100000000 | + + # place auxiliary orders so we always have best bid and best offer as to not trigger the liquidity auction + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | tt_aux | ETH/DEC19 | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | aux-b-1 | + | tt_aux | ETH/DEC19 | sell | 1 | 200 | 0 | TYPE_LIMIT | TIF_GTC | aux-s-1 | + | t2_aux | ETH/DEC19 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | aux-b-2 | + | tt_aux | ETH/DEC19 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | aux-s-2 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | ETH/DEC19 | 90000 | 0.1 | submission | + | lp1 | lpprov | ETH/DEC19 | 90000 | 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/DEC19 | 2 | 1 | buy | MID | 50 | 100 | + | lpprov | ETH/DEC19 | 2 | 1 | sell | MID | 50 | 100 | + Then the opening auction period ends for market "ETH/DEC19" + + # place orders and generate trades, do not progress time + When the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | reference | expires in | + | tt_10 | ETH/DEC19 | buy | 5 | 100 | 0 | TYPE_LIMIT | TIF_GTT | tt_10-1 | 3600 | + | tt_11 | ETH/DEC19 | sell | 5 | 100 | 1 | TYPE_LIMIT | TIF_GTT | tt_11-1 | 3600 | + | tt_4 | ETH/DEC19 | buy | 2 | 150 | 0 | TYPE_LIMIT | TIF_GTC | tt_4-1 | | + | tt_4 | ETH/DEC19 | buy | 2 | 150 | 0 | TYPE_LIMIT | TIF_GTC | tt_4-2 | | + | tt_5 | ETH/DEC19 | buy | 2 | 150 | 0 | TYPE_LIMIT | TIF_GTC | tt_5-1 | | + | tt_6 | ETH/DEC19 | sell | 2 | 150 | 1 | TYPE_LIMIT | TIF_GTC | tt_6-1 | | + | tt_5 | ETH/DEC19 | buy | 2 | 150 | 0 | TYPE_LIMIT | TIF_GTC | tt_5-2 | | + | tt_6 | ETH/DEC19 | sell | 2 | 150 | 1 | TYPE_LIMIT | TIF_GTC | tt_6-2 | | + | tt_10 | ETH/DEC19 | buy | 25 | 100 | 0 | TYPE_LIMIT | TIF_GTC | tt_10-2 | | + | tt_11 | ETH/DEC19 | sell | 25 | 0 | 3 | TYPE_MARKET | TIF_FOK | tt_11-2 | | + + And the mark price should be "100" for the market "ETH/DEC19" + + # checking margins + Then the parties should have the following account balances: + | party | asset | market id | margin | general | + | tt_5 | BTC | ETH/DEC19 | 0 | 0 | + + # then we make sure the insurance pool collected the funds + And the insurance pool balance should be "0" for the market "ETH/DEC19" + + #check positions + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | + | tt_4 | 4 | -200 | 0 | + | tt_5 | 0 | 0 | -100 | + | tt_6 | -4 | 200 | -27 | + | tt_10 | 26 | 0 | 0 | + | tt_11 | -30 | 200 | -65 | + | network | 4 | 0 | 0 | + + # some time passes, position network still hasn't been closed/disposed of + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | + | tt_4 | 4 | -200 | 0 | + | tt_5 | 0 | 0 | -100 | + | tt_6 | -4 | 200 | -27 | + | tt_10 | 26 | 0 | 0 | + | tt_11 | -30 | 200 | -65 | + | network | 4 | 0 | 0 | + # clear trade events to ensure that we are not picking up a closeout trade that happened before the disposal step expires + And clear trade events + # move mid price + create an order within the 10% range + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | tt_6 | ETH/DEC19 | sell | 2 | 150 | 0 | TYPE_LIMIT | TIF_GTC | tt_10-2 | + | tt_10 | ETH/DEC19 | buy | 4 | 126 | 0 | TYPE_LIMIT | TIF_GTC | tt_10-2 | + + + + # some time passes, now the network disposes of its position + When the network moves ahead "5" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | + | tt_4 | 4 | -200 | 0 | + | tt_5 | 0 | 0 | -100 | + | tt_6 | -4 | 200 | -27 | + | tt_10 | 30 | -104 | 0 | + | tt_11 | -30 | 200 | -65 | + | network | 0 | 0 | 104 | + And the following network trades should be executed: + | party | aggressor side | volume | + | tt_10 | sell | 4 | + diff --git a/core/integration/features/closeouts/0012-POSR-033.feature b/core/integration/features/closeouts/0012-POSR-033.feature new file mode 100644 index 0000000000..156165350a --- /dev/null +++ b/core/integration/features/closeouts/0012-POSR-033.feature @@ -0,0 +1,132 @@ +Feature: Covers 0012-POSR-033 + + Background: + # disposal strategy every 5 seconds, 20% until 10 or less, max 10% of the book used, slippage is set to 10 so price range is always wide enough + Given 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 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 | liquidation strategy | + | ETH/DEC19 | BTC | BTC | default-simple-risk-model-4 | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 0.25 | 0 | default-futures | disposal-strat-1 | + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 2 | + + Scenario: When calculating the available volume, volume outside the disposal price range should not be considered. + # setup accounts + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | tt_4 | BTC | 500000 | + | tt_5 | BTC | 100 | + | tt_6 | BTC | 100000000 | + | tt_10 | BTC | 10000000 | + | tt_11 | BTC | 10000000 | + | tt_aux | BTC | 100000000 | + | t2_aux | BTC | 100000000 | + | lpprov | BTC | 100000000 | + + # place auxiliary orders so we always have best bid and best offer as to not trigger the liquidity auction + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | tt_aux | ETH/DEC19 | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | aux-b-1 | + | tt_aux | ETH/DEC19 | sell | 1 | 200 | 0 | TYPE_LIMIT | TIF_GTC | aux-s-1 | + | t2_aux | ETH/DEC19 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | aux-b-2 | + | tt_aux | ETH/DEC19 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | aux-s-2 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | ETH/DEC19 | 90000 | 0.1 | submission | + | lp1 | lpprov | ETH/DEC19 | 90000 | 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/DEC19 | 2 | 1 | buy | MID | 50 | 100 | + | lpprov | ETH/DEC19 | 2 | 1 | sell | MID | 50 | 100 | + Then the opening auction period ends for market "ETH/DEC19" + + # place orders and generate trades, do not progress time + When the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | reference | expires in | + | tt_10 | ETH/DEC19 | buy | 5 | 100 | 0 | TYPE_LIMIT | TIF_GTT | tt_10-1 | 3600 | + | tt_11 | ETH/DEC19 | sell | 5 | 100 | 1 | TYPE_LIMIT | TIF_GTT | tt_11-1 | 3600 | + | tt_4 | ETH/DEC19 | buy | 2 | 150 | 0 | TYPE_LIMIT | TIF_GTC | tt_4-1 | | + | tt_4 | ETH/DEC19 | buy | 2 | 150 | 0 | TYPE_LIMIT | TIF_GTC | tt_4-2 | | + | tt_5 | ETH/DEC19 | buy | 2 | 150 | 0 | TYPE_LIMIT | TIF_GTC | tt_5-1 | | + | tt_6 | ETH/DEC19 | sell | 2 | 150 | 1 | TYPE_LIMIT | TIF_GTC | tt_6-1 | | + | tt_5 | ETH/DEC19 | buy | 2 | 150 | 0 | TYPE_LIMIT | TIF_GTC | tt_5-2 | | + | tt_6 | ETH/DEC19 | sell | 2 | 150 | 1 | TYPE_LIMIT | TIF_GTC | tt_6-2 | | + | tt_10 | ETH/DEC19 | buy | 25 | 100 | 0 | TYPE_LIMIT | TIF_GTC | tt_10-2 | | + | tt_11 | ETH/DEC19 | sell | 25 | 0 | 3 | TYPE_MARKET | TIF_FOK | tt_11-2 | | + + And the mark price should be "100" for the market "ETH/DEC19" + + # checking margins + Then the parties should have the following account balances: + | party | asset | market id | margin | general | + | tt_5 | BTC | ETH/DEC19 | 0 | 0 | + + # then we make sure the insurance pool collected the funds + And the insurance pool balance should be "0" for the market "ETH/DEC19" + + #check positions + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | + | tt_4 | 4 | -200 | 0 | + | tt_5 | 0 | 0 | -100 | + | tt_6 | -4 | 200 | -27 | + | tt_10 | 26 | 0 | 0 | + | tt_11 | -30 | 200 | -65 | + | network | 4 | 0 | 0 | + + # some time passes, position network still hasn't been closed/disposed of + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | + | tt_4 | 4 | -200 | 0 | + | tt_5 | 0 | 0 | -100 | + | tt_6 | -4 | 200 | -27 | + | tt_10 | 26 | 0 | 0 | + | tt_11 | -30 | 200 | -65 | + | network | 4 | 0 | 0 | + # clear trade events to ensure that we are not picking up a closeout trade that happened before the disposal step expires + And clear trade events + # move mid price + create an order within the 10% range, max fraction is 0.5, so we expect half of the volume to trade + # The book has much, much move volume, but we only check the volume in the available range + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | tt_6 | ETH/DEC19 | sell | 2 | 150 | 0 | TYPE_LIMIT | TIF_GTC | tt_10-2 | + | tt_10 | ETH/DEC19 | buy | 4 | 126 | 0 | TYPE_LIMIT | TIF_GTC | tt_10-2 | + + + + # some time passes, now the network disposes of its position + When the network moves ahead "5" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | + | tt_4 | 4 | -200 | 0 | + | tt_5 | 0 | 0 | -100 | + | tt_6 | -4 | 200 | -27 | + | tt_10 | 28 | -52 | 0 | + | tt_11 | -30 | 200 | -65 | + | network | 2 | 0 | 52 | + # Disposal fraction == 0.5, only a half of which trades + And the following network trades should be executed: + | party | aggressor side | volume | + | tt_10 | sell | 2 | + + + # Next closeout check -> the network trades again, but only consumes half again, so we expect a volume of 1 + When the network moves ahead "6" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | + | tt_4 | 4 | -200 | 0 | + | tt_5 | 0 | 0 | -100 | + | tt_6 | -4 | 200 | -27 | + | tt_10 | 29 | -78 | 0 | + | tt_11 | -30 | 200 | -65 | + | network | 1 | 0 | 78 | + # Disposal fraction == 0.5, only a half of which trades + And the following network trades should be executed: + | party | aggressor side | volume | + | tt_10 | sell | 1 | + diff --git a/core/integration/features/closeouts/1847-closeout-long-with-fees.feature b/core/integration/features/closeouts/1847-closeout-long-with-fees.feature index a6554adeee..0ba8460481 100644 --- a/core/integration/features/closeouts/1847-closeout-long-with-fees.feature +++ b/core/integration/features/closeouts/1847-closeout-long-with-fees.feature @@ -14,7 +14,7 @@ Feature: Long close-out test (see ln 293 of system-tests/grpc/trading/tradesTest | network.markPriceUpdateMaximumFrequency | 0s | | limits.markets.maxPeggedOrders | 2 | - @Liquidation @NoPerp + @Liquidation Scenario: https://drive.google.com/file/d/1bYWbNJvG7E-tcqsK26JMu2uGwaqXqm0L/view # setup accounts Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/closeouts/1847-closeout-long.feature b/core/integration/features/closeouts/1847-closeout-long.feature index 8c69dd77e7..4c8e71b82c 100644 --- a/core/integration/features/closeouts/1847-closeout-long.feature +++ b/core/integration/features/closeouts/1847-closeout-long.feature @@ -10,7 +10,6 @@ Feature: Long close-out test (see ln 293 of system-tests/grpc/trading/tradesTest | network.markPriceUpdateMaximumFrequency | 0s | | limits.markets.maxPeggedOrders | 2 | - @NoPerp Scenario: https://drive.google.com/file/d/1bYWbNJvG7E-tcqsK26JMu2uGwaqXqm0L/view # setup accounts Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/closeouts/1847-closeout-short-with-fees.feature b/core/integration/features/closeouts/1847-closeout-short-with-fees.feature index 677d27839c..140e4700a6 100644 --- a/core/integration/features/closeouts/1847-closeout-short-with-fees.feature +++ b/core/integration/features/closeouts/1847-closeout-short-with-fees.feature @@ -14,7 +14,7 @@ Feature: Short close-out test (see ln 449 of system-tests/grpc/trading/tradesTes | network.markPriceUpdateMaximumFrequency | 0s | | limits.markets.maxPeggedOrders | 2 | - @Liquidation @NoPerp + @Liquidation Scenario: https://drive.google.com/file/d/1bYWbNJvG7E-tcqsK26JMu2uGwaqXqm0L/view # setup accounts Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/closeouts/1847-closeout-short.feature b/core/integration/features/closeouts/1847-closeout-short.feature index 74d1ebdd2b..98c6744c70 100644 --- a/core/integration/features/closeouts/1847-closeout-short.feature +++ b/core/integration/features/closeouts/1847-closeout-short.feature @@ -11,7 +11,6 @@ Feature: Short close-out test (see ln 449 of system-tests/grpc/trading/tradesTes | network.markPriceUpdateMaximumFrequency | 0s | | limits.markets.maxPeggedOrders | 2 | - @NoPerp Scenario: https://drive.google.com/file/d/1bYWbNJvG7E-tcqsK26JMu2uGwaqXqm0L/view # setup accounts Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/closeouts/630-position-resolution-negative-insurance-pool.feature b/core/integration/features/closeouts/630-position-resolution-negative-insurance-pool.feature index 9a11ae776a..94d4d604ea 100644 --- a/core/integration/features/closeouts/630-position-resolution-negative-insurance-pool.feature +++ b/core/integration/features/closeouts/630-position-resolution-negative-insurance-pool.feature @@ -10,7 +10,7 @@ Feature: Regression test for issue 630 | network.markPriceUpdateMaximumFrequency | 0s | | limits.markets.maxPeggedOrders | 2 | - @Liquidation @NoPerp + @Liquidation Scenario: Trader is being closed out. # setup accounts Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/closeouts/closeout-long-with-custom-strategy.feature b/core/integration/features/closeouts/closeout-long-with-custom-strategy.feature index 4b7a7e9a6b..76dc1cafcd 100644 --- a/core/integration/features/closeouts/closeout-long-with-custom-strategy.feature +++ b/core/integration/features/closeouts/closeout-long-with-custom-strategy.feature @@ -1,10 +1,10 @@ Feature: Same as 1847-closeout-long test, but with a custom liquidation strategy in place Background: - # disposal strategy every 5 seconds, 20% until 10 or less, max 10% of the book used + # disposal strategy every 5 seconds, 20% until 10 or less, max 10% of the book used, slippage is set to 10 so price range is always wide enough Given the liquidation strategies: - | name | disposal step | disposal fraction | full disposal size | max fraction consumed | - | disposal-strat-1 | 5 | 0.2 | 10 | 0.1 | + | name | disposal step | disposal fraction | full disposal size | max fraction consumed | disposal slippage range | + | disposal-strat-1 | 5 | 0.2 | 10 | 0.1 | 10 | 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 | liquidation strategy | | ETH/DEC19 | BTC | BTC | default-simple-risk-model-4 | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 0.25 | 0 | default-futures | disposal-strat-1 | @@ -14,7 +14,7 @@ Feature: Same as 1847-closeout-long test, but with a custom liquidation strategy | network.markPriceUpdateMaximumFrequency | 0s | | limits.markets.maxPeggedOrders | 2 | - @NoPerp @DisposalStrat + @DisposalStrat Scenario: https://drive.google.com/file/d/1bYWbNJvG7E-tcqsK26JMu2uGwaqXqm0L/view # setup accounts Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/closeouts/distressed-safe-event.feature b/core/integration/features/closeouts/distressed-safe-event.feature index e0a1a79b33..4c747eebd4 100644 --- a/core/integration/features/closeouts/distressed-safe-event.feature +++ b/core/integration/features/closeouts/distressed-safe-event.feature @@ -10,7 +10,7 @@ Feature: Ensure distressed status events are correctly emitted, both for safe an | market.auction.minimumDuration | 1 | | network.markPriceUpdateMaximumFrequency | 0s | - @CloseOut @Liquidation @NoPerp + @CloseOut @Liquidation Scenario: Implement trade and order network # setup accounts Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/closeouts/network-order-and-trades-sub.feature b/core/integration/features/closeouts/network-order-and-trades-sub.feature index a295a64dcb..40356b3ddc 100644 --- a/core/integration/features/closeouts/network-order-and-trades-sub.feature +++ b/core/integration/features/closeouts/network-order-and-trades-sub.feature @@ -10,7 +10,6 @@ Feature: Ensure network party are generated | market.auction.minimumDuration | 1 | | network.markPriceUpdateMaximumFrequency | 0s | - @NoPerp Scenario: Implement trade and order network # setup accounts Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/closeouts/position-resolution-after-auction.feature b/core/integration/features/closeouts/position-resolution-after-auction.feature index 817dcc4fed..1b5cba0f51 100644 --- a/core/integration/features/closeouts/position-resolution-after-auction.feature +++ b/core/integration/features/closeouts/position-resolution-after-auction.feature @@ -16,7 +16,7 @@ Feature: Set up a market with an opening auction, then uncross the book so that | name | value | | limits.markets.maxPeggedOrders | 2 | - @Liquidation @NoPerp + @Liquidation Scenario: When the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | reference | @@ -37,11 +37,11 @@ Feature: Set up a market with an opening auction, then uncross the book so that | lp | ETH/DEC19 | 27 | 1 | buy | MID | 36 | 100 | | lp | ETH/DEC19 | 27 | 1 | sell | MID | 27 | 100 | Then the parties should have the following margin levels: - | party | market id | maintenance | search | initial | release | - | party1 | ETH/DEC19 | 11200 | 12320 | 13440 | 15680 | + | party | market id | maintenance | + | party1 | ETH/DEC19 | 14000 | And the parties should have the following account balances: | party | asset | market id | margin | general | - | party1 | BTC | ETH/DEC19 | 13440 | 6560 | + | party1 | BTC | ETH/DEC19 | 16800 | 3200 | When the opening auction period ends for market "ETH/DEC19" Then the market data for the market "ETH/DEC19" should be: | mark price | trading mode | auction trigger | extension trigger | target stake | supplied stake | open interest | diff --git a/core/integration/features/fees/trading-fees-pdp.feature b/core/integration/features/fees/trading-fees-pdp.feature index 27de1020f6..c314735b8a 100644 --- a/core/integration/features/fees/trading-fees-pdp.feature +++ b/core/integration/features/fees/trading-fees-pdp.feature @@ -651,7 +651,6 @@ Feature: Fees calculations | trader3 | ETH | ETH/DEC21 | 240 | 9999766 | | trader4 | ETH | ETH/DEC21 | 104 | 0 | - @NoPerp Scenario: WIP - Testing fees in continuous trading when insufficient balance in their general and margin account with LP, then the trade does not execute # - Just need to confirm if the trades doesn't go through, then general and margin account balances are expected to be 0. # - Also need to confirm if all 4 internal levels of margin should be 0, as in another case where the trade shouldn't be going through it's non-zero @@ -675,7 +674,7 @@ Feature: Fees calculations | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | position decimal places | linear slippage factor | quadratic slippage factor | sla params | | ETH/DEC21 | ETH | ETH | simple-risk-model-1 | default-margin-calculator | 2 | fees-config-1 | price-monitoring | default-eth-for-future | 2 | 0.25 | 0 | SLA | And the following network parameters are set: - | name | value | + | name | value | | market.liquidity.providersFeeCalculationTimeStep | 10s | # setup accounts @@ -1037,7 +1036,6 @@ Feature: Fees calculations | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | - @NoPerp Scenario: Testing fees in Price auction session trading with insufficient balance in their general and margin account, then the trade still goes ahead Given the liquidity monitoring parameters: | name | triggering ratio | time window | scaling factor | @@ -1254,7 +1252,6 @@ Feature: Fees calculations | trading mode | auction trigger | | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | - @NoPerp Scenario: Testing fees in continuous trading during position resolution Given the fees configuration named "fees-config-1": diff --git a/core/integration/features/liquidation/0012-POSR-012.feature b/core/integration/features/liquidation/0012-POSR-012.feature index a671211c73..244363aa2d 100644 --- a/core/integration/features/liquidation/0012-POSR-012.feature +++ b/core/integration/features/liquidation/0012-POSR-012.feature @@ -1,7 +1,11 @@ Feature: 0012-POSR-012 Update the liquidation strategy through market update Background: - Given the markets: + Given the liquidation strategies: + | name | disposal step | disposal fraction | full disposal size | max fraction consumed | disposal slippage range | + | fast-liquidation | 10 | 0.1 | 20 | 0.05 | 0.5 | + + 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 | liquidation strategy | | ETH/DEC19 | BTC | BTC | default-simple-risk-model-4 | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 0.25 | 0 | default-futures | slow-liquidation-strat | And the following network parameters are set: @@ -10,7 +14,7 @@ Feature: 0012-POSR-012 Update the liquidation strategy through market update | network.markPriceUpdateMaximumFrequency | 0s | | limits.markets.maxPeggedOrders | 2 | - @NoPerp @LiquidationUpdate + @LiquidationUpdate Scenario: Update liquidation strategy through market update # setup accounts Given the parties deposit on asset's general account the following amount: @@ -97,8 +101,8 @@ Feature: 0012-POSR-012 Update the liquidation strategy through market update | tt_10 | 100 | 1 | network | # Now update the market When the markets are updated: - | id | linear slippage factor | quadratic slippage factor | liquidation strategy | - | ETH/DEC19 | 0.25 | 0 | default-liquidation-strat | + | id | linear slippage factor | quadratic slippage factor | liquidation strategy | + | ETH/DEC19 | 0.25 | 0 | fast-liquidation | # Now the network should dispose of its entire position When the network moves ahead "11" blocks Then the parties should have the following profit and loss: diff --git a/core/integration/features/liquidity-provision/0042-LIQF-100.feature b/core/integration/features/liquidity-provision/0042-LIQF-100.feature new file mode 100644 index 0000000000..e63f19d699 --- /dev/null +++ b/core/integration/features/liquidity-provision/0042-LIQF-100.feature @@ -0,0 +1,196 @@ +Feature: Test LP mechanics when there are multiple liquidity providers, test stop-loss orders and parked orders (does not count towards LP commitment) + + Background: + Given the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.000001 | 0.1 | 0 | 0 | 1.0 | + 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 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.0 | 20s | 1 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | ETH | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + ## Set auction duration to 3 epochs + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 3600 | 0.99 | 30 | + + 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 liquidity sla params named "SLA-23": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0 | 0.6 | 1 | 1.0 | + + And the spot markets: + | id | name | base asset | quote asset | liquidity monitoring | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lqm-params | log-normal-risk-model | 2 | fees-config-1 | price-monitoring | SLA-22 | + + + And the following network parameters are set: + | name | value | + | 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 | + + Given the average block duration is "1" + @Now + Scenario: 001: lp1 and lp2 on the market BTC/ETH, 0044-LIME-078, 0042-LIQF-100 + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | ETH | 100000 | + | lp2 | ETH | 100000 | + | lp3 | ETH | 100000 | + | party1 | ETH | 100000 | + | party2 | ETH | 100000 | + | party3 | ETH | 100000 | + | ptbuy | ETH | 100000 | + | ptsell | ETH | 100000 | + | lp1 | BTC | 100000 | + | lp2 | BTC | 100000 | + | lp3 | BTC | 100000 | + | party1 | BTC | 100000 | + | party2 | BTC | 100000 | + | party3 | BTC | 100000 | + | ptbuy | BTC | 100000 | + | ptsell | BTC | 100000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | BTC/ETH | 6000 | 0.02 | submission | + | lp_2 | lp2 | BTC/ETH | 4000 | 0.015 | submission | + + When the network moves ahead "4" blocks + And the current epoch is "0" + + # AC: 0042-LIQF-054: If an LP has an active liquidity provision at the start of an epoch and no previous performance penalties and throughout the epoch always meets their liquidity provision requirements + # then they will have a `fraction_of_time_on_book == 1` then no penalty will be applied to their liquidity fee payments at the end of the epoch. + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 10 | 900 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | BTC/ETH | sell | 10 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | BTC/ETH | buy | 10 | 950 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | lp2 | BTC/ETH | buy | 10 | 970 | 0 | TYPE_LIMIT | TIF_GTC | lp2-b | + | lp2 | BTC/ETH | sell | 10 | 1020 | 0 | TYPE_LIMIT | TIF_GTC | lp2-s | + | lp1 | BTC/ETH | sell | 10 | 1050 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + + Then the opening auction period ends for market "BTC/ETH" + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 1 | party2 | + + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 973 | 1027 | 10000 | 10000 | + + When the network moves ahead "1" epochs + And the supplied stake should be "10000" for the market "BTC/ETH" + And the network treasury balance should be "0" for the asset "ETH" + And the current epoch is "1" + Then the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 84500 | 6000 | + | lp2 | ETH | BTC/ETH | 86300 | 4000 | + + Then the parties cancel the following orders: + | party | reference | + | lp1 | lp1-b | + | lp2 | lp2-b | + | lp2 | lp2-s | + | lp1 | lp1-s | + Then the network moves ahead "1" blocks + + #AC 0044-LIME-077: Parked pegged limit orders and stop-loss orders do not count towards an LPs liquidity commitment. + # post-only orders count towards an LPs liquidity commitment + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | only | + | lp1 | BTC/ETH | buy | 10 | 950 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | post | + | lp2 | BTC/ETH | buy | 10 | 970 | 0 | TYPE_LIMIT | TIF_GTC | lp2-b | post | + | lp2 | BTC/ETH | sell | 10 | 1020 | 0 | TYPE_LIMIT | TIF_GTC | lp2-s | post | + | lp1 | BTC/ETH | sell | 10 | 1050 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | post | + + When the network moves ahead "1" epochs + And the supplied stake should be "10000" for the market "BTC/ETH" + + Then the parties cancel the following orders: + | party | reference | + | lp1 | lp1-b | + | lp1 | lp1-s | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp1 | BTC/ETH | sell | 2 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | lp2 | BTC/ETH | buy | 2 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the network moves ahead "1" blocks + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | only | fb price trigger | + | lp1 | BTC/ETH | buy | 2 | 950 | 0 | TYPE_MARKET | TIF_GTC | lp1-b-stop-order | reduce | 900 | + + When the network moves ahead "1" epochs + + Then the supplied stake should be "9400" for the market "BTC/ETH" + And the current epoch is "3" + And the network treasury balance should be "600" for the asset "ETH" + And the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | lp1 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_NETWORK_TREASURY | BTC/ETH | 600 | ETH | + + ## Trigger price monitoring auction by trading outside of price bound (973-1027) + ## Ensure volume on the book after leaving auction at 900-990 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | ptbuy | BTC/ETH | buy | 2 | 970 | 0 | TYPE_LIMIT | TIF_GTC | + | ptsell | BTC/ETH | sell | 2 | 970 | 0 | TYPE_LIMIT | TIF_GTC | + | ptbuy | BTC/ETH | sell | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | ptsell | BTC/ETH | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | auction end | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 10000 | 9400 | 30 | + + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | + | lp1 | BTC/ETH | 12 | 1 | buy | BID | 12 | 20 | lp1-b | + | lp1 | BTC/ETH | 12 | 1 | sell | ASK | 12 | 20 | lp1-s | + When the network moves ahead "1" blocks + + And the orders should have the following status: + | party | reference | status | + | lp1 | lp1-b | STATUS_PARKED | + | lp1 | lp1-s | STATUS_PARKED | + + When the network moves ahead "1" epochs + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | target stake | supplied stake | auction end | + | 1000 | TRADING_MODE_MONITORING_AUCTION | 10000 | 8860 | 30 | + + #lp1 got bond penalty for placing parked order + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | lp1 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_NETWORK_TREASURY | BTC/ETH | 540 | ETH | + + And the network treasury balance should be "1140" for the asset "ETH" + + diff --git a/core/integration/features/liquidity-provision/0044-LIME-029.feature b/core/integration/features/liquidity-provision/0044-LIME-029.feature new file mode 100644 index 0000000000..575c294fbb --- /dev/null +++ b/core/integration/features/liquidity-provision/0044-LIME-029.feature @@ -0,0 +1,142 @@ +Feature: Check we can use LIMIT, PEGGED and ICEBERG orders to cover our commitment + +# Once liquidity is committed LPs can meet their commitment by placing limit orders, +# pegged limit orders and iceberg orders. For iceberg orders only the visible peak +# counts towards the commitment (0044-LIME-029) + + Background: + Given the following network parameters are set: + | name | value | + | market.liquidity.bondPenaltyParameter | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 2 | + | 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 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 | + + And the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | simple-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | default-basic | SLA | + + + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 100000000 | + | party3 | ETH | 100000000 | + | party4 | ETH | 100000000 | + | party1 | BTC | 100000000 | + | party3 | BTC | 100000000 | + | party4 | BTC | 100000000 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | party1 | BTC/ETH | 10000 | 0.001 | submission | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party3 | BTC/ETH | buy | 1000 | 900 | 0 | TYPE_LIMIT | TIF_GTC | p3b1 | + | party3 | BTC/ETH | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b2 | + | party4 | BTC/ETH | sell | 1000 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | p4s1 | + | party4 | BTC/ETH | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p4s2 | + + Scenario: 001, LP is covered fully with LIMIT orders + When the opening auction period ends for market "BTC/ETH" + And the auction ends with a traded volume of "10" at a price of "1000" + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | supplied stake | best static bid price | static mid price | best static offer price | + | 1000 | TRADING_MODE_CONTINUOUS | 10000 | 900 | 1000 | 1100 | + # Place LIMIT orders to cover our commitment + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 10 | 999 | 0 | TYPE_LIMIT | TIF_GTC | party1-order1 | + | party1 | BTC/ETH | sell | 10 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | party1-order2 | + # Move forward an epoch and make sure the accounts do not change as we have the full epoch covered with LIMIT orders + When the network moves ahead "7" blocks + Then the liquidity provisions should have the following states: + | id | party | market | commitment amount | status | + | lp1 | party1 | BTC/ETH | 10000 | STATUS_ACTIVE | + And the parties should have the following account balances: + | party | asset | market id | general | + | party1 | ETH | BTC/ETH | 99980010 | + + Scenario: 002, LP is covered fully with PEGGED orders + When the opening auction period ends for market "BTC/ETH" + And the auction ends with a traded volume of "10" at a price of "1000" + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | supplied stake | best static bid price | static mid price | best static offer price | + | 1000 | TRADING_MODE_CONTINUOUS | 10000 | 900 | 1000 | 1100 | + + # Place PEGGED orders to cover our commitment + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | pegged reference | pegged offset | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_LIMIT | TIF_GTC | party1-order1 | MID | 5 | + | party1 | BTC/ETH | sell | 10 | 0 | 0 | TYPE_LIMIT | TIF_GTC | party1-order2 | MID | 5 | + + # Move forward an epoch and make sure the accounts do not change as we have the full epoch covered with PEGGED orders + When the network moves ahead "7" blocks + Then the liquidity provisions should have the following states: + | id | party | market | commitment amount | status | + | lp1 | party1 | BTC/ETH | 10000 | STATUS_ACTIVE | + And the parties should have the following account balances: + | party | asset | market id | general | + | party1 | ETH | BTC/ETH | 99980050 | + + Scenario: 003, LP is covered fully with ICEBERG orders + When the opening auction period ends for market "BTC/ETH" + And the auction ends with a traded volume of "10" at a price of "1000" + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | supplied stake | best static bid price | static mid price | best static offer price | + | 1000 | TRADING_MODE_CONTINUOUS | 10000 | 900 | 1000 | 1100 | + + # Place ICEBERG orders to cover our commitment + When the parties place the following iceberg orders: + | party | market id | side | volume | price | resulting trades | type | tif | peak size | minimum visible size | only | + | party1 | BTC/ETH | buy | 100 | 999 | 0 | TYPE_LIMIT | TIF_GTC | 90 | 1 | post | + | party1 | BTC/ETH | sell | 100 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | 90 | 1 | post | + + # Move forward an epoch and make sure the accounts do not change as we have the full epoch covered with ICEBERG orders + When the network moves ahead "7" blocks + Then the liquidity provisions should have the following states: + | id | party | market | commitment amount | status | + | lp1 | party1 | BTC/ETH | 10000 | STATUS_ACTIVE | + And the parties should have the following account balances: + | party | asset | market id | general | + | party1 | ETH | BTC/ETH | 99890100 | + + Scenario: 004, LP is covered fully with ICEBERG orders even with small peak size + When the opening auction period ends for market "BTC/ETH" + And the auction ends with a traded volume of "10" at a price of "1000" + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | supplied stake | best static bid price | static mid price | best static offer price | + | 1000 | TRADING_MODE_CONTINUOUS | 10000 | 900 | 1000 | 1100 | + + # Place ICEBERG orders which have a too small peak to cover our commitment + When the parties place the following iceberg orders: + | party | market id | side | volume | price | resulting trades | type | tif | peak size | minimum visible size | only | + | party1 | BTC/ETH | buy | 100 | 999 | 0 | TYPE_LIMIT | TIF_GTC | 5 | 2 | post | + | party1 | BTC/ETH | sell | 100 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | 5 | 2 | post | + + # Move forward an epoch and make sure we get a penalty + When the network moves ahead "7" blocks + Then the liquidity provisions should have the following states: + | id | party | market | commitment amount | status | + | lp1 | party1 | BTC/ETH | 10000 | STATUS_ACTIVE | + And the parties should have the following account balances: + | party | asset | market id | general | + | party1 | ETH | BTC/ETH | 99890100 | diff --git a/core/integration/features/liquidity-provision/0044-LIME-088.feature b/core/integration/features/liquidity-provision/0044-LIME-088.feature index 53489f85d0..8dc46e1759 100644 --- a/core/integration/features/liquidity-provision/0044-LIME-088.feature +++ b/core/integration/features/liquidity-provision/0044-LIME-088.feature @@ -54,7 +54,7 @@ Feature: Test LP SLA Bond penalty on change of SLA market parameter: price range | market.liquidity.earlyExitPenalty | 0.25 | Given the average block duration is "1" - @Now @NoPerp + @Now Scenario: 001: If a liquidity provider has `fraction_of_time_on_book` = `0.3`, `market.liquidity.commitmentMinTimeFraction = 0.6`, `market.liquidity.sla.nonPerformanceBondPenaltySlope = 0.7`, `market.liquidity.sla.nonPerformanceBondPenaltyMax = 0.6`and the market parameter change `market.liquidity.commitmentMinTimeFraction = 0.3` is enacted during the epoch then at the end of the current epoch LP will have their bond slashed. If the LP has `fraction_of_time_on_book` = `0.3` at the end of the next epoch, they are meeting their commitment and will not forfeit any of their bond stake. (0044-LIME-088) Given the parties deposit on asset's general account the following amount: | party | asset | amount | diff --git a/core/integration/features/liquidity-provision/0044-LIME-091.feature b/core/integration/features/liquidity-provision/0044-LIME-091.feature index 7f41e68671..5ba6bafd93 100644 --- a/core/integration/features/liquidity-provision/0044-LIME-091.feature +++ b/core/integration/features/liquidity-provision/0044-LIME-091.feature @@ -62,7 +62,7 @@ Feature: Test change of SLA market parameter | market.liquidity.earlyExitPenalty | 0.25 | Given the average block duration is "1" - @Now @NoPerp + @Now Scenario: 001: lp1 and lp2 on the market ETH/MAR22, 0044-LIME-091, 0044-LIME-093, 0044-LIME-029 Given the parties deposit on asset's general account the following amount: | party | asset | amount | @@ -125,7 +125,7 @@ Feature: Test change of SLA market parameter | from | to | from account | to account | market id | amount | asset | | lp1 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_INSURANCE | ETH/MAR22 | 2400 | USD | | lp2 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_INSURANCE | ETH/MAR22 | 2400 | USD | - And the insurance pool balance should be "4800" for the market "ETH/MAR22" + And the insurance pool balance should be "6720" for the market "ETH/MAR22" When the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | @@ -135,7 +135,7 @@ Feature: Test change of SLA market parameter | ptsell | ETH/MAR22 | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | Then the market data for the market "ETH/MAR22" should be: | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | auction end | - | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 10350 | 3200 | 1 | 3 | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 10350 | 1280 | 1 | 3 | When the parties submit the following liquidity provision: | id | party | market id | commitment amount | fee | lp type | @@ -156,17 +156,17 @@ Feature: Test change of SLA market parameter # (1.0-market.liquidity.priceRange) x min(last trade price, indicative uncrossing price) <= price levels <= (1.0+market.liquidity.priceRange) x max(last trade price, indicative uncrossing price). Then the parties should have the following account balances: | party | asset | market id | margin | general | bond | - | lp1 | USD | ETH/MAR22 | 127281 | 66287 | 4000 | - | lp2 | USD | ETH/MAR22 | 127281 | 66319 | 4000 | + | lp1 | USD | ETH/MAR22 | 127281 | 65327 | 4000 | + | lp2 | USD | ETH/MAR22 | 127281 | 65359 | 4000 | When the network moves ahead "11" blocks - And the insurance pool balance should be "4860" for the market "ETH/MAR22" + And the insurance pool balance should be "6780" for the market "ETH/MAR22" And the market data for the market "ETH/MAR22" should be: | mark price | trading mode | target stake | supplied stake | open interest | | 994 | TRADING_MODE_CONTINUOUS | 14142 | 8000 | 4 | Then the parties should have the following account balances: | party | asset | market id | margin | general | bond | - | lp1 | USD | ETH/MAR22 | 127281 | 66287 | 4000 | - | lp2 | USD | ETH/MAR22 | 127281 | 66319 | 4000 | + | lp1 | USD | ETH/MAR22 | 127281 | 65327 | 4000 | + | lp2 | USD | ETH/MAR22 | 127281 | 65359 | 4000 | diff --git a/core/integration/features/liquidity-provision/0044-LIME-102.feature b/core/integration/features/liquidity-provision/0044-LIME-102.feature deleted file mode 100644 index a1e530cc54..0000000000 --- a/core/integration/features/liquidity-provision/0044-LIME-102.feature +++ /dev/null @@ -1,146 +0,0 @@ -Feature: Consider a market in liquidity auction, when a LP increases their commitment it will take effect immediate for the purposes of LP stake supplied to the market. - #Where LP `supplied stake > target stake` the market will leave liquidity auction when the liquidity auction ends - #- In terms of the liquidity they are expected to supply: this only takes effect from the start of the next epoch - - Background: - - Given the margin calculator named "margin-calculator-1": - | search factor | initial factor | release factor | - | 1.2 | 1.5 | 1.7 | - Given the log normal risk model named "log-normal-risk-model": - | risk aversion | tau | mu | r | sigma | - | 0.000001 | 0.1 | 0 | 0 | 1.0 | - 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 | - And the liquidity monitoring parameters: - | name | triggering ratio | time window | scaling factor | - | lqm-params | 1.0 | 20s | 1 | - #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.99 | 40 | - - 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 liquidity sla params named "SLA-23": - | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | - | 0 | 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 | - - And the following network parameters are set: - | name | value | - | 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 | - - Given the average block duration is "1" - @Now - Scenario: during liquidity auciton, in terms of the liquidity they are expected to supply: this only takes effect from the start of the next epoch 0044-LIME-102 - 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 | - | ptbuy | USD | 100000 | - | ptsell | USD | 100000 | - - 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 | | - - Then the opening auction period ends for market "ETH/MAR22" - - 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 "4" blocks - And the current epoch is "0" - - Then the parties should have the following account balances: - | party | asset | market id | margin | general | bond | - | lp1 | USD | ETH/MAR22 | 0 | 94000 | 6000 | - | lp2 | USD | ETH/MAR22 | 0 | 96000 | 4000 | - - Then the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | - | party1 | ETH/MAR22 | buy | 2 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | - | party2 | ETH/MAR22 | sell | 2 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | - - When the network moves ahead "1" blocks - And the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | - | ptbuy | ETH/MAR22 | buy | 2 | 970 | 0 | TYPE_LIMIT | TIF_GTC | - | ptsell | ETH/MAR22 | sell | 2 | 970 | 0 | TYPE_LIMIT | TIF_GTC | - Then the current epoch is "0" - And the market data for the market "ETH/MAR22" should be: - | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | auction end | - | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 17250 | 10000 | 3 | 40 | - - Then the network moves ahead "1" epochs - #SLA bond penalty happened in this epoch for lp1/2 not supplying liquidiy - Then the following transfers should happen: - | from | to | from account | to account | market id | amount | asset | - | lp1 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_INSURANCE | ETH/MAR22 | 600 | USD | - | lp2 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_INSURANCE | ETH/MAR22 | 400 | USD | - And the current epoch is "1" - And the supplied stake should be "9000" for the market "ETH/MAR22" - - #now lp1/2 start to supply liquidity duing auction - Then the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | reference | - | lp1 | ETH/MAR22 | buy | 10 | 950 | 0 | TYPE_LIMIT | TIF_GFA | lp1-GFA-b | - | lp2 | ETH/MAR22 | buy | 10 | 970 | 0 | TYPE_LIMIT | TIF_GFA | lp2-GFA-b | - | lp2 | ETH/MAR22 | sell | 10 | 1020 | 0 | TYPE_LIMIT | TIF_GFA | lp2-GFA-s | - | lp1 | ETH/MAR22 | sell | 10 | 1050 | 0 | TYPE_LIMIT | TIF_GFA | lp1-GFA-s | - - Then the network moves ahead "2" epochs - And the current epoch is "3" - #lp1/2 do not get SLA bond penalty anymore - And the supplied stake should be "9000" for the market "ETH/MAR22" - And the market data for the market "ETH/MAR22" should be: - | mark price | trading mode | target stake | supplied stake | open interest | - | 1000 | TRADING_MODE_MONITORING_AUCTION | 17250 | 9000 | 3 | - - - - - - - diff --git a/core/integration/features/liquidity-provision/0044-LIME-113.feature b/core/integration/features/liquidity-provision/0044-LIME-113.feature new file mode 100644 index 0000000000..9e3c9fd43f --- /dev/null +++ b/core/integration/features/liquidity-provision/0044-LIME-113.feature @@ -0,0 +1,171 @@ +Feature: Test change of SLA market parameter + + Background: + Given the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.000001 | 0.1 | 0 | 0 | 1.0 | + 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 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.0 | 20s | 1 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | ETH | 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.99 | 3 | + + And the liquidity sla params named "SLA-22-1": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.9 | 0.6 | 1 | 1.0 | + And the liquidity sla params named "SLA-22-2": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.1 | 0.6 | 1 | 1.0 | + + 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 spot markets: + | id | name | base asset | quote asset | liquidity monitoring | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lqm-params | log-normal-risk-model | 2 | fees-config-1 | price-monitoring | SLA-22 | + + + And the following network parameters are set: + | name | value | + | market.liquidity.bondPenaltyParameter | 0.2 | + | validators.epoch.length | 5s | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.7 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + + Given the average block duration is "1" + @Now + Scenario: 001: lp1 and lp2 on the market BTC/ETH, 0044-LIME-091, 0044-LIME-113, 0044-LIME-029, 0044-LIME-115 + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | ETH | 200000 | + | lp2 | ETH | 200000 | + | party1 | ETH | 100000 | + | party2 | ETH | 100000 | + | party3 | ETH | 100000 | + | ptbuy | ETH | 100000 | + | ptsell | ETH | 100000 | + | lp1 | BTC | 200000 | + | lp2 | BTC | 200000 | + | party1 | BTC | 100000 | + | party2 | BTC | 100000 | + | party3 | BTC | 100000 | + | ptbuy | BTC | 100000 | + | ptsell | BTC | 100000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | BTC/ETH | 4000 | 0.02 | submission | + | lp_2 | lp2 | BTC/ETH | 4000 | 0.015 | submission | + + When the network moves ahead "11" 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 | BTC/ETH | 1 | 1 | buy | BID | 12 | 200 | lp-b-1 | + | lp1 | BTC/ETH | 1 | 1 | sell | ASK | 12 | 200 | lp-s-1 | + | lp2 | BTC/ETH | 1 | 1 | buy | BID | 12 | 200 | lp-b-1 | + | lp2 | BTC/ETH | 1 | 1 | sell | ASK | 12 | 200 | lp-s-1 | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 10 | 910 | 0 | TYPE_LIMIT | TIF_GTC | best-buy | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | BTC/ETH | sell | 10 | 1110 | 0 | TYPE_LIMIT | TIF_GTC | best-sell | + | party2 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + + Then the opening auction period ends for market "BTC/ETH" + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 1 | party2 | + + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | target stake | supplied stake | + | 1000 | TRADING_MODE_CONTINUOUS | 8000 | 8000 | + And the liquidity fee factor should be "0.02" for the market "BTC/ETH" + + ##0044-LIME-091: price range in SLA parameter is getting wider, changes from 0.5 to 0.9 + Then the spot markets are updated: + | id | risk model | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | BTC/ETH | log-normal-risk-model | price-monitoring | default-eth-for-future | 1e0 | 0 | SLA-22-1 | + Then the network moves ahead "1" epochs + And the network treasury balance should be "0" for the asset "ETH" + + Then the network moves ahead "1" epochs + And the network treasury balance should be "0" for the asset "ETH" + #0044-LIME-093:price range in SLA parameter is getting narrower, changes from 0.5 to 0.1 + Then the spot markets are updated: + | id | risk model | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | BTC/ETH | log-normal-risk-model | price-monitoring | default-eth-for-future | 1e0 | 0 | SLA-22-2 | + Then the network moves ahead "3" epochs + + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | lp1 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_NETWORK_TREASURY | BTC/ETH | 2400 | ETH | + | lp2 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_NETWORK_TREASURY | BTC/ETH | 2400 | ETH | + And the network treasury balance should be "6720" for the asset "ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | ptbuy | BTC/ETH | buy | 2 | 970 | 0 | TYPE_LIMIT | TIF_GTC | + | ptsell | BTC/ETH | sell | 2 | 970 | 0 | TYPE_LIMIT | TIF_GTC | + | ptbuy | BTC/ETH | sell | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | ptsell | BTC/ETH | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | auction end | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 8000 | 1280 | 3 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | BTC/ETH | 4000 | 0.02 | amendment | + | lp_2 | lp2 | BTC/ETH | 4000 | 0.015 | amendment | + + #0044-LIME-115:during auction the parties place orders within the price range: 0.1 which should count as SLA + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp1 | BTC/ETH | buy | 12 | 998 | 0 | TYPE_LIMIT | TIF_GTC | + | lp1 | BTC/ETH | sell | 12 | 1002 | 0 | TYPE_LIMIT | TIF_GTC | + | lp2 | BTC/ETH | buy | 12 | 998 | 0 | TYPE_LIMIT | TIF_GTC | + | lp2 | BTC/ETH | sell | 12 | 1002 | 0 | TYPE_LIMIT | TIF_GTC | + Then the network moves ahead "4" blocks + + #indicative price buy is (990*10+998*24)/34=995; (1010*10+1002*24)/34=1004, + #last trade price is 1000, so the price range should be: (0.9*995, 1.1*1004)=(895, 1104) + # (1.0-market.liquidity.priceRange) x min(last trade price, indicative uncrossing price) <= price levels <= (1.0+market.liquidity.priceRange) x max(last trade price, indicative uncrossing price). + Then the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 171056 | 4000 | + | lp2 | ETH | BTC/ETH | 171088 | 4000 | + When the network moves ahead "11" blocks + And the network treasury balance should be "6780" for the asset "ETH" + + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | target stake | supplied stake | + | 994 | TRADING_MODE_CONTINUOUS | 8000 | 8000 | + Then the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 171056 | 4000 | + | lp2 | ETH | BTC/ETH | 171088 | 4000 | + + diff --git a/core/integration/features/liquidity-provision/0044-LIME-115.feature b/core/integration/features/liquidity-provision/0044-LIME-115.feature new file mode 100644 index 0000000000..1dfec60697 --- /dev/null +++ b/core/integration/features/liquidity-provision/0044-LIME-115.feature @@ -0,0 +1,172 @@ +Feature: Test change of SLA market parameter + + Background: + + Given the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + Given the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.000001 | 0.1 | 0 | 0 | 1.0 | + 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 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.0 | 20s | 1 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | ETH | 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.99 | 3 | + + And the liquidity sla params named "SLA-22-1": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.9 | 0.6 | 1 | 1.0 | + And the liquidity sla params named "SLA-22-2": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.1 | 0.6 | 1 | 1.0 | + + 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 spot markets: + | id | name | base asset | quote asset | liquidity monitoring | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lqm-params | log-normal-risk-model | 2 | fees-config-1 | price-monitoring | SLA-22 | + + And the following network parameters are set: + | name | value | + | market.liquidity.bondPenaltyParameter | 0.2 | + | validators.epoch.length | 5s | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.7 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + + Given the average block duration is "1" + + @Now + Scenario: 001: lp1 and lp2 on the market BTC/ETH, 0044-LIME-091, 0044-LIME-115 + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | ETH | 200000 | + | lp2 | ETH | 200000 | + | party1 | ETH | 100000 | + | party2 | ETH | 100000 | + | party3 | ETH | 100000 | + | ptbuy | ETH | 100000 | + | ptsell | ETH | 100000 | + | lp1 | BTC | 200000 | + | lp2 | BTC | 200000 | + | party1 | BTC | 100000 | + | party2 | BTC | 100000 | + | party3 | BTC | 100000 | + | ptbuy | BTC | 100000 | + | ptsell | BTC | 100000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | BTC/ETH | 4000 | 0.02 | submission | + | lp_2 | lp2 | BTC/ETH | 4000 | 0.015 | submission | + + When the network moves ahead "11" 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 | BTC/ETH | 1 | 1 | buy | BID | 12 | 200 | lp-b-1 | + | lp1 | BTC/ETH | 1 | 1 | sell | ASK | 12 | 200 | lp-s-1 | + | lp2 | BTC/ETH | 1 | 1 | buy | BID | 12 | 200 | lp-b-1 | + | lp2 | BTC/ETH | 1 | 1 | sell | ASK | 12 | 200 | lp-s-1 | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 10 | 910 | 0 | TYPE_LIMIT | TIF_GTC | best-buy | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | BTC/ETH | sell | 10 | 1110 | 0 | TYPE_LIMIT | TIF_GTC | best-sell | + | party2 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + + Then the opening auction period ends for market "BTC/ETH" + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 1 | party2 | + + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | target stake | supplied stake | + | 1000 | TRADING_MODE_CONTINUOUS | 8000 | 8000 | + And the liquidity fee factor should be "0.02" for the market "BTC/ETH" + + ##0044-LIME-091: price range in SLA parameter is getting wider, changes from 0.5 to 0.9 + Then the spot markets are updated: + | id | risk model | price monitoring | data source config | sla params | + | BTC/ETH | log-normal-risk-model | price-monitoring | default-eth-for-future | SLA-22-1 | + + Then the network moves ahead "2" epochs + + #0044-LIME-115:price range in SLA parameter is getting narrower, changes from 0.5 to 0.1 + Then the spot markets are updated: + | id | risk model | price monitoring | data source config | sla params | + | BTC/ETH | log-normal-risk-model | price-monitoring | default-eth-for-future | SLA-22-2 | + Then the network moves ahead "3" epochs + + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | lp1 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_NETWORK_TREASURY | BTC/ETH | 2400 | ETH | + | lp2 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_NETWORK_TREASURY | BTC/ETH | 2400 | ETH | + And the network treasury balance should be "6720" for the asset "ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | ptbuy | BTC/ETH | buy | 2 | 970 | 0 | TYPE_LIMIT | TIF_GTC | + | ptsell | BTC/ETH | sell | 2 | 970 | 0 | TYPE_LIMIT | TIF_GTC | + | ptbuy | BTC/ETH | sell | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | ptsell | BTC/ETH | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | auction end | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 8000 | 1280 | 3 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | BTC/ETH | 4000 | 0.02 | amendment | + | lp_2 | lp2 | BTC/ETH | 4000 | 0.015 | amendment | + + #0044-LIME-115:during auction the parties place orders within the price range: 0.1 which should count as SLA + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp1 | BTC/ETH | buy | 12 | 998 | 0 | TYPE_LIMIT | TIF_GTC | + | lp1 | BTC/ETH | sell | 12 | 1002 | 0 | TYPE_LIMIT | TIF_GTC | + | lp2 | BTC/ETH | buy | 12 | 998 | 0 | TYPE_LIMIT | TIF_GTC | + | lp2 | BTC/ETH | sell | 12 | 1002 | 0 | TYPE_LIMIT | TIF_GTC | + Then the network moves ahead "4" blocks + + Then the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 171056 | 4000 | + | lp2 | ETH | BTC/ETH | 171088 | 4000 | + When the network moves ahead "11" blocks + And the network treasury balance should be "6780" for the asset "ETH" + + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | target stake | supplied stake | + | 994 | TRADING_MODE_CONTINUOUS | 8000 | 8000 | + + Then the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 171056 | 4000 | + | lp2 | ETH | BTC/ETH | 171088 | 4000 | + + diff --git a/core/integration/features/liquidity-provision/0044-LIME-119.feature b/core/integration/features/liquidity-provision/0044-LIME-119.feature new file mode 100644 index 0000000000..971fa572ab --- /dev/null +++ b/core/integration/features/liquidity-provision/0044-LIME-119.feature @@ -0,0 +1,202 @@ +Feature: Test LP mechanics when there are multiple liquidity providers; + + Background: + + Given the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.000001 | 0.1 | 0 | 0 | 1.0 | + #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 | + # price monitoring duration should be > 3 epochs + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 3600 | 0.99 | 40 | + + And the liquidity sla params named "SLA": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.05 | 1 | 1 | 1.0 | + + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 10 | 3600s | 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 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | validators.epoch.length | 5s | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.5 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 1 | + | validators.epoch.length | 10s | + | market.liquidity.providersFeeCalculationTimeStep | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 0.5 | 20s | 1 | + + And the spot markets: + | id | name | base asset | quote asset | liquidity monitoring | risk model | auction duration | fees | price monitoring | sla params | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lqm-params | log-normal-risk-model | 2 | fees-config-1 | price-monitoring | default-basic | SLA | + + Given the average block duration is "2" + + @Now + Scenario: An LP with bid orders inside valid range during auction (and market has no indicative price), is not penalised (0044-LIME-119) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | ETH | 20000000 | + | party1 | ETH | 1000000000 | + | party2 | ETH | 1000000000 | + | party3 | ETH | 1000000 | + | ptbuy | ETH | 10000000 | + | ptsell | ETH | 10000000 | + | lp1 | BTC | 20000000 | + | party1 | BTC | 1000000000 | + | party2 | BTC | 1000000000 | + | party3 | BTC | 1000000 | + | ptbuy | BTC | 10000000 | + | ptsell | BTC | 10000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | BTC/ETH | 180000 | 0.02 | submission | + + When the network moves ahead "2" blocks + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp1 | BTC/ETH | buy | 100 | 4750 | 0 | TYPE_LIMIT | TIF_GTC | + | lp1 | BTC/ETH | sell | 100 | 5250 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 10 | 5100 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + # Remove this so we can trigger price auction, we add it back later + #| party1 | BTC/ETH | buy | 10 | 4900 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 5000 | 1 | party2 | + + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | + | 5000 | TRADING_MODE_CONTINUOUS | 3600 | 4865 | 5139 | 180000 | 180000 | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 5000 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 5000 | 5000 | 1 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "1" blocks + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | + | 5000 | TRADING_MODE_CONTINUOUS | 3600 | 4865 | 5139 | 180000 | 180000 | + + ## Now trigger price monitoring auction - sell outside of max bound, and make sure orders can't uncross with existing volume + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | ptbuy | BTC/ETH | buy | 1 | 4740 | 0 | TYPE_LIMIT | TIF_GTC | pt-buy | + | ptsell | BTC/ETH | sell | 1 | 4740 | 0 | TYPE_LIMIT | TIF_GTC | pt-sell | + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | auction end | + | 5000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 180000 | 180000 | 40 | + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 10 | 4900 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "1" epochs + And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + Then the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 19340012 | 162000 | + + When the network moves ahead "2" epochs + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + Then the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 19340012 | 162000 | + +Scenario: An LP with ask orders outside valid range during auction is penalised (0044-LIME-114) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | ETH | 20000000 | + | party1 | ETH | 1000000000 | + | party2 | ETH | 1000000000 | + | party3 | ETH | 1000000 | + | ptbuy | ETH | 10000000 | + | ptsell | ETH | 10000000 | + | lp1 | BTC | 20000000 | + | party1 | BTC | 1000000000 | + | party2 | BTC | 1000000000 | + | party3 | BTC | 1000000 | + | ptbuy | BTC | 10000000 | + | ptsell | BTC | 10000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | BTC/ETH | 180000 | 0.02 | submission | + + When the network moves ahead "2" blocks + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp1 | BTC/ETH | buy | 100 | 3790 | 0 | TYPE_LIMIT | TIF_GTC | + | lp1 | BTC/ETH | sell | 100 | 5250 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 10 | 5100 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 5000 | 1 | party2 | + + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | + | 5000 | TRADING_MODE_CONTINUOUS | 3600 | 4865 | 5139 | 180000 | 180000 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | ptbuy | BTC/ETH | buy | 1 | 4740 | 0 | TYPE_LIMIT | TIF_GTC | pt-buy | + | ptsell | BTC/ETH | sell | 1 | 4740 | 0 | TYPE_LIMIT | TIF_GTC | pt-sell | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | auction end | + | 5000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 180000 | 180000 | 40 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 10 | 4900 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 1 | 4000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 4000 | 0 | TYPE_LIMIT | TIF_GTC | + Then the network moves ahead "1" epochs + And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + And the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 19437020 | 90000 | + + When the network moves ahead "2" epochs + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + Then the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 19437020 | 22500 | + + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | lp1 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_NETWORK_TREASURY | BTC/ETH | 90000 | ETH | + | lp1 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_NETWORK_TREASURY | BTC/ETH | 45000 | ETH | + | lp1 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_NETWORK_TREASURY | BTC/ETH | 22500 | ETH | + + diff --git a/core/integration/features/margin/0019-MCAL-043.feature b/core/integration/features/margin/0019-MCAL-043.feature index 33bc2c9588..b1c20b804b 100644 --- a/core/integration/features/margin/0019-MCAL-043.feature +++ b/core/integration/features/margin/0019-MCAL-043.feature @@ -108,8 +108,8 @@ Feature: Iceberg orders in isolated margin mode | party | market id | side | volume | price | resulting trades | type | tif | peak size | minimum visible size | reference | | party1 | ETH/DEC19 | buy | 10 | 5 | 0 | TYPE_LIMIT | TIF_GTC | 3 | 1 | ordinary-iceberg | And the parties place the following pegged iceberg orders: - | party | market id | side | volume | resulting trades | type | tif | peak size | minimum visible size | pegged reference | offset | reference | error | - | party1 | ETH/DEC19 | buy | 10 | 0 | TYPE_LIMIT | TIF_GTC | 2 | 1 | BID | 1 | pegged-iceberg | invalid OrderError | + | party | market id | side | volume | resulting trades | type | tif | peak size | minimum visible size | pegged reference | offset | reference | error | + | party1 | ETH/DEC19 | buy | 10 | 0 | TYPE_LIMIT | TIF_GTC | 2 | 1 | BID | 1 | pegged-iceberg | OrderError: pegged orders not allowed in isolated margin mode | Then the order book should have the following volumes for market "ETH/DEC19": | side | price | volume | | buy | 5 | 3 | @@ -1169,11 +1169,11 @@ Feature: Iceberg orders in isolated margin mode | party2 | ETH/DEC19 | sell | 1 | 20 | 0 | TYPE_LIMIT | TIF_GTC | | party2 | ETH/DEC19 | sell | 10 | 25 | 0 | TYPE_LIMIT | TIF_GTC | And the parties place the following pegged iceberg orders: - | party | market id | side | volume | resulting trades | type | tif | peak size | minimum visible size | pegged reference | offset | error | - | party1 | ETH/DEC19 | buy | 10 | 0 | TYPE_LIMIT | TIF_GTC | 2 | 1 | BID | 1 | invalid OrderError | + | party | market id | side | volume | resulting trades | type | tif | peak size | minimum visible size | pegged reference | offset | error | + | party1 | ETH/DEC19 | buy | 10 | 0 | TYPE_LIMIT | TIF_GTC | 2 | 1 | BID | 1 | OrderError: pegged orders not allowed in isolated margin mode | And the parties place the following pegged orders: - | party | market id | side | volume | pegged reference | offset | error | - | party1 | ETH/DEC19 | buy | 1 | BID | 2 | invalid OrderError | + | party | market id | side | volume | pegged reference | offset | error | + | party1 | ETH/DEC19 | buy | 1 | BID | 2 | OrderError: pegged orders not allowed in isolated margin mode | When the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | | party3 | ETH/DEC19 | sell | 12 | 8 | 1 | TYPE_LIMIT | TIF_GTC | diff --git a/core/integration/features/margin/0019-MCAL-109.feature b/core/integration/features/margin/0019-MCAL-109.feature index 070f02fbe0..205c784b1b 100644 --- a/core/integration/features/margin/0019-MCAL-109.feature +++ b/core/integration/features/margin/0019-MCAL-109.feature @@ -271,6 +271,6 @@ Feature: switch to isolated margin without position and with orders during auct | party | market | margin_mode | margin_factor | error | | party5 | ETH/FEB23 | cross margin | | | And the parties should have the following margin levels: - | party | market id | maintenance | search | initial | release | margin mode | margin factor | order | - | party5 | ETH/FEB23 | 1480 | 1628 | 1776 | 2072 | cross margin | 0 | 0 | + | party | market id | maintenance | margin mode | margin factor | order | + | party5 | ETH/FEB23 | 1580 | cross margin | 0 | 0 | diff --git a/core/integration/features/margin/0019-MCAL-150.feature b/core/integration/features/margin/0019-MCAL-150.feature index 8c76bcf2e8..334cf720da 100644 --- a/core/integration/features/margin/0019-MCAL-150.feature +++ b/core/integration/features/margin/0019-MCAL-150.feature @@ -94,9 +94,9 @@ Feature: pegged order in isoalted margin is not supported #0019-MCAL-049:When the party submit a pegged order, it should be rejected When the parties place the following pegged orders: - | party | market id | side | volume | pegged reference | offset | reference | error | - | party1 | ETH/FEB23 | buy | 100 | BID | 10 | buy_peg_3 | invalid OrderError | - | party1 | ETH/FEB23 | buy | 200 | BID | 20 | buy_peg_4 | invalid OrderError | + | party | market id | side | volume | pegged reference | offset | reference | error | + | party1 | ETH/FEB23 | buy | 100 | BID | 10 | buy_peg_3 | OrderError: pegged orders not allowed in isolated margin mode | + | party1 | ETH/FEB23 | buy | 200 | BID | 20 | buy_peg_4 | OrderError: pegged orders not allowed in isolated margin mode | Then the orders should have the following status: | party | reference | status | diff --git a/core/integration/features/margin/margin-for-parked-orders.feature b/core/integration/features/margin/margin-for-parked-orders.feature index 0e3cbc3578..59c98f1a9f 100644 --- a/core/integration/features/margin/margin-for-parked-orders.feature +++ b/core/integration/features/margin/margin-for-parked-orders.feature @@ -273,11 +273,11 @@ Feature: Test for parked/unparked pegged orders | party | market | margin_mode | margin_factor | error | | test_party | ETH/FEB23 | isolated margin | 0.5 | | When the parties place the following pegged orders: - | party | market id | side | volume | pegged reference | offset | reference | error | - | test_party | ETH/FEB23 | buy | 5 | MID | 1 | buy_peg | invalid OrderError | + | party | market id | side | volume | pegged reference | offset | reference | error | + | test_party | ETH/FEB23 | buy | 5 | MID | 1 | buy_peg | OrderError: pegged orders not allowed in isolated margin mode | And the parties place the following pegged iceberg orders: - | party | market id | peak size | minimum visible size | side | reference | pegged reference | volume | offset | error | - | test_party | ETH/FEB23 | 5 | 2 | buy | buy_ice_peg | MID | 5 | 1 | invalid OrderError | + | party | market id | peak size | minimum visible size | side | reference | pegged reference | volume | offset | error | + | test_party | ETH/FEB23 | 5 | 2 | buy | buy_ice_peg | MID | 5 | 1 | OrderError: pegged orders not allowed in isolated margin mode | Then the parties should have the following margin levels: | party | market id | maintenance | search | initial | release | margin mode | margin factor | order | | test_party | ETH/FEB23 | 0 | 0 | 0 | 0 | isolated margin | | 0 | \ No newline at end of file diff --git a/core/integration/features/margin/margin-for-pegged-orders.feature b/core/integration/features/margin/margin-for-pegged-orders.feature index f3aca4d079..d97079bb18 100644 --- a/core/integration/features/margin/margin-for-pegged-orders.feature +++ b/core/integration/features/margin/margin-for-pegged-orders.feature @@ -44,9 +44,9 @@ Feature: Test pegged order amend under isolated margin mode | party | market | margin_mode | margin_factor | error | | test_party | ETH/FEB23 | isolated margin | 0.91 | | When the parties place the following pegged orders: - | party | market id | side | volume | pegged reference | offset | reference | error | - | test_party | ETH/FEB23 | sell | 10 | ASK | 9 | sell_peg | invalid OrderError | - | test_party | ETH/FEB23 | buy | 5 | BID | 9 | buy_peg | invalid OrderError | + | party | market id | side | volume | pegged reference | offset | reference | error | + | test_party | ETH/FEB23 | sell | 10 | ASK | 9 | sell_peg | OrderError: pegged orders not allowed in isolated margin mode | + | test_party | ETH/FEB23 | buy | 5 | BID | 9 | buy_peg | OrderError: pegged orders not allowed in isolated margin mode | Then the parties should have the following margin levels: | party | market id | maintenance | search | initial | release | margin mode | margin factor | order | | test_party | ETH/FEB23 | 0 | 0 | 0 | 0 | isolated margin | 0.91 | 0 | @@ -60,9 +60,9 @@ Feature: Test pegged order amend under isolated margin mode | party | market | margin_mode | margin_factor | error | | test_party | ETH/FEB23 | isolated margin | 0.91 | | When the parties place the following pegged iceberg orders: - | party | market id | peak size | minimum visible size | side | reference | pegged reference | volume | offset | error | - | test_party | ETH/FEB23 | 100 | 10 | buy | buy_ice_peg | BID | 100 | 9 | invalid OrderError | - | test_party | ETH/FEB23 | 100 | 10 | sell | sell_ice_peg | ASK | 100 | 9 | invalid OrderError | + | party | market id | peak size | minimum visible size | side | reference | pegged reference | volume | offset | error | + | test_party | ETH/FEB23 | 100 | 10 | buy | buy_ice_peg | BID | 100 | 9 | OrderError: pegged orders not allowed in isolated margin mode | + | test_party | ETH/FEB23 | 100 | 10 | sell | sell_ice_peg | ASK | 100 | 9 | OrderError: pegged orders not allowed in isolated margin mode | Then the parties should have the following margin levels: | party | market id | maintenance | search | initial | release | margin mode | margin factor | order | | test_party | ETH/FEB23 | 0 | 0 | 0 | 0 | isolated margin | 0.91 | 0 | diff --git a/core/integration/features/mark-price/panic-upon-leaving-opening-auction.feature b/core/integration/features/mark-price/panic-upon-leaving-opening-auction.feature new file mode 100644 index 0000000000..103f42f550 --- /dev/null +++ b/core/integration/features/mark-price/panic-upon-leaving-opening-auction.feature @@ -0,0 +1,66 @@ +Feature: Test setting of first mark price with bound violation + Background: + Given the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 4s | + | limits.markets.maxPeggedOrders | 2 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 0.00 | 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.1 | 100 | -100 | 0.2 | + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 5 | 0.99 | 3 | + And the composite price oracles from "0xCAFECAFE1": + | name | price property | price type | price decimals | + | oracle1 | prices.ETH.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 | linear slippage factor | quadratic slippage factor | sla params | price type | decay weight | decay power | cash amount | source weights | source staleness tolerance | oracle1 | market type | + | ETH/FEB23 | ETH | USD | lqm-params | simple-risk-model | default-margin-calculator | 5 | default-none | price-monitoring | default-eth-for-future | 0.25 | 0 | default-futures | weight | 0.1 | 0.5 | 500000 | 0,0,1,0 | 0s,0s,24h0m0s,0s | oracle1 | future | + + Scenario: when mark price methodology hasn't provided a price at the point of uncrossing the opening auction (0009-MRKP-001,0009-MRKP-003) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | buySideProvider | USD | 100000000000 | + | sellSideProvider | USD | 100000000000 | + | lp1 | USD | 100000000000 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | ETH/FEB23 | 50000 | 0.001 | submission | + | lp1 | lp1 | ETH/FEB23 | 50000 | 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/FEB23 | 49 | 1 | sell | ASK | 49 | 20 | + | lp1 | ETH/FEB23 | 52 | 1 | buy | BID | 52 | 20 | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/FEB23 | buy | 1 | 15899 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/FEB23 | sell | 1 | 15901 | 0 | TYPE_LIMIT | TIF_GTC | | + | buySideProvider | ETH/FEB23 | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | | + | buySideProvider | ETH/FEB23 | buy | 1 | 15900 | 0 | TYPE_LIMIT | TIF_GTC | | + | sellSideProvider | ETH/FEB23 | sell | 1 | 15900 | 0 | TYPE_LIMIT | TIF_GTC | | + | sellSideProvider | ETH/FEB23 | sell | 1 | 100000 | 0 | TYPE_LIMIT | TIF_GTC | | + + When the network moves ahead "1" blocks + Then the mark price should be "0" for the market "ETH/FEB23" + And the trading mode should be "TRADING_MODE_OPENING_AUCTION" for the market "ETH/FEB23" + + Then the oracles broadcast data with block time signed with "0xCAFECAFE1": + | name | value | time offset | + | prices.ETH.value | 16000 | -1s | + And the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | horizon | min bound | max bound | + | 0 | TRADING_MODE_OPENING_AUCTION | 5 | 15801 | 15999 | + + + When the network moves ahead "5" blocks + And the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | auction trigger | horizon | min bound | max bound | + | 16000 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 5 | 15900 | 16100 | + And the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | buySideProvider | ETH/FEB23 | buy | 1 | 14000 | 0 | TYPE_LIMIT | TIF_GTC | | + | sellSideProvider | ETH/FEB23 | sell | 1 | 14000 | 0 | TYPE_LIMIT | TIF_GTC | | + \ No newline at end of file diff --git a/core/integration/features/orders/cancel_all_orders.feature b/core/integration/features/orders/cancel_all_orders.feature new file mode 100644 index 0000000000..18a56fa518 --- /dev/null +++ b/core/integration/features/orders/cancel_all_orders.feature @@ -0,0 +1,84 @@ +Feature: Cancelling all orders emits a single event per party. + + 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 average block duration is "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 | 0 | + + 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 | + 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 | 0 | 10 | + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 100000000 | + | party2 | ETH | 100000000 | + | party3 | ETH | 100000000 | + | party4 | ETH | 100000000 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | party1 | ETH/DEC21 | 10000 | 0.001 | submission | + + Scenario: Parties cancel all their orders. + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | ETH/DEC21 | buy | 100 | 90 | 0 | TYPE_LIMIT | TIF_GTC | p2b1 | + | party3 | ETH/DEC21 | buy | 100 | 100 | 0 | TYPE_LIMIT | TIF_GTC | p3b1 | + | party3 | ETH/DEC21 | buy | 10 | 110 | 0 | TYPE_LIMIT | TIF_GTC | p3b2 | + | party4 | ETH/DEC21 | sell | 10 | 110 | 0 | TYPE_LIMIT | TIF_GTC | p4s2 | + | party4 | ETH/DEC21 | sell | 1000 | 190 | 0 | TYPE_LIMIT | TIF_GTC | p4s1 | + | party2 | ETH/DEC21 | sell | 1000 | 200 | 0 | TYPE_LIMIT | TIF_GTC | p2s1 | + + When the network moves ahead "2" blocks + Then the following trades should be executed: + | buyer | price | size | seller | + | party3 | 110 | 10 | party4 | + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + Then the orders should have the following states: + | party | market id | side | volume | remaining | price | status | + | party2 | ETH/DEC21 | buy | 100 | 100 | 90 | STATUS_ACTIVE | + | party3 | ETH/DEC21 | buy | 100 | 100 | 100 | STATUS_ACTIVE | + | party4 | ETH/DEC21 | sell | 1000 | 1000 | 190 | STATUS_ACTIVE | + | party2 | ETH/DEC21 | sell | 1000 | 1000 | 200 | STATUS_ACTIVE | + + When the parties cancel all their orders for the markets: + | party | market id | + | party2 | ETH/DEC21 | + Then the following orders are cancelled on market "ETH/DEC21": + | reference | party | + | p2b1 | party2 | + | p2s1 | party2 | + And the orders should have the following states: + | party | market id | side | volume | remaining | price | status | + | party2 | ETH/DEC21 | buy | 100 | 100 | 90 | STATUS_CANCELLED | + | party3 | ETH/DEC21 | buy | 100 | 100 | 100 | STATUS_ACTIVE | + | party4 | ETH/DEC21 | sell | 1000 | 1000 | 190 | STATUS_ACTIVE | + | party2 | ETH/DEC21 | sell | 1000 | 1000 | 200 | STATUS_CANCELLED | diff --git a/core/integration/features/orders/market-depth-4.feature b/core/integration/features/orders/market-depth-4.feature index 3fc43127cf..56a98101db 100644 --- a/core/integration/features/orders/market-depth-4.feature +++ b/core/integration/features/orders/market-depth-4.feature @@ -10,7 +10,7 @@ Feature: Test market depth events for pegged orders (cancelling pegged orders) | limits.markets.maxPeggedOrders | 1500 | | network.markPriceUpdateMaximumFrequency | 0s | - @Depth + @Depth @OrdCan Scenario: Check order events with larger pegged orders, and lower balance; check cancelling all orders for a party per market 0033-OCAN-010 # setup accounts Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/orders/spot-amend-order.feature b/core/integration/features/orders/spot-amend-order.feature new file mode 100644 index 0000000000..1c61cc999a --- /dev/null +++ b/core/integration/features/orders/spot-amend-order.feature @@ -0,0 +1,315 @@ +Feature: Amend spot orders + + Background: + Given 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 spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | my-simple-risk-model | 1 | fees-config-1 | default-none | default-basic | + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 1000 | + | party2 | BTC | 100 | + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + + Scenario: Reduce size with delta success and not losing position in order book (0004-AMND-0032) + # setup accounts + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | myboi | BTC | 10000 | + | myboi | ETH | 10000 | + | myboi2 | BTC | 10000 | + | myboi2 | ETH | 10000 | + | myboi3 | BTC | 10000 | + | myboi3 | ETH | 10000 | + | aux | BTC | 100000 | + | aux | ETH | 100000 | + | aux2 | BTC | 100000 | + | aux2 | ETH | 100000 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | myboi | BTC/ETH | sell | 10 | 2 | 0 | TYPE_LIMIT | TIF_GTC | myboi-ref-1 | + | myboi2 | BTC/ETH | sell | 5 | 2 | 0 | TYPE_LIMIT | TIF_GTC | myboi2-ref-1 | + + # reducing size with delta + Then the parties amend the following orders: + | party | reference | price | size delta | tif | + | myboi | myboi-ref-1 | 0 | -2 | TIF_GTC | + + And the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | myboi | BTC/ETH | myboi-ref-1 | sell | 8 | 8 | 2 | STATUS_ACTIVE | + + # matching the order now + # this should match with the size 3 order of myboi + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | myboi3 | BTC/ETH | buy | 3 | 2 | 1 | TYPE_LIMIT | TIF_GTC | myboi3-ref-1 | + + Then the following trades should be executed: + | buyer | seller | price | size | + | myboi3 | myboi | 2 | 3 | + + And the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | myboi | BTC/ETH | myboi-ref-1 | sell | 8 | 5 | 2 | STATUS_ACTIVE | + + # reducing size with target + When the parties amend the following orders: + | party | reference | price | size | tif | + | myboi | myboi-ref-1 | 0 | 6 | TIF_GTC | + + Then the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | myboi | BTC/ETH | myboi-ref-1 | sell | 6 | 3 | 2 | STATUS_ACTIVE | + + Scenario: Increase size success and loosing position in order book (0004-AMND-033) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | myboi | BTC | 10000 | + | myboi2 | BTC | 10000 | + | myboi3 | BTC | 100000000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | myboi | ETH | 10000 | + | myboi2 | ETH | 10000 | + | myboi3 | ETH | 100000000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | myboi | BTC/ETH | sell | 5 | 2 | 0 | TYPE_LIMIT | TIF_GTC | myboi-ref-1 | + | myboi2 | BTC/ETH | sell | 5 | 2 | 0 | TYPE_LIMIT | TIF_GTC | myboi-ref-2 | + + And the parties amend the following orders: + | party | reference | price | size delta | tif | + | myboi | myboi-ref-1 | 0 | 3 | TIF_GTC | + + Then the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | myboi | BTC/ETH | myboi-ref-1 | sell | 8 | 8 | 2 | STATUS_ACTIVE | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | myboi3 | BTC/ETH | buy | 3 | 2 | 1 | TYPE_LIMIT | TIF_GTC | myboi-ref-3 | + + Then the following trades should be executed: + | buyer | seller | price | size | + | myboi3 | myboi2 | 2 | 3 | + + And the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | myboi | BTC/ETH | myboi-ref-1 | sell | 8 | 8 | 2 | STATUS_ACTIVE | + | myboi2 | BTC/ETH | myboi-ref-2 | sell | 5 | 2 | 2 | STATUS_ACTIVE | + + When the parties amend the following orders: + | party | reference | price | size | tif | + | myboi2 | myboi-ref-2 | 0 | 10 | TIF_GTC | + + Then the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | myboi | BTC/ETH | myboi-ref-1 | sell | 8 | 8 | 2 | STATUS_ACTIVE | + | myboi2 | BTC/ETH | myboi-ref-2 | sell | 10 | 7 | 2 | STATUS_ACTIVE | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | myboi3 | BTC/ETH | buy | 3 | 2 | 1 | TYPE_LIMIT | TIF_GTC | myboi-ref-3 | + + Then the following trades should be executed: + | buyer | seller | price | size | + | myboi3 | myboi | 2 | 3 | + And the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | myboi | BTC/ETH | myboi-ref-1 | sell | 8 | 5 | 2 | STATUS_ACTIVE | + | myboi2 | BTC/ETH | myboi-ref-2 | sell | 10 | 7 | 2 | STATUS_ACTIVE | + + Scenario: Reduce size success and order cancelled as remaining is less than or equal to 0 (0004-AMND-058) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | myboi | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | myboi | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | myboi | BTC/ETH | sell | 5 | 2 | 0 | TYPE_LIMIT | TIF_GTC | myboi-ref-1 | + + And the parties amend the following orders: + | party | reference | price | size delta | tif | + | myboi | myboi-ref-1 | 0 | -5 | TIF_GTC | + + Then the orders should have the following status: + | party | reference | status | + | myboi | myboi-ref-1 | STATUS_CANCELLED | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | myboi | BTC/ETH | sell | 5 | 2 | 0 | TYPE_LIMIT | TIF_GTC | myboi-ref-1 | + + And the parties amend the following orders: + | party | reference | price | size | tif | + | myboi | myboi-ref-1 | 0 | 0 | TIF_GTC | + + Then the orders should have the following status: + | party | reference | status | + | myboi | myboi-ref-1 | STATUS_CANCELLED | + + Scenario: Amend to invalid tif is rejected (0004-AMND-034) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | myboi | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | myboi | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + + # 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 | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | myboi | BTC/ETH | sell | 5 | 2 | 0 | TYPE_LIMIT | TIF_GTC | myboi-ref-1 | + + + # cannot amend TIF to TIF_FOK so this will be rejected + Then the parties amend the following orders: + | party | reference | price | size delta | tif | error | + | myboi | myboi-ref-1 | 0 | 0 | TIF_FOK | OrderError: Cannot amend TIF to FOK or IOC | + + Scenario: TIF_GTC to TIF_GTT rejected without expiry (0004-AMND-034) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | myboi | BTC | 10000 | + | aux | BTC | 100000 | + | myboi | ETH | 10000 | + | aux | ETH | 100000 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | myboi | BTC/ETH | sell | 5 | 2 | 0 | TYPE_LIMIT | TIF_GTC | myboi-ref-1 | + + # TIF_GTT rejected because of missing expiration date + Then the parties amend the following orders: + | party | reference | price | size delta | tif | error | + | myboi | myboi-ref-1 | 0 | 0 | TIF_GTT | OrderError: Cannot amend order to GTT without an expiryAt field | + + Scenario: TIF_GTC to TIF_GTT with time in the past (0004-AMND-034) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | myboi | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | myboi | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | myboi | BTC/ETH | sell | 5 | 2 | 0 | TYPE_LIMIT | TIF_GTC | myboi-ref-1 | + + # reducing size, remaining goes from 2 to -1, this will cancel + Then the parties amend the following orders: + | party | reference | price | expiration date | size delta | tif | + | myboi | myboi-ref-1 | 2 | 2030-11-30T00:00:00Z | 0 | TIF_GTT | + + Scenario: Any attempt to amend to or from the TIF values GFA and GFN will result in a rejected amend (0004-AMND-035) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | myboi | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | myboi | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | myboi | BTC/ETH | sell | 5 | 2 | 0 | TYPE_LIMIT | TIF_GTC | myboi-ref-1 | + + Then the parties amend the following orders: + | party | reference | price | tif | error | + | myboi | myboi-ref-1 | 2 | TIF_GFA | OrderError: Cannot amend TIF to GFA or GFN | + | myboi | myboi-ref-1 | 2 | TIF_GFN | OrderError: Cannot amend TIF to GFA or GFN | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | myboi | BTC/ETH | sell | 1 | 2 | 0 | TYPE_LIMIT | TIF_GFN | myboi-ref-2 | + + Then the parties amend the following orders: + | party | reference | price | tif | error | + | myboi | myboi-ref-2 | 2 | TIF_GTC | OrderError: Cannot amend TIF from GFA or GFN | + diff --git a/core/integration/features/orders/spot_trader_amends_his_orders.feature b/core/integration/features/orders/spot_trader_amends_his_orders.feature new file mode 100644 index 0000000000..f7b02f2ad5 --- /dev/null +++ b/core/integration/features/orders/spot_trader_amends_his_orders.feature @@ -0,0 +1,161 @@ +Feature: Spot trader amends his orders + + Background: + Given 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 spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | my-simple-risk-model | 1 | fees-config-1 | default-none | default-basic | + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + + @AmendBug + Scenario: 008 Amending expiry time of an active GTT order to a past time whilst also simultaneously amending the price of the order will cause the order to immediately expire with the order details updated to reflect the order details requiring amendment (0004-AMND-048) + Given time is updated to "2019-11-30T00:00:00Z" + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | trader1 | BTC | 10000 | + | trader2 | BTC | 10000 | + | trader3 | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + + # 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 | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + When time is updated to "2019-11-30T00:00:04Z" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | expires in | reference | + | trader1 | BTC/ETH | sell | 3 | 1000 | 0 | TYPE_LIMIT | TIF_GTT | 3600 | GTT-ref-1 | + # trader1 amend expiration date and price at the simultaneously + And the parties amend the following orders: + | party | reference | price | size delta | expiration date | tif | + | trader1 | GTT-ref-1 | 1002 | 0 | 2019-11-30T00:00:05Z | TIF_GTT | + And the order book should have the following volumes for market "BTC/ETH": + | side | price | volume | + | sell | 1000 | 0 | + | sell | 1002 | 3 | + | sell | 10001 | 1 | + + When time is updated to "2020-01-30T00:00:00Z" + + And the order book should have the following volumes for market "BTC/ETH": + | side | price | volume | + | sell | 1000 | 0 | + | sell | 1002 | 0 | + | sell | 10001 | 1 | + + When time is updated to "2020-01-30T10:00:00Z" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | expires in | reference | + | trader2 | BTC/ETH | sell | 5 | 1005 | 0 | TYPE_LIMIT | TIF_GTT | 3600 | GTT-ref-2 | + # trader2 amend expiration date only + And the parties amend the following orders: + | party | reference | price | size delta | expiration date | tif | + | trader2 | GTT-ref-2 | 1005 | 0 | 2020-01-30T10:00:01Z | TIF_GTT | + And the order book should have the following volumes for market "BTC/ETH": + | side | price | volume | + | sell | 1000 | 0 | + | sell | 1005 | 5 | + | sell | 10001 | 1 | + When time is updated to "2020-01-30T12:00:01Z" + + And the order book should have the following volumes for market "BTC/ETH": + | side | price | volume | + | sell | 1000 | 0 | + | sell | 1005 | 0 | + | sell | 10001 | 1 | + + When time is updated to "2020-01-30T12:01:01Z" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | expires in | reference | + | trader3 | BTC/ETH | sell | 6 | 1006 | 0 | TYPE_LIMIT | TIF_GTT | 3600 | GTT-ref-3 | + + And the order book should have the following volumes for market "BTC/ETH": + | side | price | volume | + | sell | 1006 | 6 | + | sell | 10001 | 1 | + + When time is updated to "2020-02-01T12:00:01Z" + + And the order book should have the following volumes for market "BTC/ETH": + | side | price | volume | + | sell | 1006 | 0 | + | sell | 10001 | 1 | + + Scenario: In Spot market amending an order in a way that increases the volume sufficiently leads to holding account balance increasing (0004-AMND-049). In Spot market amending an order in a way that decreases the volume sufficiently leads to holding account balance decreasing (0004-AMND-050). In Spot market, if an order is amended such that holding requirement is increased and user has sufficient balance in the general account to top up their holding account then the amendment is executed successfully (0011-MARA-018). + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | trader1 | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + + # 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 | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 2 | 0 | TYPE_LIMIT | TIF_GTC | + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + When time is updated to "2019-11-30T00:00:04Z" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | trader1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | GTC-ref-1 | + + Then "trader1" should have general account balance of "9999" for asset "BTC" + Then "trader1" should have holding account balance of "1" for asset "BTC" + + # trader1 amend increase volumne should increase holding account balance + And the parties amend the following orders: + | party | reference | price | size delta | tif | + | trader1 | GTC-ref-1 | 1000 | 4 | TIF_GTC | + + Then "trader1" should have general account balance of "9995" for asset "BTC" + Then "trader1" should have holding account balance of "5" for asset "BTC" + + # trader1 amend increase volumne should decrease holding account balance + And the parties amend the following orders: + | party | reference | price | size delta | tif | + | trader1 | GTC-ref-1 | 1000 | -2 | TIF_GTC | + + Then "trader1" should have general account balance of "9997" for asset "BTC" + Then "trader1" should have holding account balance of "3" for asset "BTC" + + # trader1 amend increase volumne has insufficient funds, amend should fail and order should remain unchanged 0011-MARA-019 + And the parties amend the following orders: + | party | reference | price | size delta | tif | error | + | trader1 | GTC-ref-1 | 1000 | 9998 | TIF_GTC | party does not have sufficient balance to cover the new size | + + Then "trader1" should have general account balance of "9997" for asset "BTC" + Then "trader1" should have holding account balance of "3" for asset "BTC" + + And the orders should have the following status: + | party | reference | status | + | trader1 | GTC-ref-1 | STATUS_ACTIVE | \ No newline at end of file diff --git a/core/integration/features/orders/stoporders.feature b/core/integration/features/orders/stoporders.feature index 9682a62002..70289f28aa 100644 --- a/core/integration/features/orders/stoporders.feature +++ b/core/integration/features/orders/stoporders.feature @@ -598,7 +598,6 @@ Feature: stop orders | party | market id | side | volume | remaining | price | status | reference | | party1 | ETH/DEC19 | buy | 10 | 0 | 0 | STATUS_FILLED | stop1 | - @NoPerp Scenario: If the order is triggered before reaching time T, the order will have been removed and will not trigger at time T. (0014-ORDT-054) (0014-ORDT-041) # setup accounts @@ -1625,7 +1624,6 @@ Feature: stop orders | party1 | 1 | 10 | 0 | - @NoPerp Scenario: If the order is triggered before reaching time T, the order will have been removed and will not trigger at time T. (0014-ORDT-054) (0014-ORDT-041) # setup accounts diff --git a/core/integration/features/orders/stoporders_spot-auctions.feature b/core/integration/features/orders/stoporders_spot-auctions.feature new file mode 100644 index 0000000000..ee7523a262 --- /dev/null +++ b/core/integration/features/orders/stoporders_spot-auctions.feature @@ -0,0 +1,548 @@ +Feature: stop orders + Background: + Given time is updated to "2020-10-16T00:00:00Z" + And the price monitoring named "my-price-monitoring": + | horizon | probability | auction extension | + | 60 | 0.95 | 240 | + | 600 | 0.99 | 360 | + And the simple risk model named "my-simple-risk-model": + | long | short | max move up | min move down | probability of trading | + | 0.11 | 0.1 | 10 | 11 | 0.1 | + Given the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | my-simple-risk-model | 240 | default-none | my-price-monitoring | default-futures | + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 240 | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 2 | + | spam.protection.max.stopOrdersPerMarket | 5 | + + Scenario: A stop order placed either prior to or during an auction will not execute during an auction, nor will it participate in the uncrossing. (0014-ORDT-147) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | aux | ETH | 100000000000 | + | aux2 | ETH | 100000000000 | + | lpprov | ETH | 100000000000 | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | aux | BTC | 100000000000 | + | aux2 | BTC | 100000000000 | + | lpprov | BTC | 100000000000 | + + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + # place auxiliary orders so we always have best bid and best offer as to not trigger the liquidity auction + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 25 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 134 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "100" for the market "BTC/ETH" + And time is updated to "2020-10-16T00:10:00Z" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 100 | 1 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And the mark price should be "100" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 111 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 111 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + And the mark price should be "100" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb trailing | reference | + | party1 | BTC/ETH | buy | 1 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 0.05 | tstop | + + # Now we make sure the trailing stop is working correctly + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_PENDING | tstop | + + # Now let's move back out of auction + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And time is updated to "2020-10-16T00:15:00Z" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "105" for the market "BTC/ETH" + + # The stop should still be waiting and has not been triggered + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_PENDING | tstop | + + # Move the mark price down by <10% to not trigger the stop orders + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | BTC/ETH | buy | 1 | 102 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 102 | 1 | TYPE_LIMIT | TIF_GTC | + And then the network moves ahead "5" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "102" for the market "BTC/ETH" + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_PENDING | tstop | + + # Move the mark price down by 10% to trigger the orders + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 2 | 95 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 2 | 95 | 2 | TYPE_LIMIT | TIF_GTC | + And then the network moves ahead "10" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "95" for the market "BTC/ETH" + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_TRIGGERED | tstop | + + Scenario: A stop order placed prior to an auction will not execute during an auction, nor will it participate in the uncrossing. (0014-ORDT-149) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | aux | ETH | 100000000000 | + | aux2 | ETH | 100000000000 | + | lpprov | ETH | 100000000000 | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | aux | BTC | 100000000000 | + | aux2 | BTC | 100000000000 | + | lpprov | BTC | 100000000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + # place auxiliary orders so we always have best bid and best offer as to not trigger the liquidity auction + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 25 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 134 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "100" for the market "BTC/ETH" + And time is updated to "2020-10-16T00:10:00Z" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 100 | 1 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And the mark price should be "100" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb trailing | reference | + | party1 | BTC/ETH | buy | 1 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 0.05 | tstop | + + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 111 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 111 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + And the mark price should be "100" for the market "BTC/ETH" + + # Now we make sure the trailing stop is working correctly + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_PENDING | tstop | + + # Now let's move back out of auction + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And time is updated to "2020-10-16T00:15:00Z" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "105" for the market "BTC/ETH" + + # The stop should still be waiting and has not been triggered + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_PENDING | tstop | + + # Move the mark price down by <10% to not trigger the stop orders + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | BTC/ETH | buy | 1 | 102 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 102 | 1 | TYPE_LIMIT | TIF_GTC | + And then the network moves ahead "5" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "102" for the market "BTC/ETH" + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_PENDING | tstop | + + # Move the mark price down by 10% to trigger the orders + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 2 | 95 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 2 | 95 | 2 | TYPE_LIMIT | TIF_GTC | + And then the network moves ahead "10" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "95" for the market "BTC/ETH" + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_TRIGGERED | tstop | + + Scenario: A stop order placed during an auction, where the uncrossing price is within the triggering range, will immediately execute following uncrossing. (0014-ORDT-148) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | aux | ETH | 100000000000 | + | aux2 | ETH | 100000000000 | + | lpprov | ETH | 100000000000 | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | aux | BTC | 100000000000 | + | aux2 | BTC | 100000000000 | + | lpprov | BTC | 100000000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + # place auxiliary orders so we always have best bid and best offer as to not trigger the liquidity auction + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 25 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 134 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "100" for the market "BTC/ETH" + And time is updated to "2020-10-16T00:10:00Z" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 100 | 1 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And the mark price should be "100" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux | BTC/ETH | sell | 1 | 85 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | aux2 | BTC/ETH | buy | 1 | 85 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + And the mark price should be "100" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb trailing | reference | + | party1 | BTC/ETH | buy | 1 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 0.01 | tstop | + + # Now we make sure the trailing stop is working correctly + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_PENDING | tstop | + + # Now let's move back out of auction + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And time is updated to "2020-10-16T00:15:00Z" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "92" for the market "BTC/ETH" + + # The stop should still be waiting and has not been triggered + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_TRIGGERED | tstop | + + # check that the order got submitted (it will be stopped due to self trading) + Then the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | buy | 1 | 1 | 0 | STATUS_STOPPED | tstop | + + Scenario: A stop order placed prior to an auction, where the uncrossing price is within the triggering range, will immediately execute following uncrossing (0014-ORDT-150) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | aux | ETH | 100000000000 | + | aux2 | ETH | 100000000000 | + | lpprov | ETH | 100000000000 | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | aux | BTC | 100000000000 | + | aux2 | BTC | 100000000000 | + | lpprov | BTC | 100000000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + # place auxiliary orders so we always have best bid and best offer as to not trigger the liquidity auction + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 25 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 134 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "100" for the market "BTC/ETH" + And time is updated to "2020-10-16T00:10:00Z" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb trailing | reference | + | party1 | BTC/ETH | buy | 1 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 0.01 | tstop | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 100 | 1 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And the mark price should be "100" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux | BTC/ETH | sell | 1 | 85 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | aux2 | BTC/ETH | buy | 1 | 85 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + And the mark price should be "100" for the market "BTC/ETH" + + # Now we make sure the trailing stop is working correctly + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_PENDING | tstop | + + # Now let's move back out of auction + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And time is updated to "2020-10-16T00:15:00Z" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "92" for the market "BTC/ETH" + + # The stop should still be waiting and has not been triggered + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_TRIGGERED | tstop | + + # check that the order got submitted (it will be stopped due to self trading) + Then the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | buy | 1 | 1 | 0 | STATUS_STOPPED | tstop | + + Scenario: An order with a stop is placed during continuous trading. The market goes into auction. The market exits auction, the condition for triggering the stop is not met. The stop order is still present. (0014-ORDT-151) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | aux | ETH | 100000000000 | + | aux2 | ETH | 100000000000 | + | lpprov | ETH | 100000000000 | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | aux | BTC | 100000000000 | + | aux2 | BTC | 100000000000 | + | lpprov | BTC | 100000000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + # place auxiliary orders so we always have best bid and best offer as to not trigger the liquidity auction + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 25 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 134 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "100" for the market "BTC/ETH" + And time is updated to "2020-10-16T00:10:00Z" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb trailing | reference | + | party1 | BTC/ETH | buy | 1 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 0.05 | tstop | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 100 | 1 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And the mark price should be "100" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 111 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 111 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + And the mark price should be "100" for the market "BTC/ETH" + + # Now we make sure the trailing stop is working correctly + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_PENDING | tstop | + + # Now let's move back out of auction + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And time is updated to "2020-10-16T00:15:00Z" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "105" for the market "BTC/ETH" + + # The stop should still be waiting and has not been triggered + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_PENDING | tstop | + + Scenario: A stop order placed during the opening auction, will be rejected. For spot products (0014-ORDT-153) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb trailing | reference | error | + | party1 | BTC/ETH | buy | 1 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 0.05 | tstop | stop orders are not accepted during the opening auction | + + Scenario: A party places a stop order on a market in continuous trading, the market moves to an auction and the party cancels the stop order. When the market exits the auction the party no longer has a stop order. For spot products (0014-ORDT-152) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | aux | ETH | 100000000000 | + | aux2 | ETH | 100000000000 | + | lpprov | ETH | 100000000000 | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | aux | BTC | 100000000000 | + | aux2 | BTC | 100000000000 | + | lpprov | BTC | 100000000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + # place auxiliary orders so we always have best bid and best offer as to not trigger the liquidity auction + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 25 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 134 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "100" for the market "BTC/ETH" + And time is updated to "2020-10-16T00:10:00Z" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb trailing | reference | + | party1 | BTC/ETH | buy | 1 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 0.01 | tstop | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 100 | 1 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And the mark price should be "100" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux | BTC/ETH | sell | 1 | 85 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | aux2 | BTC/ETH | buy | 1 | 85 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + And the mark price should be "100" for the market "BTC/ETH" + + # Now we make sure the trailing stop is working correctly + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_PENDING | tstop | + + # cancel the stop order + Then the parties cancel the following stop orders: + | party | reference | + | party1 | tstop | + + # Now let's move back out of auction + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | + | party2 | BTC/ETH | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | + + And time is updated to "2020-10-16T00:15:00Z" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "92" for the market "BTC/ETH" + + # The stop should has been cancelled and never triggered + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_CANCELLED | tstop | diff --git a/core/integration/features/orders/stoporders_spot.feature b/core/integration/features/orders/stoporders_spot.feature new file mode 100644 index 0000000000..2abaa2372f --- /dev/null +++ b/core/integration/features/orders/stoporders_spot.feature @@ -0,0 +1,1695 @@ +Feature: stop orders + + Background: + Given the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | default-simple-risk-model-3 | 1 | default-none | default-none | default-futures | + | USDT/ETH | USDT/ETH | USDT | ETH | default-log-normal-risk-model | 1 | default-none | default-basic | default-futures | + + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 1500 | + | spam.protection.max.stopOrdersPerMarket | 5 | + + @NoPerp + Scenario: If the order is triggered before reaching time T, the order will have been removed and will not trigger at time T. (0014-ORDT-175) (0014-ORDT-124) + Given time is updated to "2019-11-30T00:00:00Z" + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 1000000 | + | party2 | BTC | 1000000 | + | party3 | BTC | 1000000 | + | aux | BTC | 1000000 | + | aux2 | BTC | 1000000 | + | aux3 | BTC | 1000000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 1000000 | + | party2 | ETH | 1000000 | + | party3 | ETH | 1000000 | + | aux | ETH | 1000000 | + | aux2 | ETH | 1000000 | + | aux3 | ETH | 1000000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 900000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 900000 | 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 | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux3 | BTC/ETH | sell | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + Given time is updated to "2019-11-30T00:00:10Z" + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 20 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 20 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + # volume for the stop trade + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | buy | 20 | 20 | 0 | TYPE_LIMIT | TIF_GTC | + # create party1 stop order, no trade resulting, expires in 10 secs + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb price trigger | error | reference | fb expires in | fb expiry strategy | + | party1 | BTC/ETH | sell | 10 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 25 | | stop1 | 10 | EXPIRY_STRATEGY_SUBMIT | + # trigger the stop order + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party2 | BTC/ETH | buy | 1 | 24 | 0 | TYPE_LIMIT | TIF_GTC | + | party3 | BTC/ETH | sell | 1 | 24 | 1 | TYPE_LIMIT | TIF_GTC | + # check the stop order is filled + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_TRIGGERED | stop1 | + + # add 20 secs, should expire + Given time is updated to "2019-11-30T00:00:30Z" + # check the stop order was not triggered a second at time T + # bought 20, sold 10 with the stop order + Then "party1" should have general account balance of "1000010" for asset "BTC" + + Scenario: Attempting to create more stop orders than is allowed by the relevant network parameter will result in the transaction failing to execute. (0014-ORDT-126) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb price trigger | error | + | party1 | BTC/ETH | sell | 10 | 60 | 0 | TYPE_LIMIT | TIF_GTC | | | | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 47 | | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 47 | | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 47 | | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 47 | | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 47 | | + # this next one goes over the top + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 47 | max stop orders per party reached | + + Scenario: An OCO stop order with expiration time T with one side set to execute at that time will execute at time T (0014-ORDT-165) + Given time is updated to "2019-11-30T00:00:00Z" + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000000 | + | party2 | BTC | 10000000 | + | party3 | BTC | 10000000 | + | aux | BTC | 10000000 | + | aux2 | BTC | 10000000 | + | aux3 | BTC | 100000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000000 | + | party2 | ETH | 10000000 | + | party3 | ETH | 10000000 | + | aux | ETH | 10000000 | + | aux2 | ETH | 10000000 | + | aux3 | ETH | 100000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 100 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 100 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux3 | BTC/ETH | sell | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | buy | 10 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party3 | BTC/ETH | buy | 10 | 51 | 0 | TYPE_LIMIT | TIF_GTC | + + When time is updated to "2019-11-30T00:00:10Z" + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | ra price trigger | fb price trigger | reference | ra expires in | ra expiry strategy | fb expires in | fb expiry strategy | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 75 | 25 | stop | 10 | EXPIRY_STRATEGY_SUBMIT | 15 | EXPIRY_STRATEGY_SUBMIT | + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_PENDING | stop-1 | + | party1 | BTC/ETH | STATUS_PENDING | stop-2 | + + Then clear all events + When time is updated to "2019-11-30T00:00:20Z" + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_STOPPED | stop-1 | + | party1 | BTC/ETH | STATUS_EXPIRED | stop-2 | + + # Now perform the same test but from the other side + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | ra price trigger | fb price trigger | reference | ra expires in | ra expiry strategy | fb expires in | fb expiry strategy | + | party2 | BTC/ETH | sell | 10 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 75 | 25 | stop2 | 15 | EXPIRY_STRATEGY_SUBMIT | 10 | EXPIRY_STRATEGY_SUBMIT | + + Then the stop orders should have the following states + | party | market id | status | reference | + | party2 | BTC/ETH | STATUS_PENDING | stop2-1 | + | party2 | BTC/ETH | STATUS_PENDING | stop2-2 | + + Then clear all events + When time is updated to "2019-11-30T00:00:30Z" + + Then the stop orders should have the following states + | party | market id | status | reference | + | party2 | BTC/ETH | STATUS_STOPPED | stop2-2 | + | party2 | BTC/ETH | STATUS_EXPIRED | stop2-1 | + + Scenario: If a pair of stop orders are specified as OCO, one being triggered also removes the other from the book. (0014-ORDT-166) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | party3 | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | party3 | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 10 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + # create party1 stop order, results in a trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb price trigger | ra price trigger | error | reference | + | party1 | BTC/ETH | sell | 10 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 25 | 75 | | stop1 | + + # volume for the stop trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | buy | 10 | 20 | 0 | TYPE_LIMIT | TIF_GTC | + + # now we trade at 75, 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 | sell | 10 | 25 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | buy | 10 | 25 | 1 | TYPE_LIMIT | TIF_GTC | + + # check that the order got submitted + Then the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | sell | 10 | 0 | 0 | STATUS_FILLED | stop1-1 | + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_TRIGGERED | stop1-1 | + | party1 | BTC/ETH | STATUS_STOPPED | stop1-2 | + + Scenario: A stop order wrapping a limit order will, once triggered, place the limit order as if it just arrived as an order without the stop order wrapping. (0014-ORDT-167) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 1000000 | + | party2 | BTC | 1000000 | + | party3 | BTC | 1000000 | + | aux | BTC | 1000000 | + | aux2 | BTC | 1000000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 1000000 | + | party2 | ETH | 1000000 | + | party3 | ETH | 1000000 | + | aux | ETH | 1000000 | + | aux2 | ETH | 1000000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 900000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 900000 | 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 | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # setup party1 position, open a 10 short position + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | buy | 10 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + # 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 | + | party3 | BTC/ETH | sell | 10 | 80 | 0 | TYPE_LIMIT | TIF_GTC | + # 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 | 5 | 80 | 0 | TYPE_LIMIT | TIF_IOC | reduce | 75 | | stop1 | + + # now we trade at 75, 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 | 10 | 75 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 10 | 75 | 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 | + And the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | buy | 5 | 0 | 80 | STATUS_FILLED | stop1 | + + Scenario: With a last traded price at 50, a stop order placed with Rises Above setting at 75 will be triggered by any trade at price 75 or higher. (0014-ORDT-168) (0014-ORDT-169) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | party3 | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | party3 | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # setup party1 position, open a 10 short position + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | buy | 10 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + # create party1 stop order + When 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 | 10 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 75 | | stop1 | + + # volume for the stop trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | sell | 20 | 80 | 0 | TYPE_LIMIT | TIF_GTC | + + + # now we trade at 75, 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 | 10 | 75 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 10 | 75 | 1 | TYPE_LIMIT | TIF_GTC | + + # check that the order got submitted + Then the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | STATUS_FILLED | stop1 | + + Scenario: With a last traded price at 50, a stop order placed with Rises Above setting at 25 will be triggered immediately (before another trade is even necessary). (0014-ORDT-170) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | party3 | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | party3 | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # setup party1 position, open a 10 long position + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 10 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + # volume for the stop trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | buy | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + + # create party1 stop order, results in a trade + When 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 | sell | 10 | 0 | 1 | TYPE_MARKET | TIF_IOC | reduce | 25 | | stop1 | + + + # check that the order got submitted + Then the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | sell | 10 | 0 | 0 | STATUS_FILLED | stop1 | + + Scenario: With a last traded price at 50, a stop order placed with Falls Below setting at 25 will be triggered by any trade at price 25 or lower. (0014-ORDT-171) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | party3 | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | party3 | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # setup party1 position, open a 10 short position + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 10 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + # create party1 stop order, results in a trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb price trigger | error | reference | + | party1 | BTC/ETH | sell | 10 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 25 | | stop1 | + + # volume for the stop trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | buy | 10 | 20 | 0 | TYPE_LIMIT | TIF_GTC | + + # now we trade at 75, 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 | sell | 10 | 25 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | buy | 10 | 25 | 1 | TYPE_LIMIT | TIF_GTC | + + # check that the order got submitted + Then the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | sell | 10 | 0 | 0 | STATUS_FILLED | stop1 | + + Scenario: With a last traded price at 50, a stop order placed with Falls Below setting at 75 will be triggered immediately (before another trade is even necessary). (0014-ORDT-172) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | party3 | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | party3 | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 5 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 5 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # setup party1 position, open a 10 long position + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | buy | 10 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + # volume for the stop trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + + # create party1 stop order, results in a trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb price trigger | error | reference | + | party1 | BTC/ETH | buy | 10 | 0 | 1 | TYPE_MARKET | TIF_IOC | reduce | 75 | | stop1 | + + + # check that the order got submitted + Then the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | STATUS_FILLED | stop1 | + + Scenario: A stop order with expiration time T set to expire at that time will expire at time T if reached without being triggered. (0014-ORDT-173) + Given time is updated to "2019-11-30T00:00:00Z" + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | party3 | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | party3 | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # setup party1 position, open a 10 long position + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | buy | 10 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + # volume for the stop trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + When time is updated to "2019-11-30T00:00:10Z" + # create party1 stop order, no trade resulting, expires in 10 secs + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | ra price trigger | error | reference | ra expires in | ra expiry strategy | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 75 | | stop1 | 10 | EXPIRY_STRATEGY_CANCELS | + + # add 20 secs, should expire + When time is updated to "2019-11-30T00:00:30Z" + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_EXPIRED | stop1 | + + Scenario: A stop order with expiration time T set to execute at that time will execute at time T if reached without being triggered. (0014-ORDT-174) + Given time is updated to "2019-11-30T00:00:00Z" + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | party3 | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | aux3 | BTC | 100000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | party3 | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + | aux3 | ETH | 100000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux3 | BTC/ETH | sell | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # setup party1 position, open a 10 long position + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | buy | 10 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + # volume for the stop trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + + When time is updated to "2019-11-30T00:00:10Z" + # create party1 stop order, no trade resulting, expires in 10 secs + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | ra price trigger | error | reference | ra expires in | ra expiry strategy | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 75 | | stop1 | 10 | EXPIRY_STRATEGY_SUBMIT | + + # add 20 secs, should expire + When time is updated to "2019-11-30T00:00:30Z" + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_EXPIRED | stop1 | + + # check that the order got submitted + Then the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | STATUS_FILLED | stop1 | + + Scenario: A stop order set to trade volume x with a trigger set to Rises Above at a given price will trigger at the first trade at or above that price. At this time the order will be placed on the book if and only if it would reduce the trader's absolute position (buying if they are short or selling if they are long) if executed (i.e. will execute as a reduce-only order). (0014-ORDT-177) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000000 | + | party2 | BTC | 10000000 | + | party3 | BTC | 10000000 | + | aux | BTC | 10000000 | + | aux2 | BTC | 10000000 | + | aux3 | BTC | 10000000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000000 | + | party2 | ETH | 10000000 | + | party3 | ETH | 10000000 | + | aux | ETH | 10000000 | + | aux2 | ETH | 10000000 | + | aux3 | ETH | 10000000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux3 | BTC/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # setup party1 position, open a 10 short position + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + Then the network moves ahead "1" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + Then "party1" should have general account balance of "10000001" for asset "BTC" + + # create party1 stop order, results in a trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb price trigger | error | reference | + | party1 | BTC/ETH | sell | 1 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 25 | | stop1 | + + # volume for the stop trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | buy | 10 | 20 | 0 | TYPE_LIMIT | TIF_GTC | + + # now we trade at 25, 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 | sell | 10 | 25 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | buy | 10 | 25 | 1 | TYPE_LIMIT | TIF_GTC | + + # check that the order got submitted + Then the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | sell | 1 | 0 | 0 | STATUS_FILLED | stop1 | + + Then the network moves ahead "1" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # after the volume has been reduced + Then "party1" should have general account balance of "10000000" for asset "BTC" + + Scenario: A trailing stop order for a 5% drop placed when the price is 50, followed by a price rise to 60 will, Be triggered by a fall to 57. (0014-ORDT-141), Not be triggered by a fall to 58. (0014-ORDT-142) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000000000 | + | party2 | BTC | 10000000000 | + | party3 | BTC | 10000000000 | + | aux | BTC | 10000000000 | + | aux2 | BTC | 10000000000 | + | lpprov | BTC | 9000000000 | + | party1 | ETH | 10000000000 | + | party2 | ETH | 10000000000 | + | party3 | ETH | 10000000000 | + | aux | ETH | 10000000000 | + | aux2 | ETH | 10000000000 | + | lpprov | ETH | 9000000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # setup party1 position, open a 10 long position + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + # create party1 stop order, results in a trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb trailing | error | reference | + | party1 | BTC/ETH | sell | 1 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 0.05 | | stop1 | + + # create volume to close party 1 + # high price sell so it doesn't trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 20 | 0 | TYPE_LIMIT | TIF_GTC | + + + # move prive to 60, nothing happen + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | BTC/ETH | buy | 1 | 60 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 60 | 1 | TYPE_LIMIT | TIF_GTC | + + Then the network moves ahead "1" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # check the volum as not reduced + Then "party1" should have general account balance of "10000000001" for asset "BTC" + + # move first to 58, nothing happen + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | BTC/ETH | buy | 1 | 58 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 58 | 1 | TYPE_LIMIT | TIF_GTC | + + Then the network moves ahead "1" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # check the volum as not reduced + Then "party1" should have general account balance of "10000000001" for asset "BTC" + + # move first to 57, nothing happen + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | BTC/ETH | buy | 1 | 57 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 57 | 1 | TYPE_LIMIT | TIF_GTC | + + # check that the order got submitted + Then the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | sell | 1 | 0 | 0 | STATUS_FILLED | stop1 | + + 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 "10000000000" for asset "BTC" + + Scenario: A trailing stop order for a 5% rise placed when the price is 50, followed by a drop to 40 will, Be triggered by a rise to 42. (0014-ORDT-143), Not be triggered by a rise to 41. (0014-ORDT-144) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000000000 | + | party2 | BTC | 10000000000 | + | party3 | BTC | 10000000000 | + | aux | BTC | 10000000000 | + | aux2 | BTC | 10000000000 | + | lpprov | BTC | 9000000000 | + | party1 | ETH | 10000000000 | + | party2 | ETH | 10000000000 | + | party3 | ETH | 10000000000 | + | aux | ETH | 10000000000 | + | aux2 | ETH | 10000000000 | + | lpprov | ETH | 9000000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # setup party1 position, open a 10 short position + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | buy | 1 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + # create party1 stop order, results in a trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | ra trailing | error | reference | + | party1 | BTC/ETH | buy | 1 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 0.05 | | stop1 | + + # create volume to close party 1 + # high price sell so it doesn't trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | sell | 1 | 70 | 0 | TYPE_LIMIT | TIF_GTC | + + + # move prive to 60, nothing happen + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | BTC/ETH | buy | 1 | 40 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 40 | 1 | TYPE_LIMIT | TIF_GTC | + + Then the network moves ahead "1" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # check the volum as not reduced + Then "party1" should have general account balance of "9999999999" for asset "BTC" + + # move first to 58, nothing happen + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | BTC/ETH | buy | 1 | 41 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 41 | 1 | TYPE_LIMIT | TIF_GTC | + + Then the network moves ahead "1" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # check the volum as not reduced + Then "party1" should have general account balance of "9999999999" for asset "BTC" + + # move first to 57, nothing happen + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | BTC/ETH | buy | 1 | 42 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 42 | 1 | TYPE_LIMIT | TIF_GTC | + + # check that the order got submitted + Then the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | buy | 1 | 0 | 0 | STATUS_FILLED | stop1 | + + 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 "10000000000" for asset "BTC" + + Scenario: A trailing stop order for a 25% drop placed when the price is 50, followed by a price rise to 60, then to 50, then another rise to 57 will:, Be triggered by a fall to 45. (0014-ORDT-145), Not be triggered by a fall to 46. (0014-ORDT-146) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000000000 | + | party2 | BTC | 10000000000 | + | party3 | BTC | 10000000000 | + | aux | BTC | 10000000000 | + | aux2 | BTC | 10000000000 | + | lpprov | BTC | 9000000000 | + | party1 | ETH | 10000000000 | + | party2 | ETH | 10000000000 | + | party3 | ETH | 10000000000 | + | aux | ETH | 10000000000 | + | aux2 | ETH | 10000000000 | + | lpprov | ETH | 9000000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # setup party1 position, open a 10 long position + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + # create party1 stop order, results in a trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb trailing | error | reference | + | party1 | BTC/ETH | sell | 1 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 0.25 | | stop1 | + + # create volume to close party 1 + # high price sell so it doesn't trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 20 | 0 | TYPE_LIMIT | TIF_GTC | + + + # move prive to 60, nothing happen + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | BTC/ETH | buy | 1 | 60 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 60 | 1 | TYPE_LIMIT | TIF_GTC | + + Then the network moves ahead "1" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # check the volume has not reduced + Then "party1" should have general account balance of "10000000001" for asset "BTC" + + # move first to 58, nothing happen + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + Then the network moves ahead "1" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # check the volum as not reduced + Then "party1" should have general account balance of "10000000001" for asset "BTC" + + # move first to 57, nothing happen + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | BTC/ETH | buy | 1 | 57 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 57 | 1 | TYPE_LIMIT | TIF_GTC | + + Then the network moves ahead "1" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # check the volum as not reduced + Then "party1" should have general account balance of "10000000001" for asset "BTC" + + # move first to 46, nothing happen + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | BTC/ETH | buy | 1 | 46 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 46 | 1 | TYPE_LIMIT | TIF_GTC | + + Then the network moves ahead "1" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # check the volum as not reduced + Then "party1" should have general account balance of "10000000001" for asset "BTC" + + # move first to 46, nothing happen + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | BTC/ETH | buy | 1 | 45 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 45 | 1 | TYPE_LIMIT | TIF_GTC | + + # check that the order got submitted + Then the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | sell | 1 | 0 | 0 | STATUS_FILLED | stop1 | + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_TRIGGERED | stop1 | + + Scenario: A Stop order that hasn't been triggered can be cancelled. (0014-ORDT-154) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb price trigger | error | reference | + | party1 | BTC/ETH | sell | 10 | 60 | 0 | TYPE_LIMIT | TIF_GTC | | | | | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 47 | | stop1 | + + Then the parties cancel the following stop orders: + | party | reference | + | party1 | stop1 | + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_CANCELLED | stop1 | + + @SLABug + Scenario: All stop orders for a specific party can be cancelled by a single stop order cancellation. (0014-ORDT-155) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 1000000 | + | party2 | BTC | 1000000 | + | aux | BTC | 1000000 | + | aux2 | BTC | 1000000 | + | lpprov | BTC | 900000000 | + | party1 | ETH | 1000000 | + | party2 | ETH | 1000000 | + | aux | ETH | 1000000 | + | aux2 | ETH | 1000000 | + | lpprov | ETH | 900000000 | + | party1 | USDT | 1000000 | + | party2 | USDT | 1000000 | + | aux | USDT | 1000000 | + | aux2 | USDT | 1000000 | + | lpprov | USDT | 900000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 900000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 900000 | 0.1 | submission | + | lp2 | lpprov | USDT/ETH | 900000 | 0.1 | submission | + | lp2 | lpprov | USDT/ETH | 900000 | 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 | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + | lpprov | USDT/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | USDT/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | USDT/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | USDT/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | USDT/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | USDT/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "2" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "USDT/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb price trigger | error | reference | + | party1 | BTC/ETH | sell | 10 | 60 | 0 | TYPE_LIMIT | TIF_GTC | | | | | + | party1 | BTC/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 47 | | stop1 | + | party1 | BTC/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 48 | | stop2 | + | party1 | USDT/ETH | sell | 10 | 60 | 0 | TYPE_LIMIT | TIF_GTC | | | | | + | party1 | USDT/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 49 | | stop3 | + | party1 | USDT/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 49 | | stop4 | + + Then the party "party1" cancels all their stop orders + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_CANCELLED | stop1 | + | party1 | BTC/ETH | STATUS_CANCELLED | stop2 | + | party1 | USDT/ETH | STATUS_CANCELLED | stop3 | + | party1 | USDT/ETH | STATUS_CANCELLED | stop4 | + + @SLABug + Scenario: All stop orders for a specific party for a specific market can be cancelled by a single stop order cancellation. (0014-ORDT-156) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 1000000 | + | party2 | BTC | 1000000 | + | aux | BTC | 1000000 | + | aux2 | BTC | 1000000 | + | lpprov | BTC | 900000000 | + | party1 | ETH | 1000000 | + | party2 | ETH | 1000000 | + | aux | ETH | 1000000 | + | aux2 | ETH | 1000000 | + | lpprov | ETH | 900000000 | + | party1 | USDT | 1000000 | + | party2 | USDT | 1000000 | + | aux | USDT | 1000000 | + | aux2 | USDT | 1000000 | + | lpprov | USDT | 900000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 900000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 900000 | 0.1 | submission | + | lp2 | lpprov | USDT/ETH | 900000 | 0.1 | submission | + | lp2 | lpprov | USDT/ETH | 900000 | 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 | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + | lpprov | USDT/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | USDT/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | USDT/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | USDT/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | USDT/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | USDT/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "2" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "USDT/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb price trigger | error | reference | + | party1 | BTC/ETH | sell | 10 | 60 | 0 | TYPE_LIMIT | TIF_GTC | | | | | + | party1 | BTC/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 47 | | stop1 | + | party1 | BTC/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 48 | | stop2 | + | party1 | USDT/ETH | sell | 10 | 60 | 0 | TYPE_LIMIT | TIF_GTC | | | | | + | party1 | USDT/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 49 | | stop3 | + | party1 | USDT/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 49 | | stop4 | + + Then the party "party1" cancels all their stop orders for the market "BTC/ETH" + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_CANCELLED | stop1 | + | party1 | BTC/ETH | STATUS_CANCELLED | stop2 | + | party1 | USDT/ETH | STATUS_PENDING | stop3 | + | party1 | USDT/ETH | STATUS_PENDING | stop4 | + + Scenario: An OCO stop order with expiration time T with both sides set to execute at that time will be rejected on submission (0014-ORDT-176) + # setup accounts + Given time is updated to "2019-11-30T00:00:00Z" + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | party3 | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | aux3 | BTC | 100000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | party3 | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + | aux3 | ETH | 100000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + # 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 | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux3 | BTC/ETH | sell | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | buy | 10 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + # volume for the stop trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + + When time is updated to "2019-11-30T00:00:10Z" + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | ra price trigger | fb price trigger | reference | ra expires in | ra expiry strategy | fb expires in | fb expiry strategy | error | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 75 | 25 | stop1 | 10 | EXPIRY_STRATEGY_SUBMIT | 10 | EXPIRY_STRATEGY_SUBMIT | stop order OCOs must not have the same expiry time | + + + Scenario: An OCO stop order with expiration time T with one side set to execute at that time will execute at time T if reached without being triggered, with the specified side triggering and the other side cancelling. (0014-ORDT-131) + Given time is updated to "2019-11-30T00:00:00Z" + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000000 | + | party2 | BTC | 10000000 | + | party3 | BTC | 10000000 | + | aux | BTC | 10000000 | + | aux2 | BTC | 10000000 | + | aux3 | BTC | 100000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000000 | + | party2 | ETH | 10000000 | + | party3 | ETH | 10000000 | + | aux | ETH | 10000000 | + | aux2 | ETH | 10000000 | + | aux3 | ETH | 100000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + # 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 | BTC/ETH | buy | 100 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 100 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux3 | BTC/ETH | sell | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | buy | 10 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + # volume for the stop trade + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party3 | BTC/ETH | buy | 10 | 51 | 0 | TYPE_LIMIT | TIF_GTC | + + When time is updated to "2019-11-30T00:00:10Z" + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | ra price trigger | fb price trigger | reference | ra expires in | ra expiry strategy | fb expires in | fb expiry strategy | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 75 | 25 | stop | 10 | EXPIRY_STRATEGY_SUBMIT | 15 | EXPIRY_STRATEGY_SUBMIT | + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_PENDING | stop-1 | + | party1 | BTC/ETH | STATUS_PENDING | stop-2 | + + Then clear all events + When time is updated to "2019-11-30T00:00:20Z" + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_STOPPED | stop-1 | + | party1 | BTC/ETH | STATUS_EXPIRED | stop-2 | + + # Now perform the same test but from the other side + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | ra price trigger | fb price trigger | reference | ra expires in | ra expiry strategy | fb expires in | fb expiry strategy | + | party2 | BTC/ETH | sell | 10 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 75 | 25 | stop2 | 15 | EXPIRY_STRATEGY_SUBMIT | 10 | EXPIRY_STRATEGY_SUBMIT | + + Then the stop orders should have the following states + | party | market id | status | reference | + | party2 | BTC/ETH | STATUS_PENDING | stop2-1 | + | party2 | BTC/ETH | STATUS_PENDING | stop2-2 | + + Then clear all events + When time is updated to "2019-11-30T00:00:30Z" + + Then the stop orders should have the following states + | party | market id | status | reference | + | party2 | BTC/ETH | STATUS_STOPPED | stop2-2 | + | party2 | BTC/ETH | STATUS_EXPIRED | stop2-1 | + + + Scenario: A stop order placed by a key with a zero position but open orders will be accepted. (0014-ORDT-125) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000 | + | party2 | BTC | 10000 | + | aux | BTC | 100000 | + | aux2 | BTC | 100000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000 | + | party2 | ETH | 10000 | + | aux | ETH | 100000 | + | aux2 | ETH | 100000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + # 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 | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb price trigger | error | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 47 | | + + Scenario: Given a spot market, a stop order with a position size override will be rejected (0014-ORDT-162) + + # setup accounts + Given time is updated to "2019-11-30T00:00:00Z" + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 10000000 | + | party2 | BTC | 10000000 | + | party3 | BTC | 10000000 | + | aux | BTC | 10000000 | + | aux2 | BTC | 10000000 | + | aux3 | BTC | 100000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 10000000 | + | party2 | ETH | 10000000 | + | party3 | ETH | 10000000 | + | aux | ETH | 10000000 | + | aux2 | ETH | 10000000 | + | aux3 | ETH | 100000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 90000000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 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 | + | lpprov | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + # 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 | BTC/ETH | buy | 100 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 100 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux3 | BTC/ETH | sell | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | sell | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | buy | 5 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + + When time is updated to "2019-11-30T00:00:10Z" + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | ra price trigger | fb price trigger | reference | ra expires in | ra expiry strategy | fb expires in | fb expiry strategy | ra size override setting | ra size override percentage | error | + | party1 | BTC/ETH | buy | 10 | 0 | 0 | TYPE_MARKET | TIF_IOC | reduce | 75 | 25 | stop | 10 | EXPIRY_STRATEGY_SUBMIT | 15 | EXPIRY_STRATEGY_SUBMIT | POSITION | 0.5 | stop order size override is not supported for spot product | + + + @SLABug + Scenario: All stop orders for a specific party for a specific market can be cancelled by a single stop order cancellation. (0014-ORDT-156) + + # setup accounts + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 1000000 | + | party2 | BTC | 1000000 | + | aux | BTC | 1000000 | + | aux2 | BTC | 1000000 | + | lpprov | BTC | 900000000 | + | party1 | ETH | 1000000 | + | party2 | ETH | 1000000 | + | aux | ETH | 1000000 | + | aux2 | ETH | 1000000 | + | lpprov | ETH | 900000000 | + | party1 | USDT | 1000000 | + | party2 | USDT | 1000000 | + | aux | USDT | 1000000 | + | aux2 | USDT | 1000000 | + | lpprov | USDT | 900000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 900000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 900000 | 0.1 | submission | + | lp2 | lpprov | USDT/ETH | 900000 | 0.1 | submission | + | lp2 | lpprov | USDT/ETH | 900000 | 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 | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + | lpprov | USDT/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | USDT/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + # 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 | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | USDT/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | USDT/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | USDT/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | USDT/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "2" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "USDT/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb price trigger | error | reference | + | party1 | BTC/ETH | sell | 10 | 60 | 0 | TYPE_LIMIT | TIF_GTC | | | | | + | party1 | BTC/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 47 | | stop1 | + | party1 | BTC/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 48 | | stop2 | + | party1 | USDT/ETH | sell | 10 | 60 | 0 | TYPE_LIMIT | TIF_GTC | | | | | + | party1 | USDT/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 49 | | stop3 | + | party1 | USDT/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 49 | | stop4 | + + Then the party "party1" cancels all their stop orders for the market "BTC/ETH" + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_CANCELLED | stop1 | + | party1 | BTC/ETH | STATUS_CANCELLED | stop2 | + | party1 | USDT/ETH | STATUS_PENDING | stop3 | + | party1 | USDT/ETH | STATUS_PENDING | stop4 | + + Scenario: Stop orders once triggered can not be cancelled. For spot products (0014-ORDT-161) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 1000000 | + | party2 | BTC | 1000000 | + | party3 | BTC | 1000000 | + | aux | BTC | 1000000 | + | aux2 | BTC | 1000000 | + | lpprov | BTC | 90000000 | + | party1 | ETH | 1000000 | + | party2 | ETH | 1000000 | + | party3 | ETH | 1000000 | + | aux | ETH | 1000000 | + | aux2 | ETH | 1000000 | + | lpprov | ETH | 90000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 900000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 900000 | 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 | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # setup party1 position, open a 10 short position + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | sell | 10 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | buy | 10 | 50 | 1 | TYPE_LIMIT | TIF_GTC | + # 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 | + | party3 | BTC/ETH | sell | 10 | 80 | 0 | TYPE_LIMIT | TIF_GTC | + # 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 | 5 | 80 | 0 | TYPE_LIMIT | TIF_IOC | reduce | 75 | | stop1 | + + # now we trade at 75, 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 | 10 | 75 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 10 | 75 | 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 | + And the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | buy | 5 | 0 | 80 | STATUS_FILLED | stop1 | + + Then the parties cancel the following stop orders: + | party | reference | error | + | party1 | stop1 | stop order not found | + + @SLABug + Scenario: All stop orders for a specific party can be cancelled by a single stop order cancellation. (0014-ORDT-155) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | BTC | 1000000 | + | party2 | BTC | 1000000 | + | aux | BTC | 1000000 | + | aux2 | BTC | 1000000 | + | lpprov | BTC | 900000000 | + | party1 | ETH | 1000000 | + | party2 | ETH | 1000000 | + | aux | ETH | 1000000 | + | aux2 | ETH | 1000000 | + | lpprov | ETH | 900000000 | + | party1 | USDT | 1000000 | + | party2 | USDT | 1000000 | + | aux | USDT | 1000000 | + | aux2 | USDT | 1000000 | + | lpprov | USDT | 900000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | BTC/ETH | 900000 | 0.1 | submission | + | lp1 | lpprov | BTC/ETH | 900000 | 0.1 | submission | + | lp2 | lpprov | USDT/ETH | 900000 | 0.1 | submission | + | lp2 | lpprov | USDT/ETH | 900000 | 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 | BTC/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | BTC/ETH | 2 | 1 | sell | ASK | 50 | 100 | + | lpprov | USDT/ETH | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | USDT/ETH | 2 | 1 | sell | ASK | 50 | 100 | + + # 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 | BTC/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | BTC/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | USDT/ETH | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | USDT/ETH | sell | 1 | 10001 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | USDT/ETH | buy | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | USDT/ETH | sell | 1 | 50 | 0 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "2" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "USDT/ETH" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | fb price trigger | error | reference | + | party1 | BTC/ETH | sell | 10 | 60 | 0 | TYPE_LIMIT | TIF_GTC | | | | | + | party1 | BTC/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 47 | | stop1 | + | party1 | BTC/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 48 | | stop2 | + | party1 | USDT/ETH | sell | 10 | 60 | 0 | TYPE_LIMIT | TIF_GTC | | | | | + | party1 | USDT/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 49 | | stop3 | + | party1 | USDT/ETH | buy | 2 | 0 | 0 | TYPE_MARKET | TIF_GTC | reduce | 49 | | stop4 | + + Then the party "party1" cancels all their stop orders + + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_CANCELLED | stop1 | + | party1 | BTC/ETH | STATUS_CANCELLED | stop2 | + | party1 | USDT/ETH | STATUS_CANCELLED | stop3 | + | party1 | USDT/ETH | STATUS_CANCELLED | stop4 | \ No newline at end of file diff --git a/core/integration/features/position_tracking/verified-positions-resolution-5-lognormal_pdp.feature b/core/integration/features/position_tracking/verified-positions-resolution-5-lognormal_pdp.feature index 212a3383e5..e3c7dce9db 100644 --- a/core/integration/features/position_tracking/verified-positions-resolution-5-lognormal_pdp.feature +++ b/core/integration/features/position_tracking/verified-positions-resolution-5-lognormal_pdp.feature @@ -24,7 +24,7 @@ Feature: Position resolution case 5 lognormal risk model | network.markPriceUpdateMaximumFrequency | 0s | | limits.markets.maxPeggedOrders | 2 | - @Liquidation @NoPerp + @Liquidation Scenario: using lognormal risk model, set "designatedLoser " closeout while the position of "designatedLoser " is not fully covered by orders on the order book # setup accounts Given the parties deposit on asset's general account the following amount: 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 new file mode 100644 index 0000000000..dba28256f0 --- /dev/null +++ b/core/integration/features/price_monitoring/end-long-auction-with-trigger-change.feature @@ -0,0 +1,256 @@ +Feature: Confirm return to continuous trading during significant mark price change can be sped up with trigger modification mid-auction + Background: + Given the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 1s | + | limits.markets.maxPeggedOrders | 2 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 0.00 | 24h | 1e-9 | + And the price monitoring named "my-price-monitoring-1": + | horizon | probability | auction extension | + | 60 | 0.95 | 5 | + | 60 | 0.95 | 5 | + | 60 | 0.95 | 5 | + | 60 | 0.95 | 5 | + | 60 | 0.95 | 5 | + 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 composite price oracles from "0xCAFECAFE1": + | name | price property | price type | price decimals | + | oracle1 | prices.ETH.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 | linear slippage factor | quadratic slippage factor | sla params | price type | decay weight | decay power | cash amount | source weights | source staleness tolerance | oracle1 | market type | + | ETH/FEB23 | ETH | USD | lqm-params | my-log-normal-risk-model | default-margin-calculator | 5 | default-none | my-price-monitoring-1 | default-eth-for-future | 0.25 | 0 | default-futures | weight | 0.1 | 0.5 | 500000 | 0,0,1,0 | 0s,0s,0h0m120s,0s | oracle1 | future | + + When the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | USD | 100000000000 | + | party2 | USD | 100000000000 | + And the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/FEB23 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/FEB23 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + And the oracles broadcast data with block time signed with "0xCAFECAFE1": + | name | value | time offset | + | prices.ETH.value | 1000 | -1s | + And the network moves ahead "6" 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_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 60 | 1000 | 995 | 1005 | + + Scenario: Mark price update without any intervention, book stuck at old price + + When the oracles broadcast data with block time signed with "0xCAFECAFE1": + | name | value | time offset | + | prices.ETH.value | 2000 | -1s | + And the network moves ahead "2" 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 | 60 | 1000 | 995 | 1005 | + + When the network moves ahead "100" 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 | 60 | 1000 | 995 | 1005 | + + When the oracles broadcast data with block time signed with "0xCAFECAFE1": + | name | value | time offset | + | prices.ETH.value | 2000 | -1s | + And the network moves ahead "25" 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 | 60 | 1000 | 995 | 1005 | + + # In this scenario market will only leave the auction once the latest oracle-based mark-price candidate becomes stale + When the network moves ahead "96" 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_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 60 | 1000 | 995 | 1005 | + + Scenario: Mark price update, followed by uncrossing trade near the new price + + When the oracles broadcast data with block time signed with "0xCAFECAFE1": + | name | value | time offset | + | prices.ETH.value | 2000 | -1s | + And the network moves ahead "2" 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 | 60 | 1000 | 995 | 1005 | + + 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 | + And the network moves ahead "5" blocks + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | auction trigger | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | + + # auction ends once auction extensions for all triggers elapse + When the network moves ahead "21" 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 | + | 2000 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 2004 | 60 | 2002 | 1992 | 2012 | + + Scenario: Mark price update, followed by trigger update + + When the oracles broadcast data with block time signed with "0xCAFECAFE1": + | name | value | time offset | + | prices.ETH.value | 2000 | -1s | + And the network moves ahead "2" 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 | auction end | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 60 | 1000 | 995 | 1005 | 5 | + + 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 | + # 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 | + + # 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 | + + # the updated extension triggered, no triggers left + And the network moves ahead "1" blocks + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | auction trigger | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | + + # market leaves the auction + # mark price doesn't update as there weren't any trades so the reference price for price monitoring engine is still the last value it had (1000) + # which results in bounds that the mark price candidate (2000) is outside of + And the network moves ahead "1" 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 | 1000 | 30 | 1000 | 997 | 1003 | + + # 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-1 | 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 | last traded price | horizon | ref price | min bound | max bound | + | 1000 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 1000 | 60 | 1000 | 900 | 1100 | + + When the network moves ahead "1" 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 | 1000 | 60 | 1000 | 995 | 1005 | + + Scenario: Mark price update, followed by trigger update (+ trade in auction, after market update) + + When the oracles broadcast data with block time signed with "0xCAFECAFE1": + | name | value | time offset | + | prices.ETH.value | 2000 | -1s | + And the network moves ahead "2" 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 | auction end | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 60 | 1000 | 995 | 1005 | 5 | + + 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 | auction trigger | horizon | ref price | min bound | max bound | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 30 | 1000 | 997 | 1003 | + + 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 + And the network moves ahead "1" blocks + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | auction trigger | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | + + # market leaves the auction + # All values received from oracle but not yet accepted as valid mark price get lost during the market update + And the network moves ahead "2" 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 | 2004 | 30 | 2004 | 1997 | 2011 | + + Scenario: Mark price update, followed by trigger update (+ oracle value gets resubmitted after the market update) + + When the oracles broadcast data with block time signed with "0xCAFECAFE1": + | name | value | time offset | + | prices.ETH.value | 2000 | -1s | + And the network moves ahead "2" 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 | auction end | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 60 | 1000 | 995 | 1005 | 5 | + + 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 | auction trigger | horizon | ref price | min bound | max bound | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 30 | 1000 | 997 | 1003 | + + 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 + And the network moves ahead "1" blocks + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | auction trigger | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | + + # market leaves the auction + # now we get stuck in an series of auctions (with uncrossing trades in between) until the mark price becomes stale + When the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/FEB23 | buy | 1 | 1002 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/FEB23 | sell | 1 | 1002 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "1" blocks + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | auction trigger | last traded price | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 1002 | + + When the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/FEB23 | buy | 1 | 1003 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/FEB23 | sell | 1 | 1003 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | auction trigger | last traded price | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 1003 | + + 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 diff --git a/core/integration/features/price_monitoring/post-auction-reference-price-with-oracle.feature b/core/integration/features/price_monitoring/post-auction-reference-price-with-oracle.feature new file mode 100644 index 0000000000..a83cb2d99e --- /dev/null +++ b/core/integration/features/price_monitoring/post-auction-reference-price-with-oracle.feature @@ -0,0 +1,136 @@ +Feature: Test price monitoring engine with oracle based mark price + Background: + Given the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 4s | + | limits.markets.maxPeggedOrders | 2 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 0.00 | 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.1 | 100 | -100 | 0.2 | + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 5 | 0.99 | 3 | + And the composite price oracles from "0xCAFECAFE1": + | name | price property | price type | price decimals | + | oracle1 | prices.ETH.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 | linear slippage factor | quadratic slippage factor | sla params | price type | decay weight | decay power | cash amount | source weights | source staleness tolerance | oracle1 | market type | + | ETH/FEB23 | ETH | USD | lqm-params | simple-risk-model | default-margin-calculator | 5 | default-none | price-monitoring | default-eth-for-future | 0.25 | 0 | default-futures | weight | 0.1 | 0.5 | 500000 | 0,0,1,0 | 0s,0s,10s,0s | oracle1 | future | + + Scenario: reference price after uncrossing the auction is the weighted average of traded volume and mark price (with a weight of 1) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | buySideProvider | USD | 100000000000 | + | sellSideProvider | USD | 100000000000 | + | lp1 | USD | 100000000000 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | ETH/FEB23 | 50000 | 0.001 | submission | + | lp1 | lp1 | ETH/FEB23 | 50000 | 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/FEB23 | 49 | 1 | sell | ASK | 49 | 20 | + | lp1 | ETH/FEB23 | 52 | 1 | buy | BID | 52 | 20 | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/FEB23 | buy | 1 | 15899 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/FEB23 | sell | 1 | 15901 | 0 | TYPE_LIMIT | TIF_GTC | | + | buySideProvider | ETH/FEB23 | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | | + | buySideProvider | ETH/FEB23 | buy | 1 | 15900 | 0 | TYPE_LIMIT | TIF_GTC | | + | sellSideProvider | ETH/FEB23 | sell | 1 | 15900 | 0 | TYPE_LIMIT | TIF_GTC | | + | sellSideProvider | ETH/FEB23 | sell | 1 | 100000 | 0 | TYPE_LIMIT | TIF_GTC | | + + When the network moves ahead "1" blocks + Then the mark price should be "0" for the market "ETH/FEB23" + And the trading mode should be "TRADING_MODE_OPENING_AUCTION" for the market "ETH/FEB23" + + Then the oracles broadcast data with block time signed with "0xCAFECAFE1": + | name | value | time offset | + | prices.ETH.value | 16000 | -1s | + And the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | horizon | min bound | max bound | + | 0 | TRADING_MODE_OPENING_AUCTION | 5 | 15801 | 15999 | + + + When the network moves ahead "5" blocks + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | auction trigger | horizon | min bound | max bound | + | 16000 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 5 | 15900 | 16100 | + + When the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | buySideProvider | ETH/FEB23 | buy | 10 | 14000 | 0 | TYPE_LIMIT | TIF_GTC | | + | sellSideProvider | ETH/FEB23 | sell | 10 | 14000 | 0 | TYPE_LIMIT | TIF_GTC | | + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | auction trigger | + | 16000 | 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 | 14050 | -1s | + And the network moves ahead "5" blocks + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | auction trigger | ref price | horizon | min bound | max bound | + | 14050 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 14025 | 5 | 13925 | 14125 | + +Scenario: when previous mark price is outside the bounds implied by the auction uncrossing trade the market will only return to continuous trading once the last oracle feed became stale + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | buySideProvider | USD | 100000000000 | + | sellSideProvider | USD | 100000000000 | + | lp1 | USD | 100000000000 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | ETH/FEB23 | 50000 | 0.001 | submission | + | lp1 | lp1 | ETH/FEB23 | 50000 | 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/FEB23 | 49 | 1 | sell | ASK | 49 | 20 | + | lp1 | ETH/FEB23 | 52 | 1 | buy | BID | 52 | 20 | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/FEB23 | buy | 1 | 15899 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/FEB23 | sell | 1 | 15901 | 0 | TYPE_LIMIT | TIF_GTC | | + | buySideProvider | ETH/FEB23 | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | | + | buySideProvider | ETH/FEB23 | buy | 1 | 15900 | 0 | TYPE_LIMIT | TIF_GTC | | + | sellSideProvider | ETH/FEB23 | sell | 1 | 15900 | 0 | TYPE_LIMIT | TIF_GTC | | + | sellSideProvider | ETH/FEB23 | sell | 1 | 100000 | 0 | TYPE_LIMIT | TIF_GTC | | + + When the network moves ahead "1" blocks + Then the mark price should be "0" for the market "ETH/FEB23" + And the trading mode should be "TRADING_MODE_OPENING_AUCTION" for the market "ETH/FEB23" + + Then the oracles broadcast data with block time signed with "0xCAFECAFE1": + | name | value | time offset | + | prices.ETH.value | 16000 | -1s | + And the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | horizon | min bound | max bound | + | 0 | TRADING_MODE_OPENING_AUCTION | 5 | 15801 | 15999 | + + + When the network moves ahead "5" blocks + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | auction trigger | horizon | min bound | max bound | + | 16000 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 5 | 15900 | 16100 | + + When the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | buySideProvider | ETH/FEB23 | buy | 10 | 14000 | 0 | TYPE_LIMIT | TIF_GTC | | + | sellSideProvider | ETH/FEB23 | sell | 10 | 14000 | 0 | TYPE_LIMIT | TIF_GTC | | + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | auction trigger | + | 16000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | + + When the network moves ahead "5" blocks + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | auction trigger | + | 16000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | + + When the network moves ahead "3" blocks + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | auction trigger | ref price | horizon | min bound | max bound | + | 16000 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 14000 | 5 | 13901 | 14099 | + diff --git a/core/integration/features/price_monitoring/price-monitoring-bounds.feature b/core/integration/features/price_monitoring/price-monitoring-bounds.feature index 7430700843..900eef7637 100644 --- a/core/integration/features/price_monitoring/price-monitoring-bounds.feature +++ b/core/integration/features/price_monitoring/price-monitoring-bounds.feature @@ -128,7 +128,7 @@ Feature: Price monitoring triggers test on or around monitoring bounds with deci | mark price | trading mode | target stake | supplied stake | open interest | | 10015612114 | TRADING_MODE_CONTINUOUS | 1489121209109520 | 9000000000000000 | 2 | - @PriceBounds @NoPerp + @PriceBounds Scenario: Trades below minimum price bound by 1 after an update to the price monitoring parameters Given the parties deposit on asset's general account the following amount: | party | asset | amount | @@ -189,7 +189,7 @@ Feature: Price monitoring triggers test on or around monitoring bounds with deci | mark price | trading mode | target stake | supplied stake | open interest | | 9000000000 | TRADING_MODE_CONTINUOUS | 1338120000000000 | 9000000000000000 | 2 | - @PriceBounds @NoPerp + @PriceBounds Scenario: Trades above maximum price bound by 1 decimal after market update Given the parties deposit on asset's general account the following amount: | party | asset | amount | diff --git a/core/integration/features/price_monitoring/price-monitoring-lognormal-identical-bounds.feature b/core/integration/features/price_monitoring/price-monitoring-lognormal-identical-bounds.feature new file mode 100644 index 0000000000..e25334d9e3 --- /dev/null +++ b/core/integration/features/price_monitoring/price-monitoring-lognormal-identical-bounds.feature @@ -0,0 +1,70 @@ +Feature: Price monitoring test using forward risk model (bounds for the valid price moves around price of 100000 for the two horizons are: [99460,100541], [98999,101008]) + + Background: + Given time is updated to "2020-10-16T00:00:00Z" + And the price monitoring named "my-price-monitoring": + | horizon | probability | auction extension | + | 10 | 0.95 | 180 | + | 10 | 0.95 | 180 | + 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 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/DEC21 | ETH | ETH | default-log-normal-risk-model | default-margin-calculator | 60 | 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 | 60 | + | limits.markets.maxPeggedOrders | 2 | + + Scenario: Persistent order breaks a repeated trigger (upper bound) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000000000 | + | party2 | ETH | 10000000000 | + | aux | ETH | 100000000000 | + | aux2 | ETH | 100000000000 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | ETH/DEC21 | buy | 1 | 110000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | ETH/DEC21 | sell | 1 | 110000 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "ETH/DEC21" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + And the mark price should be "110000" for the market "ETH/DEC21" + + + When time is updated to "2020-10-16T00:02:00Z" + Then the market data for the market "ETH/DEC21" should be: + | trading mode | auction trigger | extension trigger | mark price | indicative price | indicative volume | horizon | ref price | min bound | max bound | + | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | AUCTION_TRIGGER_UNSPECIFIED | 110000 | 0 | 0 | 10 | 110000 | 109758 | 110242 | + + #T1 = T0 + 1min10s + When time is updated to "2020-10-16T00:03:10Z" + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/DEC21 | sell | 1 | 111000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/DEC21 | buy | 1 | 111000 | 0 | TYPE_LIMIT | TIF_GTC | + And the market data for the market "ETH/DEC21" should be: + | trading mode | auction trigger | extension trigger | mark price | indicative price | indicative volume | auction end | + | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | AUCTION_TRIGGER_UNSPECIFIED | 110000 | 111000 | 1 | 180 | + + #T1 + 03min00s (last second of the auction) + When time is updated to "2020-10-16T00:06:10Z" + Then the market data for the market "ETH/DEC21" should be: + | trading mode | auction trigger | extension trigger | mark price | indicative price | indicative volume | auction end | horizon | ref price | min bound | max bound | + | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | AUCTION_TRIGGER_UNSPECIFIED | 110000 | 111000 | 1 | 180 | 10 | 110000 | 109758 | 110242 | + + #T2 = T1 + 03min01s (auction gets extended as the other trigger gets activated) + When time is updated to "2020-10-16T00:06:11Z" + Then the market data for the market "ETH/DEC21" should be: + | trading mode | auction trigger | extension trigger | mark price | indicative price | indicative volume | auction end | + | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | AUCTION_TRIGGER_PRICE | 110000 | 111000 | 1 | 360 | + + #T2 + 03min00s (market returns to continuous trading mode) + When time is updated to "2020-10-16T00:09:11Z" + Then the market data for the market "ETH/DEC21" should be: + | trading mode | auction trigger | extension trigger | mark price | indicative price | indicative volume | auction end | horizon | ref price | min bound | max bound | + | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | AUCTION_TRIGGER_UNSPECIFIED | 111000 | 0 | 0 | 0 | 10 | 111000 | 110756 | 111245 | + + diff --git a/core/integration/features/price_monitoring/price-monitoring-lognormal.feature b/core/integration/features/price_monitoring/price-monitoring-lognormal.feature index 6f137368fd..765ba170e9 100644 --- a/core/integration/features/price_monitoring/price-monitoring-lognormal.feature +++ b/core/integration/features/price_monitoring/price-monitoring-lognormal.feature @@ -348,9 +348,9 @@ Feature: Price monitoring test using forward risk model (bounds for the valid pr | party1 | ETH/DEC21 | sell | 1 | 110000 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | | party2 | ETH/DEC21 | buy | 1 | 110000 | 1 | TYPE_LIMIT | TIF_GTC | ref-2 | - And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" - - And the mark price should be "110000" for the market "ETH/DEC21" + And the market data for the market "ETH/DEC21" should be: + | trading mode | auction trigger | extension trigger | mark price | indicative price | indicative volume | + | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | AUCTION_TRIGGER_UNSPECIFIED | 110000 | 0 | 0 | #T1 = T0 + 10s When time is updated to "2020-10-16T00:02:10Z" @@ -360,9 +360,9 @@ Feature: Price monitoring test using forward risk model (bounds for the valid pr | party1 | ETH/DEC21 | sell | 1 | 111000 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | | party2 | ETH/DEC21 | buy | 1 | 111000 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | - And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "ETH/DEC21" - - And the mark price should be "110000" for the market "ETH/DEC21" + And the market data for the market "ETH/DEC21" should be: + | trading mode | auction trigger | extension trigger | mark price | indicative price | indicative volume | auction end | + | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | AUCTION_TRIGGER_UNSPECIFIED | 110000 | 111000 | 1 | 240 | #T1 + 04min00s (last second of the auction) When time is updated to "2020-10-16T00:03:10Z" @@ -372,17 +372,65 @@ Feature: Price monitoring test using forward risk model (bounds for the valid pr | party1 | ETH/DEC21 | sell | 2 | 133000 | 0 | TYPE_LIMIT | TIF_GFA | ref-1 | | party2 | ETH/DEC21 | buy | 2 | 133000 | 0 | TYPE_LIMIT | TIF_GFA | ref-2 | - And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "ETH/DEC21" + And the market data for the market "ETH/DEC21" should be: + | trading mode | auction trigger | extension trigger | mark price | indicative price | indicative volume | auction end | horizon | ref price | min bound | max bound | + | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | AUCTION_TRIGGER_UNSPECIFIED | 110000 | 133000 | 2 | 240 | 120 | 110000 | 108900 | 111109 | #T1 + 04min01s (auction gets extended as we've removed trigger staleness functionality) When time is updated to "2020-10-16T00:06:11Z" - Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "ETH/DEC21" - - And the mark price should be "110000" for the market "ETH/DEC21" + And the market data for the market "ETH/DEC21" should be: + | trading mode | auction trigger | extension trigger | mark price | indicative price | indicative volume | auction end | + | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | AUCTION_TRIGGER_PRICE | 110000 | 133000 | 2 | 600 | #T1 + 10min01s When time is updated to "2020-10-16T00:12:11Z" Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" - And the mark price should be "133000" for the market "ETH/DEC21" \ No newline at end of file + And the mark price should be "133000" for the market "ETH/DEC21" + + And the market data for the market "ETH/DEC21" should be: + | horizon | ref price | min bound | max bound | + | 60 | 133000 | 132283 | 133720 | + | 120 | 133000 | 131670 | 134341 | + + Scenario: Non-persistent order results in no trades. Persistent order which results in an n-th trade breaching the trigger and causing auction - all previous n-1 trades get executed. + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000000000 | + | party2 | ETH | 10000000000 | + | aux | ETH | 100000000000 | + | aux2 | ETH | 100000000000 | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux | ETH/DEC21 | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | ETH/DEC21 | sell | 1 | 200000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/DEC21 | buy | 1 | 100000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux | ETH/DEC21 | sell | 1 | 100000 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "ETH/DEC21" + Then the market data for the market "ETH/DEC21" should be: + | mark price | trading mode | horizon | min bound | max bound | + | 100000 | TRADING_MODE_CONTINUOUS | 60 | 99461 | 100541 | + | 100000 | TRADING_MODE_CONTINUOUS | 120 | 99000 | 101008 | + + When the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | error | + | aux | ETH/DEC21 | sell | 3 | 100540 | 0 | TYPE_LIMIT | TIF_GTC | | + | aux2 | ETH/DEC21 | sell | 2 | 100541 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/DEC21 | sell | 1 | 100542 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/DEC21 | buy | 10 | 100543 | 0 | TYPE_LIMIT | TIF_IOC | OrderError: non-persistent order trades out of price bounds | + Then the market data for the market "ETH/DEC21" should be: + | mark price | trading mode | horizon | min bound | max bound | + | 100000 | TRADING_MODE_CONTINUOUS | 60 | 99461 | 100541 | + | 100000 | TRADING_MODE_CONTINUOUS | 120 | 99000 | 101008 | + + When the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | + | party2 | ETH/DEC21 | buy | 10 | 100543 | 0 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/DEC21" should be: + | mark price | trading mode | auction trigger | horizon | min bound | max bound | + | 100000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 120 | 99000 | 101008 | + And the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | + | party2 | 0 | 0 | 0 | \ No newline at end of file diff --git a/core/integration/features/rewards/0056-REWA-108.feature b/core/integration/features/rewards/0056-REWA-108.feature index 7f50ec1cd8..205477d2fe 100644 --- a/core/integration/features/rewards/0056-REWA-108.feature +++ b/core/integration/features/rewards/0056-REWA-108.feature @@ -80,10 +80,10 @@ Feature: Team Rewards When the network moves ahead "1" epochs Then parties should have the following vesting account balances: | party | asset | balance | - | ref1-0001 | USD-1-10 | 1724 | - | ref1-0002 | USD-1-10 | 1724 | + | ref1-0001 | USD-1-10 | 1428 | + | ref1-0002 | USD-1-10 | 1428 | | ref3-0001 | USD-1-10 | 0 | - | ref3-0002 | USD-1-10 | 2068 | - | ref2-0001 | USD-1-10 | 2241 | - | ref2-0002 | USD-1-10 | 2241 | + | ref3-0002 | USD-1-10 | 3428 | + | ref2-0001 | USD-1-10 | 1857 | + | ref2-0002 | USD-1-10 | 1857 | diff --git a/core/integration/features/rewards/0056-REWA-111.feature b/core/integration/features/rewards/0056-REWA-111.feature new file mode 100644 index 0000000000..16e97d90d2 --- /dev/null +++ b/core/integration/features/rewards/0056-REWA-111.feature @@ -0,0 +1,141 @@ +Feature: Relative return rewards + + Background: + Given the following network parameters are set: + | name | value | + | reward.asset | VEGA | + | validators.epoch.length | 10s | + | validators.delegation.minAmount | 10 | + | reward.staking.delegation.delegatorShare | 0.883 | + | reward.staking.delegation.minimumValidatorStake | 100 | + | reward.staking.delegation.maxPayoutPerParticipant | 100000 | + | reward.staking.delegation.competitionLevel | 1.1 | + | reward.staking.delegation.minValidators | 5 | + | reward.staking.delegation.optimalStakeMultiplier | 5.0 | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 2 | + + Given the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.002 | + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 3600 | 0.99 | 3 | + + 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 | + | ETH/DEC21 | ETH | ETH | simple-risk-model-1 | default-margin-calculator | 2 | fees-config-1 | price-monitoring | default-eth-for-future | 0.25 | 0 | default-futures | + | ETH/DEC22 | ETH | ETH | simple-risk-model-1 | default-margin-calculator | 2 | fees-config-1 | price-monitoring | default-eth-for-future | 0.25 | 0 | default-futures | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | VEGA | 1000000 | + | aux1 | ETH | 100000000 | + | aux2 | ETH | 100000000 | + | trader3 | ETH | 10000 | + | trader4 | ETH | 10000 | + | lpprov | ETH | 200000000 | + | party1 | ETH | 100000 | + | party2 | ETH | 100000 | + | party3 | ETH | 100000 | + | party4 | ETH | 100000 | + + + And the parties deposit on staking account the following amount: + | party | asset | amount | + | aux1 | VEGA | 2000 | + | aux2 | VEGA | 800 | + | trader3 | VEGA | 1500 | + | trader4 | VEGA | 1000 | + | lpprov | VEGA | 10000 | + | party1 | VEGA | 2000 | + | party2 | VEGA | 800 | + | party3 | VEGA | 2000 | + | party4 | VEGA | 2000 | + + + Given time is updated to "2023-09-23T00:00:00Z" + Given the average block duration is "1" + + #complete the epoch to advance to a meaningful epoch (can't setup transfer to start at epoch 0) + Then the network moves ahead "1" epochs + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | ETH/DEC21 | 90000 | 0.1 | submission | + | lp1 | lpprov | ETH/DEC21 | 90000 | 0.1 | submission | + | lp2 | lpprov | ETH/DEC22 | 90000 | 0.1 | submission | + | lp2 | lpprov | ETH/DEC22 | 90000 | 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/DEC21 | 90 | 1 | buy | BID | 90 | 10 | + | lpprov | ETH/DEC21 | 90 | 1 | sell | ASK | 90 | 10 | + | lpprov | ETH/DEC22 | 90 | 1 | buy | BID | 90 | 10 | + | lpprov | ETH/DEC22 | 90 | 1 | sell | ASK | 90 | 10 | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/DEC21 | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | aux2 | ETH/DEC21 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | aux1 | ETH/DEC21 | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | buy1 | + | aux2 | ETH/DEC21 | sell | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | sell1 | + | aux1 | ETH/DEC22 | buy | 1 | 1800 | 0 | TYPE_LIMIT | TIF_GTC | buy2 | + | aux2 | ETH/DEC22 | sell | 1 | 2200 | 0 | TYPE_LIMIT | TIF_GTC | sell2 | + + Scenario: If an eligible party has zero net returns, their relative returns reward metric should be zero(0056-REWA-111) + # setup recurring transfer to the reward account - this will start at the end of this epoch + Given the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | window_length | distribution_strategy | entity_scope | individual_scope | staking_requirement | notional_requirement | + | 1 | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_RELATIVE_RETURN | VEGA | 10000 | 1 | | 1 | DISPATCH_METRIC_RELATIVE_RETURN | ETH | | 2 | 1 | PRO_RATA | INDIVIDUALS | ALL | 0 | 0 | + + Then the network moves ahead "1" epochs + + Given time is updated to "2023-09-23T00:00:30Z" + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/DEC21 | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p1-buy1 | + | aux1 | ETH/DEC21 | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | ETH/DEC21 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p2-sell | + | aux2 | ETH/DEC21 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | | + + Then the network moves ahead "1" epochs + + # M2M + # party1 = 0 + # aux1 = 0 + + # relative return metric for party1 = 0 + # relative return metric for aux1 = 0 + And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf" should have general account balance of "1000000" for asset "VEGA" + + Scenario: If a `window_length>1` is specified in the recurring transfer, if an eligible party has zero net returns in all epochs, their relative return metric should be zero(0056-REWA-114) + Given the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | window_length | distribution_strategy | entity_scope | individual_scope | staking_requirement | notional_requirement | + | 1 | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_RELATIVE_RETURN | VEGA | 10000 | 1 | | 1 | DISPATCH_METRIC_RELATIVE_RETURN | ETH | | 2 | 6 | PRO_RATA | INDIVIDUALS | ALL | 0 | 0 | + + Then the network moves ahead "1" epochs + + Given time is updated to "2023-09-23T00:00:30Z" + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/DEC21 | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p1-buy1 | + | aux2 | ETH/DEC21 | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | | + + Then the network moves ahead "1" epochs + + # M2M + # party1 = 0 + # aux1 = 0 + # relative return metric for party1 = 0 + # relative return metric for aux1 = 0 + And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf" should have general account balance of "1000000" for asset "VEGA" + diff --git a/core/integration/features/rewards/0056-REWA-116.feature b/core/integration/features/rewards/0056-REWA-116.feature new file mode 100644 index 0000000000..420cc96def --- /dev/null +++ b/core/integration/features/rewards/0056-REWA-116.feature @@ -0,0 +1,134 @@ +Feature: Relative return rewards + + Background: + Given the following network parameters are set: + | name | value | + | reward.asset | VEGA | + | validators.epoch.length | 10s | + | validators.delegation.minAmount | 10 | + | reward.staking.delegation.delegatorShare | 0.883 | + | reward.staking.delegation.minimumValidatorStake | 100 | + | reward.staking.delegation.maxPayoutPerParticipant | 100000 | + | reward.staking.delegation.competitionLevel | 1.1 | + | reward.staking.delegation.minValidators | 5 | + | reward.staking.delegation.optimalStakeMultiplier | 5.0 | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 2 | + + Given the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.002 | + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 3600 | 0.99 | 3 | + + 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 | + | ETH/DEC21 | ETH | ETH | simple-risk-model-1 | default-margin-calculator | 2 | fees-config-1 | price-monitoring | default-eth-for-future | 0.25 | 0 | default-futures | + | ETH/DEC22 | ETH | ETH | simple-risk-model-1 | default-margin-calculator | 2 | fees-config-1 | price-monitoring | default-eth-for-future | 0.25 | 0 | default-futures | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | VEGA | 1000000 | + | aux1 | ETH | 100000000 | + | aux2 | ETH | 100000000 | + | trader3 | ETH | 10000 | + | trader4 | ETH | 10000 | + | lpprov | ETH | 200000000 | + | party1 | ETH | 100000 | + | party2 | ETH | 100000 | + | party3 | ETH | 100000 | + | party4 | ETH | 100000 | + + And the parties deposit on staking account the following amount: + | party | asset | amount | + | aux1 | VEGA | 2000 | + | aux2 | VEGA | 2000 | + | trader3 | VEGA | 1500 | + | trader4 | VEGA | 1000 | + | lpprov | VEGA | 10000 | + | party1 | VEGA | 800 | + | party2 | VEGA | 2000 | + | party3 | VEGA | 2000 | + | party4 | VEGA | 2000 | + + Given time is updated to "2023-09-23T00:00:00Z" + Given the average block duration is "1" + + #complete the epoch to advance to a meaningful epoch (can't setup transfer to start at epoch 0) + Then the network moves ahead "1" epochs + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | ETH/DEC21 | 90000 | 0.1 | submission | + | lp1 | lpprov | ETH/DEC21 | 90000 | 0.1 | submission | + | lp2 | lpprov | ETH/DEC22 | 90000 | 0.1 | submission | + | lp2 | lpprov | ETH/DEC22 | 90000 | 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/DEC21 | 90 | 1 | buy | BID | 90 | 10 | + | lpprov | ETH/DEC21 | 90 | 1 | sell | ASK | 90 | 10 | + | lpprov | ETH/DEC22 | 90 | 1 | buy | BID | 90 | 10 | + | lpprov | ETH/DEC22 | 90 | 1 | sell | ASK | 90 | 10 | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/DEC21 | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | aux2 | ETH/DEC21 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | aux1 | ETH/DEC21 | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | buy1 | + | aux2 | ETH/DEC21 | sell | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | sell1 | + | party1 | ETH/DEC22 | buy | 5 | 2000 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/DEC22 | sell | 5 | 2000 | 0 | TYPE_LIMIT | TIF_GTC | | + | aux1 | ETH/DEC22 | buy | 1 | 1800 | 0 | TYPE_LIMIT | TIF_GTC | buy2 | + | aux2 | ETH/DEC22 | sell | 1 | 2200 | 0 | TYPE_LIMIT | TIF_GTC | sell2 | + And the mark price should be "0" for the market "ETH/DEC21" + + Scenario: Given a recurring transfer is setup such that all eligible parties have a positive reward score, each parties metric is not offset and parties receive the correct rewards. (0056-REWA-116) + # setup recurring transfer to the reward account - this will start at the end of this epoch + Given the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | window_length | distribution_strategy | entity_scope | individual_scope | staking_requirement | notional_requirement | + | 1 | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_RELATIVE_RETURN | VEGA | 10000 | 1 | | 1 | DISPATCH_METRIC_RELATIVE_RETURN | ETH | | 2 | 2 | PRO_RATA | INDIVIDUALS | ALL | 1000 | 0 | + + Then the network moves ahead "1" epochs + And the mark price should be "1000" for the market "ETH/DEC21" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + + Given time is updated to "2023-09-23T00:00:30Z" + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/DEC21 | buy | 10 | 1002 | 0 | TYPE_LIMIT | TIF_GTC | p1-buy1 | + | aux1 | ETH/DEC21 | sell | 10 | 1002 | 1 | TYPE_LIMIT | TIF_GTC | | + And the mark price should be "1000" for the market "ETH/DEC21" + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | ETH/DEC21 | sell | 10 | 999 | 0 | TYPE_LIMIT | TIF_GTC | p2-sell | + | aux2 | ETH/DEC21 | buy | 10 | 999 | 1 | TYPE_LIMIT | TIF_GTC | | + And the mark price should be "1000" for the market "ETH/DEC21" + + Then the network moves ahead "1" epochs + And the mark price should be "999" for the market "ETH/DEC21" + + # M2M + # party1 = -30 + # aux1 = 20 + # aux2 = 10 + # party1 is not eligible because they don't have sufficient staking + # relative return metric for aux1 = 20/5 = 4 + # relative return metric for aux2 = 10/5 = 2 + # aux1 gets 10000 * 4/6 = 6666 + # aux2 gets 10000 * 2/6 = 3333 + + And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf" should have general account balance of "990000" for asset "VEGA" + And "aux1" should have vesting account balance of "6666" for asset "VEGA" + And "aux2" should have vesting account balance of "3333" for asset "VEGA" + + Then debug trades + + diff --git a/core/integration/features/rewards/0056-REWA-117.feature b/core/integration/features/rewards/0056-REWA-117.feature new file mode 100644 index 0000000000..3205a5dec5 --- /dev/null +++ b/core/integration/features/rewards/0056-REWA-117.feature @@ -0,0 +1,130 @@ +Feature: Relative return rewards + + Background: + Given the following network parameters are set: + | name | value | + | reward.asset | VEGA | + | validators.epoch.length | 10s | + | validators.delegation.minAmount | 10 | + | reward.staking.delegation.delegatorShare | 0.883 | + | reward.staking.delegation.minimumValidatorStake | 100 | + | reward.staking.delegation.maxPayoutPerParticipant | 100000 | + | reward.staking.delegation.competitionLevel | 1.1 | + | reward.staking.delegation.minValidators | 5 | + | reward.staking.delegation.optimalStakeMultiplier | 5.0 | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 2 | + + Given the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.002 | + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 3600 | 0.99 | 3 | + + 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 | + | ETH/DEC21 | ETH | ETH | simple-risk-model-1 | default-margin-calculator | 2 | fees-config-1 | price-monitoring | default-eth-for-future | 0.25 | 0 | default-futures | + | ETH/DEC22 | ETH | ETH | simple-risk-model-1 | default-margin-calculator | 2 | fees-config-1 | price-monitoring | default-eth-for-future | 0.25 | 0 | default-futures | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | VEGA | 1000000 | + | aux1 | ETH | 100000000 | + | aux2 | ETH | 100000000 | + | trader3 | ETH | 10000 | + | trader4 | ETH | 10000 | + | lpprov | ETH | 200000000 | + | party1 | ETH | 100000 | + | party2 | ETH | 100000 | + | party3 | ETH | 100000 | + | party4 | ETH | 100000 | + + And the parties deposit on staking account the following amount: + | party | asset | amount | + | aux1 | VEGA | 800 | + | aux2 | VEGA | 2000 | + | trader3 | VEGA | 1500 | + | trader4 | VEGA | 1000 | + | lpprov | VEGA | 10000 | + | party1 | VEGA | 800 | + | party2 | VEGA | 2000 | + | party3 | VEGA | 2000 | + | party4 | VEGA | 2000 | + + Given time is updated to "2023-09-23T00:00:00Z" + Given the average block duration is "1" + + #complete the epoch to advance to a meaningful epoch (can't setup transfer to start at epoch 0) + Then the network moves ahead "1" epochs + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | ETH/DEC21 | 90000 | 0.1 | submission | + | lp1 | lpprov | ETH/DEC21 | 90000 | 0.1 | submission | + | lp2 | lpprov | ETH/DEC22 | 90000 | 0.1 | submission | + | lp2 | lpprov | ETH/DEC22 | 90000 | 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/DEC21 | 90 | 1 | buy | BID | 90 | 10 | + | lpprov | ETH/DEC21 | 90 | 1 | sell | ASK | 90 | 10 | + | lpprov | ETH/DEC22 | 90 | 1 | buy | BID | 90 | 10 | + | lpprov | ETH/DEC22 | 90 | 1 | sell | ASK | 90 | 10 | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/DEC21 | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | aux2 | ETH/DEC21 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | aux1 | ETH/DEC21 | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | buy1 | + | aux2 | ETH/DEC21 | sell | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | sell1 | + | party1 | ETH/DEC21 | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/DEC21 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | aux1 | ETH/DEC21 | buy | 1 | 1800 | 0 | TYPE_LIMIT | TIF_GTC | buy2 | + | aux2 | ETH/DEC21 | sell | 1 | 2200 | 0 | TYPE_LIMIT | TIF_GTC | sell2 | + And the mark price should be "0" for the market "ETH/DEC21" + + Scenario: Give a recurring transfer is setup such that all eligible parties have a negative reward score, each parties metric is offset by the lowest negative score and parties receive the correct rewards.(0056-REWA-117) + # setup recurring transfer to the reward account - this will start at the end of this epoch + Given the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | window_length | distribution_strategy | entity_scope | individual_scope | staking_requirement | notional_requirement | + | 1 | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_RELATIVE_RETURN | VEGA | 10000 | 1 | | 1 | DISPATCH_METRIC_RELATIVE_RETURN | ETH | | 2 | 2 | PRO_RATA | INDIVIDUALS | ALL | 1000 | 0 | + + Then the network moves ahead "1" epochs + And the mark price should be "1000" for the market "ETH/DEC21" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + + Given time is updated to "2023-09-23T00:00:30Z" + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/DEC21 | buy | 10 | 1002 | 0 | TYPE_LIMIT | TIF_GTC | p1-buy1 | + | aux1 | ETH/DEC21 | sell | 10 | 1002 | 1 | TYPE_LIMIT | TIF_GTC | | + And the mark price should be "1000" for the market "ETH/DEC21" + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | ETH/DEC21 | sell | 10 | 1005 | 0 | TYPE_LIMIT | TIF_GTC | p2-sell | + | aux2 | ETH/DEC21 | buy | 10 | 1005 | 1 | TYPE_LIMIT | TIF_GTC | | + And the mark price should be "1000" for the market "ETH/DEC21" + + Then the network moves ahead "1" epochs + And the mark price should be "1005" for the market "ETH/DEC21" + + # M2M + # party1 = 20*(1005-1001)=80, relative return: 80/20 = 4 + # party2 = -10*(1005-1000)=-50, relative return: -50/20=-2.5 + # aux1 = 20 + # aux2 = -50 + # party1 and aux1 is not eligible because they don't have sufficient staking + # relative return metric for party2 = -50/20=-2.5 + # relative return metric for aux2 = -50/20=-2.5 + + And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf" should have general account balance of "990000" for asset "VEGA" + + + diff --git a/core/integration/features/rewards/0083-RFPR-068.feature b/core/integration/features/rewards/0083-RFPR-068.feature new file mode 100644 index 0000000000..beb1085ef6 --- /dev/null +++ b/core/integration/features/rewards/0083-RFPR-068.feature @@ -0,0 +1,203 @@ +Feature: Team Rewards + + Background: + + # Initialise the network + Given time is updated to "2023-01-01T00:00:00Z" + And the average block duration is "1" + 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 | + | rewards.team.minEpochsInTeam | 5 | + + # Initialise the markets + And the following assets are registered: + | id | decimal places | quantum | + | USD-1-10 | 1 | 10 | + 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 | default-log-normal-risk-model | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 1e-3 | 0 | default-futures | 0 | 0 | + + # Initialise the parties + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lpprov | USD-1-10 | 10000000000 | + | aux1 | USD-1-10 | 10000000 | + | aux2 | USD-1-10 | 10000000 | + | aux3 | USD-1-10 | 10000000000 | + | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | USD-1-10 | 10000000000 | + | party1 | USD-1-10 | 10000000000 | + | party2 | USD-1-10 | 10000000000 | + | party3 | USD-1-10 | 10000000000 | + + # Exit opening auctions + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | ETH/USD-1-10 | 1000000 | 0.01 | 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/USD-1-10 | 5000 | 1000 | buy | BID | 10000 | 1 | + | lpprov | ETH/USD-1-10 | 5000 | 1000 | sell | ASK | 10000 | 1 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USD-1-10 | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | 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 | + | aux2 | ETH/USD-1-10 | sell | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "ETH/USD-1-10" + When the network moves ahead "1" blocks + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/USD-1-10" + + # Create a team + And the following teams with referees are created: + | referrer | prefix | code | team name | referees | balance | asset | + | referrer1 | ref1 | referral-code-1 | team1 | 1 | 10000000 | USD-1-10 | + + @TeamStep + Scenario: (0083-RFPR-068) Assert that a user joining a team is not eligible for rewards until the number of epochs since joining the team as specified in the rewards.team.minEpochsInTeam network parameter has passed. + + Given the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | entity_scope | individual_scope | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | ntop | + | 1 | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES | TEAMS | TEAMS | USD-1-10 | 10000 | 1 | | 1 | DISPATCH_METRIC_MAKER_FEES_PAID | USD-1-10 | ETH/USD-1-10 | 3 | + # 2 individuals not in a team, 2 in a team, same metrics + # all the individuals can receive rewards =10k/4 = 2,500 each + + When the network moves ahead "1" epochs + And the parties apply the following referral codes: + | party | code | is_team | team | + | referee1 | referral-code-1 | true | team1 | + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | referee1 | USD-1-10 | 10000000000 | + + + # at this point we have two people in the team, ref1-0001 join in epoch 1 and referee1 in epoch 3 + # a team member must be in the team for 5 epochs before getting any rewards until then + # no one gets rewards + When the network moves ahead "3" epochs + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux3 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | ref1-0001 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux3 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | referee1 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + When the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | ref1-0001 | USD-1-10 | 0 | + | referee1 | USD-1-10 | 0 | + + # this epoch we expect rewards for only ref1-0001 + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux3 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | ref1-0001 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux3 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | referee1 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | ref1-0001 | USD-1-10 | 10000 | + | referee1 | USD-1-10 | 0 | + + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux3 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | ref1-0001 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux3 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | referee1 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | ref1-0001 | USD-1-10 | 15000 | + | referee1 | USD-1-10 | 5000 | + +@TeamStep + Scenario: (0083-RFPR-068) Setting min epoch to 0 means rewards straight away + + And the following network parameters are set: + | name | value | + | rewards.team.minEpochsInTeam | 0 | + + Given the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | entity_scope | individual_scope | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | ntop | + | 1 | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES | TEAMS | TEAMS | USD-1-10 | 10000 | 1 | | 1 | DISPATCH_METRIC_MAKER_FEES_PAID | USD-1-10 | ETH/USD-1-10 | 3 | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux3 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | ref1-0001 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux3 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | ref1-0001 | USD-1-10 | 10000 | + +@TeamStep + Scenario: (0083-RFPR-068) Setting min epoch to 1 means one *whole* epoch in a team to get rewards + + And the following network parameters are set: + | name | value | + | rewards.team.minEpochsInTeam | 1 | + + Given the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | entity_scope | individual_scope | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | ntop | + | 1 | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES | TEAMS | TEAMS | USD-1-10 | 10000 | 1 | | 1 | DISPATCH_METRIC_MAKER_FEES_PAID | USD-1-10 | ETH/USD-1-10 | 3 | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux3 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | ref1-0001 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux3 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | ref1-0001 | USD-1-10 | 0 | + + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux3 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | ref1-0001 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux3 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + + + When the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | ref1-0001 | USD-1-10 | 10000 | \ No newline at end of file diff --git a/core/integration/features/rewards/average_position_with_liquidation_reward.feature b/core/integration/features/rewards/average_position_with_liquidation_reward.feature index c8339ba09d..4b802a624a 100644 --- a/core/integration/features/rewards/average_position_with_liquidation_reward.feature +++ b/core/integration/features/rewards/average_position_with_liquidation_reward.feature @@ -51,7 +51,7 @@ Feature: Calculation of average position during closeout trades When the network moves ahead "1" blocks And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/USD-1-10" - @Liquidation @NoPerp + @Liquidation Scenario: Bug time-weighted average position not updated correctly during closeout trades # Setup such that distributed rewards are all vested the following epoch, i,e. the balance in the vested account is equal to the rewards distributed that epocha @@ -105,6 +105,15 @@ Feature: Calculation of average position during closeout trades | aux1 | USD-1-10 | 4000 | | aux2 | USD-1-10 | 2000 | + Given the network moves ahead "1" epochs + # there are still rewards because while the position is 0 at the beginning of the epoch, the timeweighted position will only become 0 + # at the beginning of the next epoch + Then parties should have the following vesting account balances: + | party | asset | balance | + | party1 | USD-1-10 | 3333 | + | aux2 | USD-1-10 | 3333 | + | aux1 | USD-1-10 | 3333 | + Given the network moves ahead "1" epochs # Expect to see no rewards as no positions open at the start of the epoch Then parties should have the following vesting account balances: diff --git a/core/integration/features/rewards/realised_returns.feature b/core/integration/features/rewards/realised_returns.feature new file mode 100644 index 0000000000..00ea2df842 --- /dev/null +++ b/core/integration/features/rewards/realised_returns.feature @@ -0,0 +1,368 @@ +Feature: Realised returns reward metric + + Background: + + Given the average block duration is "1" + And the following network parameters are set: + | name | value | + | validators.epoch.length | 60s | + | market.fee.factors.makerFee | 0.1 | + | network.markPriceUpdateMaximumFrequency | 0s | + + # Setup market and parties + Given the following assets are registered: + | id | decimal places | quantum | + | USDT.0.1 | 0 | 1 | + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | aux1 | USDT.0.1 | 1000000000 | + | aux2 | USDT.0.1 | 1000000000 | + | party1 | USDT.0.1 | 1000000000 | + | party2 | USDT.0.1 | 1000000000 | + | party3 | USDT.0.1 | 1000000000 | + | party4 | USDT.0.1 | 1000000000 | + | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | USDT.0.1 | 1000000000 | + 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/USDT | USDT.0.1 | USDT.0.1 | default-log-normal-risk-model | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 1e-3 | 0 | default-futures | 0 | 0 | + + # Exit opening auction and close the positions of the auxiliary parties so they don't receive rewards + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USDT | buy | 1000 | 1 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | ETH/USDT | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/USDT | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/USDT | sell | 1000 | 1999 | 0 | TYPE_LIMIT | TIF_GTC | + When the opening auction period ends for market "ETH/USDT" + And the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | + | aux1 | 1 | 0 | 0 | + | aux2 | -1 | 0 | 0 | + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/USDT" + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USDT | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/USDT | buy | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + When the network moves ahead "1" blocks + And the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | + | aux1 | 0 | 0 | 0 | + | aux2 | 0 | 0 | 0 | + + +# Scenario: In a falling market where short positions are profitable, parties have only unrealised pnl (0056-REWA-118)(0056-REWA-129) + +# # Set-up a recurring transfer dispatching rewards based on realised profit and loss +# Given the current epoch is "0" +# And the parties submit the following recurring transfers: +# | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | +# | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_REALISED_RETURN | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_REALISED_RETURN | USDT.0.1 | ETH/USDT | 100 | +# And the network moves ahead "1" epochs + +# And the parties place the following orders: +# | party | market id | side | volume | price | resulting trades | type | tif | +# | party1 | ETH/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | +# | party2 | ETH/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | +# | aux1 | ETH/USDT | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | +# | aux2 | ETH/USDT | sell | 1 | 900 | 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 | +# | party1 | 10 | -1000 | 0 | +# | party2 | -10 | 1000 | 0 | +# | aux1 | 1 | 0 | 0 | +# | aux2 | -1 | 0 | 0 | +# # Move to the end of the epoch +# Given the network moves ahead "1" epochs +# Then parties should have the following vesting account balances: +# | party | asset | balance | +# | party1 | USDT.0.1 | 0 | +# | party2 | USDT.0.1 | 0 | + + +# Scenario: In a falling market where short positions are profitable, parties have party realised pnl (0056-REWA-119)(0056-REWA-130) + +# # Set-up a recurring transfer dispatching rewards based on realised profit and loss +# Given the current epoch is "0" +# And the parties submit the following recurring transfers: +# | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | +# | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_REALISED_RETURN | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_REALISED_RETURN | USDT.0.1 | ETH/USDT | 100 | +# And the network moves ahead "1" epochs + +# Given the parties place the following orders: +# | party | market id | side | volume | price | resulting trades | type | tif | +# | party1 | ETH/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | +# | party2 | ETH/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | +# | aux1 | ETH/USDT | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | +# | aux2 | ETH/USDT | sell | 1 | 900 | 1 | TYPE_LIMIT | TIF_GTC | +# Given the parties place the following orders: +# | party | market id | side | volume | price | resulting trades | type | tif | +# | party1 | ETH/USDT | sell | 5 | 900 | 0 | TYPE_LIMIT | TIF_GTC | +# | party2 | ETH/USDT | buy | 5 | 900 | 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 | +# | party1 | 5 | -500 | -500 | +# | party2 | -5 | 500 | 500 | +# | aux1 | 1 | 0 | 0 | +# | aux2 | -1 | 0 | 0 | +# # Move to the end of the epoch +# Given the network moves ahead "1" epochs +# Then parties should have the following vesting account balances: +# | party | asset | balance | +# | party1 | USDT.0.1 | 0 | +# | party2 | USDT.0.1 | 10000 | + + +# Scenario: In a falling market where short positions are profitable, parties have fully realised pnl (0056-REWA-120)(0056-REWA-131) + +# # Set-up a recurring transfer dispatching rewards based on realised profit and loss +# Given the current epoch is "0" +# And the parties submit the following recurring transfers: +# | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | +# | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_REALISED_RETURN | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_REALISED_RETURN | USDT.0.1 | ETH/USDT | 100 | +# And the network moves ahead "1" epochs + +# Given the parties place the following orders: +# | party | market id | side | volume | price | resulting trades | type | tif | +# | party1 | ETH/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | +# | party2 | ETH/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | +# | aux1 | ETH/USDT | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | +# | aux2 | ETH/USDT | sell | 1 | 900 | 1 | TYPE_LIMIT | TIF_GTC | +# Given the parties place the following orders: +# | party | market id | side | volume | price | resulting trades | type | tif | +# | party1 | ETH/USDT | sell | 10 | 900 | 0 | TYPE_LIMIT | TIF_GTC | +# | party2 | ETH/USDT | buy | 10 | 900 | 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 | +# | party1 | 0 | 0 | -1000 | +# | party2 | 0 | 0 | 1000 | +# | aux1 | 1 | 0 | 0 | +# | aux2 | -1 | 0 | 0 | +# # Move to the end of the epoch +# Given the network moves ahead "1" epochs +# Then parties should have the following vesting account balances: +# | party | asset | balance | +# | party1 | USDT.0.1 | 0 | +# | party2 | USDT.0.1 | 10000 | + + +# Scenario: In a falling market where short positions are profitable, parties fully realise pnl and switch sides (0056-REWA-132)(0056-REWA-135) + +# # Set-up a recurring transfer dispatching rewards based on realised profit and loss +# Given the current epoch is "0" +# And the parties submit the following recurring transfers: +# | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | +# | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_REALISED_RETURN | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_REALISED_RETURN | USDT.0.1 | ETH/USDT | 100 | +# And the network moves ahead "1" epochs + +# Given the parties place the following orders: +# | party | market id | side | volume | price | resulting trades | type | tif | +# | party1 | ETH/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | +# | party2 | ETH/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | +# | party3 | ETH/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | +# | party4 | ETH/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | +# | aux1 | ETH/USDT | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | +# | aux2 | ETH/USDT | sell | 1 | 900 | 1 | TYPE_LIMIT | TIF_GTC | +# Given the parties place the following orders: +# | party | market id | side | volume | price | resulting trades | type | tif | +# | party1 | ETH/USDT | sell | 10 | 900 | 0 | TYPE_LIMIT | TIF_GTC | +# | party2 | ETH/USDT | buy | 10 | 900 | 1 | TYPE_LIMIT | TIF_GTC | +# | party3 | ETH/USDT | sell | 15 | 900 | 0 | TYPE_LIMIT | TIF_GTC | +# | party4 | ETH/USDT | buy | 15 | 900 | 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 | +# | party1 | 0 | 0 | -1000 | +# | party2 | 0 | 0 | 1000 | +# | party3 | -5 | 0 | -1000 | +# | party4 | 5 | 0 | 1000 | +# | aux1 | 1 | 0 | 0 | +# | aux2 | -1 | 0 | 0 | +# # Move to the end of the epoch +# Given the network moves ahead "1" epochs +# Then parties should have the following vesting account balances: +# | party | asset | balance | +# | party1 | USDT.0.1 | 0 | +# | party2 | USDT.0.1 | 5000 | +# | party3 | USDT.0.1 | 0 | +# | party4 | USDT.0.1 | 5000 | + + +# Scenario: In a rising market where long positions are profitable, parties have only unrealised pnl (0056-REWA-122)(0056-REWA-125) + +# # Set-up a recurring transfer dispatching rewards based on realised profit and loss +# Given the current epoch is "0" +# And the parties submit the following recurring transfers: +# | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | +# | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_REALISED_RETURN | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_REALISED_RETURN | USDT.0.1 | ETH/USDT | 100 | +# And the network moves ahead "1" epochs + +# And the parties place the following orders: +# | party | market id | side | volume | price | resulting trades | type | tif | +# | party1 | ETH/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | +# | party2 | ETH/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | +# | aux1 | ETH/USDT | buy | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | +# | aux2 | ETH/USDT | sell | 1 | 1100 | 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 | +# | party1 | 10 | 1000 | 0 | +# | party2 | -10 | -1000 | 0 | +# | aux1 | 1 | 0 | 0 | +# | aux2 | -1 | 0 | 0 | +# # Move to the end of the epoch +# Given the network moves ahead "1" epochs +# Then parties should have the following vesting account balances: +# | party | asset | balance | +# | party1 | USDT.0.1 | 0 | +# | party2 | USDT.0.1 | 0 | + + +# Scenario: In a rising market where long positions are profitable, parties have party realised pnl (0056-REWA-123)(0056-REWA-126) + +# # Set-up a recurring transfer dispatching rewards based on realised profit and loss +# Given the current epoch is "0" +# And the parties submit the following recurring transfers: +# | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | +# | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_REALISED_RETURN | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_REALISED_RETURN | USDT.0.1 | ETH/USDT | 100 | +# And the network moves ahead "1" epochs + +# Given the parties place the following orders: +# | party | market id | side | volume | price | resulting trades | type | tif | +# | party1 | ETH/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | +# | party2 | ETH/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | +# | aux1 | ETH/USDT | buy | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | +# | aux2 | ETH/USDT | sell | 1 | 1100 | 1 | TYPE_LIMIT | TIF_GTC | +# Given the parties place the following orders: +# | party | market id | side | volume | price | resulting trades | type | tif | +# | party1 | ETH/USDT | sell | 5 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | +# | party2 | ETH/USDT | buy | 5 | 1100 | 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 | +# | party1 | 5 | 500 | 500 | +# | party2 | -5 | -500 | -500 | +# | aux1 | 1 | 0 | 0 | +# | aux2 | -1 | 0 | 0 | +# # Move to the end of the epoch +# Given the network moves ahead "1" epochs +# Then parties should have the following vesting account balances: +# | party | asset | balance | +# | party1 | USDT.0.1 | 10000 | +# | party2 | USDT.0.1 | 0 | + + +# Scenario: In a rising market where long positions are profitable, parties have fully realised pnl (0056-REWA-124)(0056-REWA-127) + +# # Set-up a recurring transfer dispatching rewards based on realised profit and loss +# Given the current epoch is "0" +# And the parties submit the following recurring transfers: +# | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | +# | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_REALISED_RETURN | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_REALISED_RETURN | USDT.0.1 | ETH/USDT | 100 | +# And the network moves ahead "1" epochs + +# Given the parties place the following orders: +# | party | market id | side | volume | price | resulting trades | type | tif | +# | party1 | ETH/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | +# | party2 | ETH/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | +# | aux1 | ETH/USDT | buy | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | +# | aux2 | ETH/USDT | sell | 1 | 1100 | 1 | TYPE_LIMIT | TIF_GTC | +# Given the parties place the following orders: +# | party | market id | side | volume | price | resulting trades | type | tif | +# | party1 | ETH/USDT | sell | 10 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | +# | party2 | ETH/USDT | buy | 10 | 1100 | 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 | +# | party1 | 0 | 0 | 1000 | +# | party2 | 0 | 0 | -1000 | +# | aux1 | 1 | 0 | 0 | +# | aux2 | -1 | 0 | 0 | +# # Move to the end of the epoch +# Given the network moves ahead "1" epochs +# Then parties should have the following vesting account balances: +# | party | asset | balance | +# | party1 | USDT.0.1 | 10000 | +# | party2 | USDT.0.1 | 0 | + + +# Scenario: In a rising market where long positions are profitable, parties fully realise pnl and switch sides (0056-REWA-133)(0056-REWA-134) + +# # Set-up a recurring transfer dispatching rewards based on realised profit and loss +# Given the current epoch is "0" +# And the parties submit the following recurring transfers: +# | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | +# | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_REALISED_RETURN | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_REALISED_RETURN | USDT.0.1 | ETH/USDT | 100 | +# And the network moves ahead "1" epochs + +# Given the parties place the following orders: +# | party | market id | side | volume | price | resulting trades | type | tif | +# | party1 | ETH/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | +# | party2 | ETH/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | +# | party3 | ETH/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | +# | party4 | ETH/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | +# | aux1 | ETH/USDT | buy | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | +# | aux2 | ETH/USDT | sell | 1 | 1100 | 1 | TYPE_LIMIT | TIF_GTC | +# Given the parties place the following orders: +# | party | market id | side | volume | price | resulting trades | type | tif | +# | party1 | ETH/USDT | sell | 10 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | +# | party2 | ETH/USDT | buy | 10 | 1100 | 1 | TYPE_LIMIT | TIF_GTC | +# | party3 | ETH/USDT | sell | 15 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | +# | party4 | ETH/USDT | buy | 15 | 1100 | 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 | +# | party1 | 0 | 0 | 1000 | +# | party2 | 0 | 0 | -1000 | +# | party3 | -5 | 0 | 1000 | +# | party4 | 5 | 0 | -1000 | +# | aux1 | 1 | 0 | 0 | +# | aux2 | -1 | 0 | 0 | +# # Move to the end of the epoch +# Given the network moves ahead "1" epochs +# Then parties should have the following vesting account balances: +# | party | asset | balance | +# | party1 | USDT.0.1 | 5000 | +# | party2 | USDT.0.1 | 0 | +# | party3 | USDT.0.1 | 5000 | +# | party4 | USDT.0.1 | 0 | + + + Scenario: Parties with long and short positions open and close position at same price, they have 0 realised returns but should still receive rewards (0056-REWA-121)(0056-REWA-128) + + # Set-up a recurring transfer dispatching rewards based on realised profit and loss + Given the current epoch is "0" + And the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | + | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_REALISED_RETURN | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_REALISED_RETURN | USDT.0.1 | ETH/USDT | 100 | + And the network moves ahead "1" epochs + + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | party3 | ETH/USDT | buy | 10 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/USDT | sell | 10 | 1100 | 1 | TYPE_LIMIT | TIF_GTC | + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/USDT | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/USDT | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | party3 | ETH/USDT | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/USDT | 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 | + | party1 | 0 | 0 | 0 | + | party2 | 0 | 0 | 0 | + | party3 | 0 | 0 | -1000 | + | party4 | 0 | 0 | 1000 | + # Move to the end of the epoch + Given the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | party1 | USDT.0.1 | 2500 | + | party2 | USDT.0.1 | 2500 | + | party3 | USDT.0.1 | 0 | + | party4 | USDT.0.1 | 5000 | \ No newline at end of file diff --git a/core/integration/features/rewards/relative_return_rewards.feature b/core/integration/features/rewards/relative_return_rewards.feature index 8197a61c90..f82ca01d7c 100644 --- a/core/integration/features/rewards/relative_return_rewards.feature +++ b/core/integration/features/rewards/relative_return_rewards.feature @@ -42,6 +42,8 @@ Feature: Relative return rewards | lpprov | ETH | 200000000 | | party1 | ETH | 100000 | | party2 | ETH | 100000 | + | party3 | ETH | 100000 | + | party4 | ETH | 100000 | And the parties deposit on staking account the following amount: @@ -53,6 +55,8 @@ Feature: Relative return rewards | lpprov | VEGA | 10000 | | party1 | VEGA | 2000 | | party2 | VEGA | 2000 | + | party3 | VEGA | 2000 | + | party4 | VEGA | 2000 | Given time is updated to "2023-09-23T00:00:00Z" @@ -155,7 +159,7 @@ Feature: Relative return rewards And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf" should have general account balance of "990000" for asset "VEGA" And "aux2" should have vesting account balance of "10000" for asset "VEGA" - Scenario: multiple eligible parties split the reward (0056-REWA-084,0056-REWA-085) + Scenario: multiple eligible parties split the reward (0056-REWA-112,0056-REWA-113) # setup recurring transfer to the reward account - this will start at the end of this epoch Given the parties submit the following recurring transfers: | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | window_length | distribution_strategy | entity_scope | individual_scope | staking_requirement | notional_requirement | @@ -175,15 +179,16 @@ Feature: Relative return rewards | aux2 | ETH/DEC21 | buy | 10 | 999 | 1 | TYPE_LIMIT | TIF_GTC | | Then the network moves ahead "1" epochs - - # party1 is the loser and has negative metric therefore is not getting any reward. + # party1 is the loser and has negative metric and is the only loser so they don't get a reward. # aux1 and aux2 split the reward proportionally to their metric # both aux1 and aux2 are eligible + # pre adjustment by the negative of party1 we have: aux1 20, aux2 10, party1 -30 + # post adjustmnet by -30 of party1 we have: aux1: 50, aux2 40, party1 0. And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf" should have general account balance of "990000" for asset "VEGA" - And "aux1" should have vesting account balance of "6666" for asset "VEGA" - And "aux2" should have vesting account balance of "3333" for asset "VEGA" + And "aux1" should have vesting account balance of "5555" for asset "VEGA" + And "aux2" should have vesting account balance of "4444" for asset "VEGA" - Scenario: multiple epochs multiple positions (0056-REWA-087) + Scenario: multiple epochs multiple positions (0056-REWA-115) Given the network moves ahead "1" epochs # setup recurring transfer to the reward account - this will start at the end of this epoch @@ -209,11 +214,15 @@ Feature: Relative return rewards # metric over a window=2: # aux1 = 2 # party1 = 0.5 - # aux1 gets 10000 * 2/2.5 = 8000 - # party1 gets 10000 * 0.5/2.5 = 2000 + # aux2 get -1.6666666666666667/2 = -0.8333 + # after adjustment: + # aux1 gets 10000 * 2.8333/4.16 = 6800 + # party1 gets 10000 * 1.333/4.16 = 3200 + # note the adjustment by the negative of aux2 which is the lowest negative return so after adjustment + # gets nothing. And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf" should have general account balance of "990000" for asset "VEGA" - And "aux1" should have vesting account balance of "8000" for asset "VEGA" - And "party1" should have vesting account balance of "2000" for asset "VEGA" + And "aux1" should have vesting account balance of "6800" for asset "VEGA" + And "party1" should have vesting account balance of "3200" for asset "VEGA" Then the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | reference | @@ -231,14 +240,21 @@ Feature: Relative return rewards # aux1 = [4, -1.3333333333333333] => 1.3333333333 # party1 = [1, -0.8] => 0.1 # aux2 = [-1.6666666666666667, 4] => 1.1666666667 - # party2 = [0, -4] => 0 - # aux1 gets: 10000*1.3333333333/2.6 = 5128 - # party1 gets: 10000*0.1/2.6 = 384 - # aux2 gets: 10000*1.1666666667/2.6 = 4487 + # party2 = [0, -4] => -2 + # with offset adjustment -2 + # aux1 = 3.3333333333 + # party1 = 2.1 + # aux2 = 3.1666666667 + # party2 = 0 + + # aux1 gets: 10000*3.3333333333/8.6 = 3876, 3876+6800=10676 + # party1 gets: 10000*2.1/8.6 = 2441, 2418+3200 = 5641 + # aux2 gets: 10000*3.1666666667/8.6 = 3682 + And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf" should have general account balance of "980000" for asset "VEGA" - And "aux1" should have vesting account balance of "13128" for asset "VEGA" - And "party1" should have vesting account balance of "2384" for asset "VEGA" - And "aux2" should have vesting account balance of "4487" for asset "VEGA" + And "aux1" should have vesting account balance of "10675" for asset "VEGA" + And "party1" should have vesting account balance of "5641" for asset "VEGA" + And "aux2" should have vesting account balance of "3682" for asset "VEGA" Scenario: multiple multiple markets - only one in scope Given the network moves ahead "1" epochs @@ -276,8 +292,8 @@ Feature: Relative return rewards # aux1 gets 10000 * 2/2.5 = 8000 # party1 gets 10000 * 0.5/2.5 = 2000 And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf" should have general account balance of "990000" for asset "VEGA" - And "aux1" should have vesting account balance of "8000" for asset "VEGA" - And "party1" should have vesting account balance of "2000" for asset "VEGA" + And "aux1" should have vesting account balance of "6800" for asset "VEGA" + And "party1" should have vesting account balance of "3200" for asset "VEGA" Scenario: If an eligible party is participating in multiple in-scope markets, their relative returns reward metric should be the sum of their relative returns from each market (0056-REWA-085,0056-REWA-086, with pro rata distribution strategy 0056-REWA-093) Then the network moves ahead "1" epochs @@ -321,7 +337,7 @@ Feature: Relative return rewards # aux2 m2m=10 p=2.5 => ret=4 # metric over a window=2 - # party1 = -1.6666666666666667-3.3333333333333333 = 0 + # party1 = -1.6666666666666667-3.3333333333333333 = -5 # party2 = 6/2 = 3 # aux1 = 4/2 = 2 # aux2 = (4-1.6666666666666667)/2 = 1.1666666667 @@ -329,12 +345,12 @@ Feature: Relative return rewards # reward # aux1 = 10000*2/6.1666666667 = 3243 # aux2 = 10000*1.1666666667/6.1666666667 = 1891 - # party2 = 10000*3/6.1666666667 = 4864 + # party2 = 10000*3/6.1666666667 = 4310 And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf" should have general account balance of "990000" for asset "VEGA" - And "aux1" should have vesting account balance of "3243" for asset "VEGA" - And "aux2" should have vesting account balance of "1891" for asset "VEGA" - And "party2" should have vesting account balance of "4864" for asset "VEGA" + And "aux1" should have vesting account balance of "3275" for asset "VEGA" + And "aux2" should have vesting account balance of "2413" for asset "VEGA" + And "party2" should have vesting account balance of "4310" for asset "VEGA" Scenario: If an eligible party is participating in multiple in-scope markets, their relative returns reward metric should be the sum of their relative returns from each market (0056-REWA-085,0056-REWA-086, with rank distribution strategy 0056-REWA-094) Then the network moves ahead "1" epochs @@ -388,8 +404,8 @@ Feature: Relative return rewards # 1. party2 => 10000 * 10/20 = 5000 # 2. aux1 => 10000 * 5/20 = 2500 # 3. aux2 => 10000 * 5/20 = 2500 - + And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf" should have general account balance of "990000" for asset "VEGA" And "aux1" should have vesting account balance of "2500" for asset "VEGA" And "aux2" should have vesting account balance of "2500" for asset "VEGA" - And "party2" should have vesting account balance of "5000" for asset "VEGA" \ No newline at end of file + And "party2" should have vesting account balance of "5000" for asset "VEGA" diff --git a/core/integration/features/rewards/return_volatility_rewards.feature b/core/integration/features/rewards/return_volatility_rewards.feature index ab21b0bb77..259a690caa 100644 --- a/core/integration/features/rewards/return_volatility_rewards.feature +++ b/core/integration/features/rewards/return_volatility_rewards.feature @@ -246,13 +246,13 @@ Feature: Return volatility rewards Then the network moves ahead "1" epochs # looking at the returns of all parties for a window of 2: - # aux1 = [4,1] => variance = 4.5 + # aux1 = [4,1] => variance = 1/4.5 = 0.2222222222 # aux2 = [0,0] => N/A - # party1 = [2,1] => variance = 0.5 => has sufficient average therefore is eligible + # party1 = [2,1] => variance = 1/0.5 => 2 has sufficient average therefore is eligible # party2 = [0] => N/A And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf" should have general account balance of "990000" for asset "VEGA" - And "aux1" should have vesting account balance of "9000" for asset "VEGA" - And "party1" should have vesting account balance of "1000" for asset "VEGA" + And "aux1" should have vesting account balance of "1000" for asset "VEGA" + And "party1" should have vesting account balance of "9000" for asset "VEGA" Scenario: multiple multiple markets - only one in scope # setup recurring transfer to the reward account - this will start at the end of this epoch @@ -308,13 +308,13 @@ Feature: Return volatility rewards Then the network moves ahead "1" epochs # looking at the returns of all parties for a window of 2 for only market ETH/DEC21 - # aux1 = [4,1] => variance = 4.5 + # aux1 = [4,1] => variance = 4.5 => 1/4.5 = 0.2222222222 # aux2 = [0,0] => N/A - # party1 = [2,1] => variance = 0.5 + # party1 = [2,1] => variance = 0.5 => 1/0.5 = 2 # party2 = [0] => N/A And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf" should have general account balance of "990000" for asset "VEGA" - And "aux1" should have vesting account balance of "9000" for asset "VEGA" - And "party1" should have vesting account balance of "1000" for asset "VEGA" + And "aux1" should have vesting account balance of "1000" for asset "VEGA" + And "party1" should have vesting account balance of "9000" for asset "VEGA" Scenario: multiple multiple (0056-REWA-090,0056-REWA-093,0056-REWA-094) # not that this test is also demonstrating multiple transfers to the same reward account but with different dispatch strategies, though same metric and same metric asset, @@ -396,24 +396,28 @@ Feature: Return volatility rewards # party2 return = -4 # total: - # aux1 = [6.2857142857142857, 2] => variance = 4.5918367346938775 - # aux2 = [-9.75, 1] => N/A + # aux1 = [6.2857142857142857, 2] => variance = 1/4.5918367346938775 = 0.2177777778 + # aux2 = [-9.75, 1] => 1/28.890625 = 0.03461330449 # party1 = [4, 2] => variance = 1 - # party2 = [,-5.4285714285714286] => N/A + # party2 = [,-5.4285714285714286] => 0 # pro rata rewards from transfer1: - # aux1 = 10000 * 4.5918367346938775/5.5918367346938775 = 8211 - # party1 = 10000 * 1/5.5918367346938775 = 1788 + # aux1 = 10000 * 0.2177777778/1.2523910823 = 1738 + # aux2 = 10000 * 0.03461330449/1.2523910823 = 276 + # party1 = 10000 * 1/1.2523910823 = 7984 # rank rewards from transfer2: - # aux1 = 10/15 * 10000 = 6666 - # party1 = 5/15 * 10000 = 3333 + # aux1 = 2500 + # aux2 = 2500 + # party1 = 5000 # total - # aux1 = 8211 + 6666 = 14877 - # party1 = 1788 + 3333 = 5121 + # aux1 = 1738 + 2500 = 4238 + # aux2 = 276 + 2500 = 5276 + # party1 = 7984 + 5000 = 12984 And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf" should have general account balance of "990000" for asset "VEGA" And "a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca4ffffffffff" should have general account balance of "90000" for asset "VEGA" - And "aux1" should have vesting account balance of "14877" for asset "VEGA" - And "party1" should have vesting account balance of "5121" for asset "VEGA" + And "aux1" should have vesting account balance of "4238" for asset "VEGA" + And "aux2" should have vesting account balance of "2776" for asset "VEGA" + And "party1" should have vesting account balance of "12984" for asset "VEGA" diff --git a/core/integration/features/rewards/spot-rewards.feature b/core/integration/features/rewards/spot-rewards.feature new file mode 100644 index 0000000000..8d181ce9a0 --- /dev/null +++ b/core/integration/features/rewards/spot-rewards.feature @@ -0,0 +1,480 @@ +Feature: Distributing rewards to parties based on trading activity in Spot markets + + Parties actively trading on Spot markets should be eligible to recieve + rewards based on the maker fees they pay or receive as well as any + liquidity fees received. + + Tests validate trading activity contributes correctly to each metric + on Spot markets. + + Background: + + # Initialise the network + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 60s | + | market.fee.factors.makerFee | 0.01 | + And the following assets are registered: + | id | decimal places | quantum | + | USDT.0.1 | 0 | 1 | + | BTC.0.1 | 0 | 1 | + | ETH.0.1 | 0 | 1 | + And the average block duration is "1" + + # Setup the parties + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | BTC.0.1 | 10000000 | + | lp2 | BTC.0.1 | 10000000 | + | aux1 | BTC.0.1 | 10000000 | + | aux2 | BTC.0.1 | 10000000 | + | buyer1 | BTC.0.1 | 10000000 | + | buyer2 | BTC.0.1 | 10000000 | + | seller1 | BTC.0.1 | 10000000 | + | seller2 | BTC.0.1 | 10000000 | + | lp1 | ETH.0.1 | 10000000 | + | lp2 | ETH.0.1 | 10000000 | + | aux1 | ETH.0.1 | 10000000 | + | aux2 | ETH.0.1 | 10000000 | + | buyer1 | ETH.0.1 | 10000000 | + | buyer2 | ETH.0.1 | 10000000 | + | seller1 | ETH.0.1 | 10000000 | + | seller2 | ETH.0.1 | 10000000 | + | lp1 | USDT.0.1 | 10000000000 | + | lp2 | USDT.0.1 | 10000000000 | + | aux1 | USDT.0.1 | 10000000000 | + | aux2 | USDT.0.1 | 10000000000 | + | buyer1 | USDT.0.1 | 10000000000 | + | buyer2 | USDT.0.1 | 10000000000 | + | seller1 | USDT.0.1 | 10000000000 | + | seller2 | USDT.0.1 | 10000000000 | + | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | USDT.0.1 | 10000000000 | + + # Setup the BTC/USDT (zero dp) and ETH/USDT (non-zero dp) spot markets and the GOLD/USDT leveraged market (future or perpetual depending on test) + 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/USDT | BTC/USDT | BTC.0.1 | USDT.0.1 | default-log-normal-risk-model | 1 | default-none | default-none | 0 | 0 | default-basic | + | ETH/USDT | ETH/USDT | ETH.0.1 | USDT.0.1 | default-log-normal-risk-model | 1 | default-none | default-none | 1 | 1 | default-basic | + 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 | + | GOLD/USDT | USDT | USDT.0.1 | default-log-normal-risk-model | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 1e-3 | 0 | default-futures | 0 | 0 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1-BTC | lp1 | BTC/USDT | 10000 | 0.01 | submission | + | lp1-ETH | lp1 | ETH/USDT | 10000 | 0.01 | submission | + | lp2-BTC | lp2 | BTC/USDT | 10000 | 0.01 | submission | + | lp2-ETH | lp2 | ETH/USDT | 10000 | 0.01 | submission | + | lp1-GOLD | lp1 | GOLD/USDT | 10000 | 0.01 | submission | + | lp2-GOLD | lp2 | GOLD/USDT | 10000 | 0.01 | submission | + # On the BTC/USDT market, only lp1 will meet their commitment and receive liquidity rewards + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp1 | BTC/USDT | buy | 10 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | lp1 | BTC/USDT | sell | 10 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + # On the ETH/USDT market, only lp1 will meet their commitment and receive liquidity rewards + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp1 | ETH/USDT | buy | 100 | 9990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | ETH/USDT | buy | 100 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/USDT | sell | 100 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | lp1 | ETH/USDT | sell | 100 | 10010 | 0 | TYPE_LIMIT | TIF_GTC | + # On the GOLD/USDT market, only lp2 will meet their commitment and receive liquidity rewards + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp2 | GOLD/USDT | buy | 10 | 999 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | GOLD/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | GOLD/USDT | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | lp2 | GOLD/USDT | sell | 10 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/USDT" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/USDT" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "GOLD/USDT" + + + Scenario: In multiple spot markets, buyers pay maker fees and earn maker fees paid rewards. (0056-REWA-152) + + # Set-up a recurring transfer + Given the current epoch is "0" + And the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | + | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_MAKER_FEES_PAID | USDT.0.1 | | 100 | + And the network moves ahead "1" epochs + + # Generate trades on two different markets using a different number of decimal places + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | seller1 | BTC/USDT | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | buyer1 | BTC/USDT | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | seller2 | ETH/USDT | sell | 100 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | buyer2 | ETH/USDT | buy | 100 | 10000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | seller | price | size | buyer maker fee | seller maker fee | + | buyer1 | seller1 | 1000 | 10 | 100 | 0 | + | buyer2 | seller2 | 10000 | 100 | 100 | 0 | + + # Move to the end of the epoch - buyer1 and buyer2 receive equal + # rewards as they paid the same maker fees on their respective + # spot market. + Given the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | buyer1 | USDT.0.1 | 5000 | + | buyer2 | USDT.0.1 | 5000 | + | seller1 | USDT.0.1 | 0 | + | seller2 | USDT.0.1 | 0 | + + + Scenario: In multiple spot market, sellers pay maker fees and earn maker fees paid rewards. (0056-REWA-153) + + # Set-up a recurring transfer + Given the current epoch is "0" + And the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | + | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_MAKER_FEES_PAID | USDT.0.1 | | 100 | + And the network moves ahead "1" epochs + + # Generate trades on two different markets using a different number of decimal places + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | buyer1 | BTC/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | seller1 | BTC/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | buyer2 | ETH/USDT | buy | 100 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | seller2 | ETH/USDT | sell | 100 | 10000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | seller | price | size | buyer maker fee | seller maker fee | + | buyer1 | seller1 | 1000 | 10 | 0 | 100 | + | buyer2 | seller2 | 10000 | 100 | 0 | 100 | + + # Move to the end of the epoch - seller1 and seller2 receive equal + # rewards as they paid the same maker fees on their respective + # spot market. + Given the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | buyer1 | USDT.0.1 | 0 | + | buyer1 | USDT.0.1 | 0 | + | seller1 | USDT.0.1 | 5000 | + | seller1 | USDT.0.1 | 5000 | + + + Scenario: In multiple spot markets, buyers receive maker fees and earn maker fees received rewards. (0056-REWA-154) + + # Set-up a recurring transfer + Given the current epoch is "0" + And the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | + | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_MAKER_RECEIVED_FEES | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_MAKER_FEES_RECEIVED | USDT.0.1 | | 100 | + And the network moves ahead "1" epochs + + # Generate trades on two different markets using a different number of decimal places + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | buyer1 | BTC/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | seller1 | BTC/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | buyer2 | ETH/USDT | buy | 100 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | seller2 | ETH/USDT | sell | 100 | 10000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | seller | price | size | buyer maker fee | seller maker fee | + | buyer1 | seller1 | 1000 | 10 | 0 | 100 | + | buyer2 | seller2 | 10000 | 100 | 0 | 100 | + + # Move to the end of the epoch - buyer1 and buyer2 receive equal + # rewards as they received the same maker fees on their respective + # spot market. + Given the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | buyer1 | USDT.0.1 | 5000 | + | buyer2 | USDT.0.1 | 5000 | + | seller1 | USDT.0.1 | 0 | + | seller2 | USDT.0.1 | 0 | + + + Scenario: In multiple spot markets, sellers receive maker fees and earn maker fees received rewards. (0056-REWA-155) + + # Set-up a recurring transfer + Given the current epoch is "0" + And the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | + | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_MAKER_RECEIVED_FEES | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_MAKER_FEES_RECEIVED | USDT.0.1 | | 100 | + And the network moves ahead "1" epochs + + # Generate trades on two different markets using a different number of decimal places + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | seller1 | BTC/USDT | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | buyer1 | BTC/USDT | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | seller2 | ETH/USDT | sell | 100 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | buyer2 | ETH/USDT | buy | 100 | 10000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | seller | price | size | buyer maker fee | seller maker fee | + | buyer1 | seller1 | 1000 | 10 | 100 | 0 | + | buyer2 | seller2 | 10000 | 100 | 100 | 0 | + + # Move to the end of the epoch - seller1 and seller2 receive equal + # rewards as they received the same maker fees on their respective + # spot market. + Given the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | buyer1 | USDT.0.1 | 0 | + | buyer2 | USDT.0.1 | 0 | + | seller1 | USDT.0.1 | 5000 | + | seller2 | USDT.0.1 | 5000 | + + + Scenario: In multiple spot markets, liquidity providers who receive liquidity fees, earn liquidity fees received rewards. (0056-REWA-156) + + # Set-up a recurring transfer + Given the current epoch is "0" + And the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | + | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_LP_RECEIVED_FEES | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_LP_FEES_RECEIVED | USDT.0.1 | | 100 | + And the network moves ahead "1" epochs + + # Generate trades on two different markets using a different number of decimal places + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | seller1 | BTC/USDT | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | buyer1 | BTC/USDT | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | seller2 | ETH/USDT | sell | 100 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | buyer2 | ETH/USDT | buy | 100 | 10000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | seller | price | size | buyer liquidity fee | seller liquidity fee | + | buyer1 | seller1 | 1000 | 10 | 100 | 0 | + | buyer2 | seller2 | 10000 | 100 | 100 | 0 | + + # Move to the end of the epoch - lp1 receives all the rewards as + # they were the only lp to meet their commitment. + Given the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | lp1 | USDT.0.1 | 10000 | + | lp2 | USDT.0.1 | 0 | + | buyer1 | USDT.0.1 | 0 | + | buyer2 | USDT.0.1 | 0 | + | seller1 | USDT.0.1 | 0 | + | seller2 | USDT.0.1 | 0 | + + + Scenario Outline: Given spot markets where the base asset matches the dispatch metric of a reward, rewards will not be paid out as fees are paid in the quote asset. (0056-REWA-157)(0056-REWA-158)(0056-REWA-159)(0056-REWA-160)(0056-REWA-161) + + # Set-up a recurring transfer + Given the current epoch is "0" + And the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | + | reward-btc | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | | USDT.0.1 | 10000 | 1 | | 1 | | BTC.0.1 | | 100 | + | reward-eth | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | | USDT.0.1 | 10000 | 1 | | 1 | | ETH.0.1 | | 100 | + And the network moves ahead "1" epochs + + # Generate trades on two different markets using a different number of decimal places + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | seller1 | BTC/USDT | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | buyer1 | BTC/USDT | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | buyer2 | BTC/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | seller2 | BTC/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | seller1 | ETH/USDT | sell | 100 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | buyer1 | ETH/USDT | buy | 100 | 10000 | 1 | TYPE_LIMIT | TIF_GTC | + | buyer2 | ETH/USDT | buy | 100 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | seller2 | ETH/USDT | sell | 100 | 10000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | seller | price | size | buyer maker fee | seller maker fee | buyer liquidity fee | seller liquidity fee | + | buyer1 | seller1 | 1000 | 10 | 100 | 0 | 100 | 0 | + | buyer2 | seller2 | 1000 | 10 | 0 | 100 | 0 | 100 | + | buyer1 | seller1 | 10000 | 100 | 100 | 0 | 100 | 0 | + | buyer2 | seller2 | 10000 | 100 | 0 | 100 | 0 | 100 | + + # Move to the end of the epoch - no parties should receive any + # rewards as the asset for metric scoped the base asset. + Given the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | lp1 | USDT.0.1 | 0 | + | buyer1 | USDT.0.1 | 0 | + | buyer2 | USDT.0.1 | 0 | + | seller1 | USDT.0.1 | 0 | + | seller2 | USDT.0.1 | 0 | + + Examples: + | account type | dispatch metric | + | ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES | DISPATCH_METRIC_MAKER_FEES_PAID | + | ACCOUNT_TYPE_REWARD_MAKER_RECEIVED_FEES | DISPATCH_METRIC_MAKER_FEES_RECEIVED | + | ACCOUNT_TYPE_REWARD_LP_RECEIVED_FEES | DISPATCH_METRIC_LP_FEES_RECEIVED | + + + Scenario Outline: Given spot markets, trading activity does not contribute to metrics which can not be evaluated. (0056-REWA-162)(0056-REWA-163)(0056-REWA-164) + + # Set-up a recurring transfer + Given the current epoch is "0" + And the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | + | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | | USDT.0.1 | 10000 | 1 | | 1 | | USDT.0.1 | | 100 | + And the network moves ahead "1" epochs + + # Generate trades on two different markets using a different number of decimal places + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/USDT" + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | seller1 | BTC/USDT | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | buyer1 | BTC/USDT | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | seller2 | ETH/USDT | sell | 100 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | buyer2 | ETH/USDT | buy | 100 | 10000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | seller | price | size | buyer maker fee | seller maker fee | + | buyer1 | seller1 | 1000 | 10 | 100 | 0 | + | buyer2 | seller2 | 10000 | 100 | 100 | 0 | + + # Move to the end of the epoch - no parties should receive any + # rewards as the dispatch metric can not be evaluated on a Spot + # market. + Given the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | buyer1 | USDT.0.1 | 0 | + | buyer2 | USDT.0.1 | 0 | + | seller1 | USDT.0.1 | 0 | + | seller2 | USDT.0.1 | 0 | + + Examples: + | account type | dispatch metric | + | ACCOUNT_TYPE_REWARD_AVERAGE_POSITION | DISPATCH_METRIC_AVERAGE_POSITION | + | ACCOUNT_TYPE_REWARD_RELATIVE_RETURN | DISPATCH_METRIC_RELATIVE_RETURN | + | ACCOUNT_TYPE_REWARD_REALISED_RETURN | DISPATCH_METRIC_REALISED_RETURN | + + + Scenario: Given a maker fees paid reward, contributions from a spot market are correctly aggregated with markets allowing leverage. (0056-REWA-165) + + # Set-up a recurring transfer + Given the current epoch is "0" + And the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | + | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_MAKER_FEES_PAID | USDT.0.1 | | 100 | + And the network moves ahead "1" epochs + + # Generate trades on the spot market + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | buyer1 | BTC/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | seller1 | BTC/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | seller | price | size | buyer maker fee | seller liquidity fee | + | buyer1 | seller1 | 1000 | 10 | 0 | 100 | + + Given clear trade events + + # Generate trades on the leveraged market + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | seller2 | GOLD/USDT | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | buyer2 | GOLD/USDT | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | seller | price | size | buyer liquidity fee | seller maker fee | + | buyer2 | seller2 | 1000 | 10 | 100 | 0 | + + # Move to the end of the epoch - seller1 and buyer2 should receive + # equal rewards as they PAID an equal amount of maker fees on the + # spot and leveraged markets respectively. + Given the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | buyer1 | USDT.0.1 | 0 | + | seller1 | USDT.0.1 | 5000 | + | buyer2 | USDT.0.1 | 5000 | + | seller2 | USDT.0.1 | 0 | + + + Scenario: Given a maker fees received reward, contributions from a spot market are correctly aggregated with markets allowing leverage. (0056-REWA-166) + + # Set-up a recurring transfer + Given the current epoch is "0" + And the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | + | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_MAKER_RECEIVED_FEES | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_MAKER_FEES_RECEIVED | USDT.0.1 | | 100 | + And the network moves ahead "1" epochs + + # Generate trades on the spot market + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | buyer1 | BTC/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | seller1 | BTC/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | seller | price | size | buyer maker fee | seller liquidity fee | + | buyer1 | seller1 | 1000 | 10 | 0 | 100 | + + Given clear trade events + + # Generate trades on the leveraged market + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | seller2 | GOLD/USDT | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | buyer2 | GOLD/USDT | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | seller | price | size | buyer liquidity fee | seller maker fee | + | buyer2 | seller2 | 1000 | 10 | 100 | 0 | + + # Move to the end of the epoch - buyer1 and seller2 should receive + # equal rewards as they received an equal amount of maker fees on + # the spot and leveraged markets respectively. + Given the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | buyer1 | USDT.0.1 | 5000 | + | seller1 | USDT.0.1 | 0 | + | buyer2 | USDT.0.1 | 0 | + | seller2 | USDT.0.1 | 5000 | + + + Scenario: Given a liquidity fees received reward, contributions from a spot market are correctly aggregated with markets allowing leverage. (0056-REWA-167) + + # Set-up a recurring transfer + Given the current epoch is "0" + And the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | lock_period | + | reward | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_LP_RECEIVED_FEES | USDT.0.1 | 10000 | 1 | | 1 | DISPATCH_METRIC_LP_FEES_RECEIVED | USDT.0.1 | | 100 | + And the network moves ahead "1" epochs + + # Generate trades on the spot market + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | buyer1 | BTC/USDT | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | seller1 | BTC/USDT | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | seller | price | size | buyer maker fee | seller liquidity fee | + | buyer1 | seller1 | 1000 | 10 | 0 | 100 | + + Given clear trade events + + # Generate trades on the leveraged market + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | seller2 | GOLD/USDT | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | buyer2 | GOLD/USDT | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | seller | price | size | buyer liquidity fee | seller maker fee | + | buyer2 | seller2 | 1000 | 10 | 100 | 0 | + + # Move to the end of the epoch - LP1 and LP2 should receive equal + # rewards as they received an equal amount of liquidity fees from + # the spot and leveraged markets respectively. + Given the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | lp1 | USDT.0.1 | 5000 | + | lp2 | USDT.0.1 | 5000 | diff --git a/core/integration/features/rewards/team-rewards.feature b/core/integration/features/rewards/team-rewards.feature index d9b6e0ab3b..71ed25d1ea 100644 --- a/core/integration/features/rewards/team-rewards.feature +++ b/core/integration/features/rewards/team-rewards.feature @@ -86,9 +86,9 @@ Feature: Team Rewards | aux1 | ETH/USD-1-10 | sell | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | referee3 | ETH/USD-1-10 | buy | 5 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | When the network moves ahead "1" epochs - Then "referee1" should have vesting account balance of "5000" for asset "USD-1-10" - And "referee2" should have vesting account balance of "2500" for asset "USD-1-10" - And "referee3" should have vesting account balance of "2500" for asset "USD-1-10" + Then "referee1" should have vesting account balance of "5714" for asset "USD-1-10" + And "referee2" should have vesting account balance of "2142" for asset "USD-1-10" + And "referee3" should have vesting account balance of "2142" for asset "USD-1-10" diff --git a/core/integration/features/settlement/mark_to_market_interval_positions.feature b/core/integration/features/settlement/mark_to_market_interval_positions.feature index 8f4fc621b0..76a16da114 100644 --- a/core/integration/features/settlement/mark_to_market_interval_positions.feature +++ b/core/integration/features/settlement/mark_to_market_interval_positions.feature @@ -25,7 +25,7 @@ Feature: Check position tracking matches expected behaviour with MTM intervals. | network.markPriceUpdateMaximumFrequency | 5s | | limits.markets.maxPeggedOrders | 2 | - @Liquidation @NoPerp + @Liquidation Scenario: 001, using lognormal risk model, set "designatedLoser" closeout while the position of "designatedLoser" is not fully covered by orders on the order book (0007-POSN-013) # setup accounts Given the parties deposit on asset's general account the following amount: @@ -199,7 +199,7 @@ Feature: Check position tracking matches expected behaviour with MTM intervals. And the insurance pool balance should be "0" for the market "ETH/DEC19" - @Liquidation @NoPerp + @Liquidation Scenario: 002, closeout trade with price outside price mornitoring bounds will not trigger auction 0032-PRIM-019 # setup accounts Given the parties deposit on asset's general account the following amount: @@ -352,7 +352,6 @@ Feature: Check position tracking matches expected behaviour with MTM intervals. | party | asset | market id | margin | general | | designatedLoser | USD | ETH/DEC20 | 0 | 0 | - @NoPerp Scenario: 003, settlement works correctly when party enters and leaves within one MTM window Given the liquidity sla params named "SLA": | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | diff --git a/core/integration/features/spot/accounts_and_fees/0029-FEES-015.feature b/core/integration/features/spot/accounts_and_fees/0029-FEES-015.feature new file mode 100644 index 0000000000..49da41a48b --- /dev/null +++ b/core/integration/features/spot/accounts_and_fees/0029-FEES-015.feature @@ -0,0 +1,173 @@ +Feature: Spot market fees distribution + + Scenario: 0029-FEES-015: Fees are collected during continuous trading and auction modes and distributed to the appropriate accounts, as described above. + + Background: + + Given the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 1s | + | market.value.windowLength | 1h | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.4 | + | validators.epoch.length | 4s | + + 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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 36000 | 0.999 | 1 | + | 38000 | 0.999 | 2 | + + 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 | + + And the following network parameters are set: + | name | value | + | limits.markets.maxPeggedOrders | 2 | + | network.markPriceUpdateMaximumFrequency | 0s | + | market.liquidity.providersFeeCalculationTimeStep | 1s | + | validators.epoch.length | 58s | + | market.liquidity.stakeToCcyVolume | 1 | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 100000 | + | party1 | BTC | 10000 | + | party2 | ETH | 100000 | + | party2 | BTC | 10000 | + | lp | ETH | 100000 | + | lp | BTC | 10000 | + And the average block duration is "1" + + # No orders have been places so we shouldn't have any holding accounts + And "party1" should have only the following accounts: + | type | asset | amount | + | ACCOUNT_TYPE_GENERAL | ETH | 100000 | + | ACCOUNT_TYPE_GENERAL | BTC | 10000 | + + And "party2" should have only the following accounts: + | type | asset | amount | + | ACCOUNT_TYPE_GENERAL | ETH | 100000 | + | ACCOUNT_TYPE_GENERAL | BTC | 10000 | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp | BTC/ETH | 500 | 0.025 | submission | + # Place some orders to create the holding accounts + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 100 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 100 | 2000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 100 | 2000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 100 | 3000 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the network moves ahead "2" blocks + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | horizon | min bound | max bound | open interest | + | 2000 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 36000 | 1749 | 2283 | 0 | + | 2000 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 38000 | 1743 | 2291 | 0 | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 100 | 2000 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | BTC/ETH | sell | 100 | 2000 | 1 | TYPE_LIMIT | TIF_GTC | | + | party1 | BTC/ETH | buy | 100 | 1800 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | BTC/ETH | sell | 100 | 2200 | 0 | TYPE_LIMIT | TIF_GTC | sell-party2 | + + Then the network moves ahead "1" blocks + #lp fee: 2000*100*0.025=50 + And the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_MAKER | BTC/ETH | 20 | ETH | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_INFRASTRUCTURE | BTC/ETH | 60 | ETH | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_LIQUIDITY | BTC/ETH | 50 | ETH | + | market | party1 | ACCOUNT_TYPE_FEES_MAKER | ACCOUNT_TYPE_GENERAL | BTC/ETH | 20 | ETH | + | market | lp | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | BTC/ETH | 50 | ETH | + + #0029-FEES-016:Fees are collected in one case of amends: you amend the price so far that it causes an immediate trade. + And the parties amend the following orders: + | party | reference | price | size delta | tif | + | party2 | sell-party2 | 1800 | 0 | TIF_GTC | + + Then the market data for the market "BTC/ETH" should be: + | mark price | last traded price | trading mode | + | 2000 | 1800 | TRADING_MODE_CONTINUOUS | + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1800 | 100 | party2 | + + Then the network moves ahead "2" blocks + And the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_MAKER | BTC/ETH | 18 | ETH | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_INFRASTRUCTURE | BTC/ETH | 54 | ETH | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_LIQUIDITY | BTC/ETH | 45 | ETH | + | market | party1 | ACCOUNT_TYPE_FEES_MAKER | ACCOUNT_TYPE_GENERAL | BTC/ETH | 18 | ETH | + | market | lp | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | BTC/ETH | 45 | ETH | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 100 | 1745 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | BTC/ETH | sell | 100 | 1745 | 0 | TYPE_LIMIT | TIF_GTC | | + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | + | 1800 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | + Then the network moves ahead "2" blocks + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | + | 1745 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | + + #The LP fees and infrastructure fees are split between the two parties for the trade during monitoring auction + #lp fee: 1745*1*0.025 = 44 + And the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | party1 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_INFRASTRUCTURE | BTC/ETH | 27 | ETH | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_INFRASTRUCTURE | BTC/ETH | 27 | ETH | + | party1 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_LIQUIDITY | BTC/ETH | 22 | ETH | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_LIQUIDITY | BTC/ETH | 22 | ETH | + | market | lp | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | BTC/ETH | 44 | ETH | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 100 | 1780 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | BTC/ETH | buy | 23 | 1780 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | BTC/ETH | sell | 123 | 1780 | 2 | TYPE_MARKET | TIF_IOC | | + + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1780 | 100 | party2 | + | party1 | 1780 | 23 | party2 | + + Then the network moves ahead "2" blocks + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | + | 1780 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | + + #0029-FEES-021: market order fee distribution in spot market + #liquidity fee: 1780*0.23*0.025=11; 1780*1*0.025=45 + And the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_MAKER | BTC/ETH | 5 | ETH | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_INFRASTRUCTURE | BTC/ETH | 13 | ETH | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_LIQUIDITY | BTC/ETH | 11 | ETH | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_LIQUIDITY | BTC/ETH | 45 | ETH | + | market | party1 | ACCOUNT_TYPE_FEES_MAKER | ACCOUNT_TYPE_GENERAL | BTC/ETH | 5 | ETH | + | market | lp | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | BTC/ETH | 56 | ETH | + + + + diff --git a/core/integration/features/spot/accounts_and_fees/0029-FEES-022.feature b/core/integration/features/spot/accounts_and_fees/0029-FEES-022.feature new file mode 100644 index 0000000000..c3fbe12d39 --- /dev/null +++ b/core/integration/features/spot/accounts_and_fees/0029-FEES-022.feature @@ -0,0 +1,106 @@ +Feature: Spot market fees distribution + + Scenario: 0029-FEES-022: Fees are collected during continuous trading and auction modes and distributed to the appropriate accounts when Position Decimal Places (PDP) is -2 + + Background: + + Given the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 1s | + | market.value.windowLength | 1h | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.4 | + | validators.epoch.length | 4s | + + 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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 36000 | 0.999 | 1 | + | 38000 | 0.999 | 2 | + + 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 | + + And the following network parameters are set: + | name | value | + | limits.markets.maxPeggedOrders | 2 | + | network.markPriceUpdateMaximumFrequency | 0s | + | market.liquidity.providersFeeCalculationTimeStep | 1s | + | validators.epoch.length | 58s | + | market.liquidity.stakeToCcyVolume | 1 | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 100000 | + | party1 | BTC | 100000 | + | party2 | ETH | 100000 | + | party2 | BTC | 100000 | + | lp | ETH | 100000 | + | lp | BTC | 100000 | + And the average block duration is "1" + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp | BTC/ETH | 500 | 0.025 | submission | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 10 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 1 | 20 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 20 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 30 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the network moves ahead "2" blocks + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | horizon | min bound | max bound | open interest | + | 20 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 36000 | 18 | 22 | 0 | + | 20 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 38000 | 18 | 22 | 0 | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 1 | 20 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | BTC/ETH | sell | 1 | 20 | 1 | TYPE_LIMIT | TIF_GTC | | + | party1 | BTC/ETH | buy | 1 | 18 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | BTC/ETH | sell | 1 | 22 | 0 | TYPE_LIMIT | TIF_GTC | sell-party2 | + + Then the network moves ahead "1" blocks + #lp fee: 2000*100*0.025=50 + And the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_MAKER | BTC/ETH | 20 | ETH | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_INFRASTRUCTURE | BTC/ETH | 60 | ETH | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_LIQUIDITY | BTC/ETH | 50 | ETH | + | market | party1 | ACCOUNT_TYPE_FEES_MAKER | ACCOUNT_TYPE_GENERAL | BTC/ETH | 20 | ETH | + | market | lp | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | BTC/ETH | 50 | ETH | + + And the parties amend the following orders: + | party | reference | price | size delta | tif | + | party2 | sell-party2 | 18 | 0 | TIF_GTC | + + Then the market data for the market "BTC/ETH" should be: + | mark price | last traded price | trading mode | + | 20 | 18 | TRADING_MODE_CONTINUOUS | + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 18 | 1 | party2 | + + Then the network moves ahead "2" blocks + And the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_MAKER | BTC/ETH | 18 | ETH | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_INFRASTRUCTURE | BTC/ETH | 54 | ETH | + | party2 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_LIQUIDITY | BTC/ETH | 45 | ETH | + | market | party1 | ACCOUNT_TYPE_FEES_MAKER | ACCOUNT_TYPE_GENERAL | BTC/ETH | 18 | ETH | + | market | lp | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | BTC/ETH | 45 | ETH | + diff --git a/core/integration/features/spot/accounts_and_fees/0070-MKTD-011.feature b/core/integration/features/spot/accounts_and_fees/0070-MKTD-011.feature new file mode 100644 index 0000000000..830be58941 --- /dev/null +++ b/core/integration/features/spot/accounts_and_fees/0070-MKTD-011.feature @@ -0,0 +1,178 @@ +Feature: Spot market SLA + + Scenario: 001 0070-MKTD-010 + Given time is updated to "2023-07-20T00:00:00Z" + + 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 | + | 3600 | 0.999 | 300 | + + And the liquidity sla params named "SLA-1": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.6 | 2 | 0.2 | + + Given the following assets are registered: + | id | decimal places | + | ETH | 2 | + | BTC | 2 | + + And the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 2s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.4 | + | validators.epoch.length | 2s | + | limits.markets.maxPeggedOrders | 10 | + + 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_D11 | BTC/ETH11 | BTC | ETH | lognormal-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | 1 | 1 | SLA-1 | + | BTC/ETH_D10 | BTC/ETH11 | BTC | ETH | lognormal-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | 1 | 0 | SLA-1 | + | BTC/ETH_D21 | BTC/ETH11 | BTC | ETH | lognormal-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | 2 | 1 | SLA-1 | + + And the following network parameters are set: + | name | value | + | market.liquidity.providersFeeCalculationTimeStep | 1s | + | market.liquidity.stakeToCcyVolume | 1 | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 300000 | + | party2 | BTC | 15000 | + | lp1 | ETH | 120000 | + | lp1 | BTC | 1800 | + | lp2 | ETH | 120000 | + | lp2 | BTC | 1800 | + + And the average block duration is "1" + + Given the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | updated-lqm-params | 0.2 | 20s | 0.8 | + + When the spot markets are updated: + | id | liquidity monitoring | linear slippage factor | quadratic slippage factor | + | BTC/ETH_D11 | updated-lqm-params | 0.5 | 0.5 | + | BTC/ETH_D10 | updated-lqm-params | 0.5 | 0.5 | + | BTC/ETH_D21 | updated-lqm-params | 0.5 | 0.5 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH_D11 | 3000 | 0.1 | submission | + | lp2 | lp2 | BTC/ETH_D11 | 3000 | 0.1 | submission | + | lp3 | lp1 | BTC/ETH_D10 | 3000 | 0.1 | submission | + | lp4 | lp2 | BTC/ETH_D10 | 3000 | 0.1 | submission | + | lp5 | lp1 | BTC/ETH_D21 | 3000 | 0.1 | submission | + | lp6 | lp2 | BTC/ETH_D21 | 3000 | 0.1 | submission | + + Then the network moves ahead "1" blocks + + Then the market data for the market "BTC/ETH_D11" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 0 | TRADING_MODE_OPENING_AUCTION | AUCTION_TRIGGER_OPENING | 4800 | 6000 | 0 | + Then the market data for the market "BTC/ETH_D10" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 0 | TRADING_MODE_OPENING_AUCTION | AUCTION_TRIGGER_OPENING | 4800 | 6000 | 0 | + Then the market data for the market "BTC/ETH_D21" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 0 | TRADING_MODE_OPENING_AUCTION | AUCTION_TRIGGER_OPENING | 4800 | 6000 | 0 | + + #0070-MKTD-010:As a user all orders placed (either directly or through LP) are shown in events with prices in market precision + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | only | + | party1 | BTC/ETH_D11 | buy | 60 | 80 | 0 | TYPE_LIMIT | TIF_GTC | party-order5 | | + | party1 | BTC/ETH_D11 | buy | 10 | 150 | 0 | TYPE_LIMIT | TIF_GTC | party-order3 | | + | party2 | BTC/ETH_D11 | sell | 10 | 150 | 0 | TYPE_LIMIT | TIF_GTC | party-order4 | | + | party2 | BTC/ETH_D11 | sell | 60 | 240 | 0 | TYPE_LIMIT | TIF_GTC | party-order6 | | + | party1 | BTC/ETH_D10 | buy | 6 | 80 | 0 | TYPE_LIMIT | TIF_GTC | party-order5 | | + | party1 | BTC/ETH_D10 | buy | 1 | 150 | 0 | TYPE_LIMIT | TIF_GTC | party-order3 | | + | party2 | BTC/ETH_D10 | sell | 1 | 150 | 0 | TYPE_LIMIT | TIF_GTC | party-order4 | | + | party2 | BTC/ETH_D10 | sell | 6 | 240 | 0 | TYPE_LIMIT | TIF_GTC | party-order6 | | + | party1 | BTC/ETH_D21 | buy | 60 | 800 | 0 | TYPE_LIMIT | TIF_GTC | party-order5 | | + | party1 | BTC/ETH_D21 | buy | 10 | 1500 | 0 | TYPE_LIMIT | TIF_GTC | party-order3 | | + | party2 | BTC/ETH_D21 | sell | 10 | 1500 | 0 | TYPE_LIMIT | TIF_GTC | party-order4 | | + | party2 | BTC/ETH_D21 | sell | 60 | 2400 | 0 | TYPE_LIMIT | TIF_GTC | party-order6 | | + + When the network moves ahead "2" blocks + #0070-MKTD-015:Trades prices, like orders, are shown in market precision. The transfers and margin requirements are in asset precision. + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 150 | 10 | party2 | + | party1 | 150 | 1 | party2 | + | party1 | 1500 | 10 | party2 | + + #0070-MKTD-014:offsets specified in pegged orders represent the smallest incremental value to tick away from the pegged price of a pegged order according to the market precision + When the parties place the following pegged orders: + | party | market id | side | volume | pegged reference | offset | reference | error | + | party1 | BTC/ETH_D11 | buy | 1 | BID | 1 | peggedbuy1 | | + | party2 | BTC/ETH_D11 | sell | 1 | ASK | 1 | peggedsell1 | | + | party1 | BTC/ETH_D10 | buy | 1 | BID | 1 | peggedbuy2 | | + | party2 | BTC/ETH_D10 | sell | 1 | ASK | 1 | peggedsell2 | | + | party1 | BTC/ETH_D21 | buy | 1 | BID | 1 | peggedbuy3 | | + | party2 | BTC/ETH_D21 | sell | 1 | ASK | 1 | peggedsell3 | | + + And the order book should have the following volumes for market "BTC/ETH_D11": + | side | price | volume | + | buy | 79 | 1 | + | sell | 241 | 1 | + And the order book should have the following volumes for market "BTC/ETH_D10": + | side | price | volume | + | buy | 79 | 1 | + | sell | 241 | 1 | + And the order book should have the following volumes for market "BTC/ETH_D21": + | side | price | volume | + | buy | 799 | 1 | + | sell | 2401 | 1 | + + Then the market data for the market "BTC/ETH_D11" should be: + | mark price | trading mode | auction trigger | horizon | min bound | max bound | target stake | supplied stake | open interest | + | 150 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 3600 | 144 | 156 | 4800 | 6000 | 0 | + Then the market data for the market "BTC/ETH_D10" should be: + | mark price | trading mode | auction trigger | horizon | min bound | max bound | target stake | supplied stake | open interest | + | 150 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 3600 | 144 | 156 | 4800 | 6000 | 0 | + #0070-MKTD-012: As a user I should see the market data prices using market precision. + #0070-MKTD-013: Price bounds are calculated in asset precision, but enforced rounded to the closest value in market precision in range + Then the market data for the market "BTC/ETH_D21" should be: + | mark price | trading mode | auction trigger | horizon | min bound | max bound | target stake | supplied stake | open interest | + | 1500 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 3600 | 1438 | 1564 | 4800 | 6000 | 0 | + Then "lp1" should have general account balance of "111000" for asset "ETH" + Then "lp2" should have general account balance of "111000" for asset "ETH" + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH_D11 | 2000 | 0.1 | amendment | + | lp4 | lp1 | BTC/ETH_D10 | 2000 | 0.1 | amendment | + | lp5 | lp1 | BTC/ETH_D21 | 2000 | 0.1 | amendment | + + Then the network moves ahead "4" blocks + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | lp2 | BTC/ETH_D11 | 2000 | 0.1 | amendment | + + Then the network moves ahead "4" blocks + + #bond penalty for lp2 = 800*0.25 =200 + #0070-MKTD-011:As a user all transfers (margin top-up, release, MTM settlement) are calculated and communicated (via events) in asset precision + And the network treasury balance should be "200" for the asset "ETH" + Then the party "lp1" lp liquidity bond account balance should be "2000" for the market "BTC/ETH_D11" + Then the party "lp1" lp liquidity bond account balance should be "2000" for the market "BTC/ETH_D10" + Then the party "lp1" lp liquidity bond account balance should be "2000" for the market "BTC/ETH_D21" + Then the party "lp2" lp liquidity bond account balance should be "2000" for the market "BTC/ETH_D11" + Then the party "lp2" lp liquidity bond account balance should be "3000" for the market "BTC/ETH_D10" + Then the party "lp2" lp liquidity bond account balance should be "3000" for the market "BTC/ETH_D21" + + Then "lp1" should have general account balance of "114000" for asset "ETH" + Then "lp2" should have general account balance of "111800" for asset "ETH" + + + diff --git a/core/integration/features/spot/accounts_and_fees/fund-release-bug.feature b/core/integration/features/spot/accounts_and_fees/fund-release-bug.feature new file mode 100644 index 0000000000..85c83ef314 --- /dev/null +++ b/core/integration/features/spot/accounts_and_fees/fund-release-bug.feature @@ -0,0 +1,155 @@ +Feature: replicate the fund releasing bug when market is terminated + + Scenario: 001 terminate market with Oracle + Given time is updated to "2023-07-20T00:00:00Z" + + 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 | + | 36000 | 0.999 | 23 | + + And the liquidity sla params named "SLA-1": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.1 | 2 | 0.2 | + + Given the following assets are registered: + | id | decimal places | + | ETH | 1 | + | BTC | 1 | + + And the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 2s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.bondPenaltyParameter | 0 | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.5 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.2 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.4 | + | validators.epoch.length | 2s | + | limits.markets.maxPeggedOrders | 10 | + | market.liquidity.probabilityOfTrading.tau.scaling | 0.1 | + + And the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lognormal-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | SLA-1 | + And the following network parameters are set: + | name | value | + | market.liquidity.providersFeeCalculationTimeStep | 2s | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 100000 | + | party2 | BTC | 5000 | + | lp1 | ETH | 4000 | + | lp1 | BTC | 600 | + | lp2 | ETH | 4000 | + | lp2 | BTC | 600 | + | lp3 | ETH | 4000 | + | lp3 | BTC | 600 | + + And the average block duration is "1" + + Given the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | updated-lqm-params | 0.2 | 20s | 0.8 | + + When the spot markets are updated: + | id | liquidity monitoring | linear slippage factor | quadratic slippage factor | + | BTC/ETH | updated-lqm-params | 0.5 | 0.5 | + + Then the network moves ahead "1" blocks + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 0 | TRADING_MODE_OPENING_AUCTION | AUCTION_TRIGGER_OPENING | 0 | 0 | 0 | + + # place orders and generate trades + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | only | + | party1 | BTC/ETH | buy | 1 | 10 | 0 | TYPE_LIMIT | TIF_GTC | buy-party-order1 | | + | party1 | BTC/ETH | buy | 1 | 13 | 0 | TYPE_LIMIT | TIF_GTC | buy-party-order2 | | + | party1 | BTC/ETH | buy | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | buy-party-order3 | | + | party2 | BTC/ETH | sell | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | sell-party-order1 | | + # | party2 | BTC/ETH | sell | 1 | 18 | 0 | TYPE_LIMIT | TIF_GTC | sell-party-order2 | | + + When the network moves ahead "4" blocks + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | horizon | min bound | max bound | target stake | supplied stake | + | 15 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 36000 | 14 | 17 | 0 | 0 | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | only | + | party2 | BTC/ETH | sell | 1 | 13 | 0 | TYPE_LIMIT | TIF_GTC | sell-party-order3 | | + + When the network moves ahead "4" blocks + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | + | 15 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | + + #cancel the orders that triggered price mon auction + Then the parties cancel all their orders for the markets: + | party | market id | + | party1 | BTC/ETH | + | party2 | BTC/ETH | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 2000 | 0.4 | submission | + + #lp commits provisions and submits orders + #other parties enter orders that will cross + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | BTC/ETH | buy | 1 | 13 | 0 | TYPE_LIMIT | TIF_GTC | lp-order1 | + | party1 | BTC/ETH | buy | 1 | 14 | 0 | TYPE_LIMIT | TIF_GTC | buy-party-order4 | + | party2 | BTC/ETH | sell | 1 | 14 | 0 | TYPE_LIMIT | TIF_GTC | sell-party-order4 | + | lp1 | BTC/ETH | sell | 1 | 13 | 0 | TYPE_LIMIT | TIF_GTC | lp-order2 | + + When the network moves ahead "1" blocks + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | + | 15 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | + + When the market states are updated through governance: + | market id | state | + | BTC/ETH | MARKET_STATE_UPDATE_TYPE_TERMINATE | + + +# When the network moves ahead "4" blocks + +# Then the market data for the market "BTC/ETH" should be: +# | mark price | trading mode | auction trigger | +# | 13 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | + +# When the network moves ahead "1" blocks + +# And the party "lp1" lp liquidity fee account balance should be "0" for the market "BTC/ETH" +# Then the party "lp1" lp liquidity bond account balance should be "2000" for the market "BTC/ETH" +# And the parties should have the following account balances: +# | party | asset | market id | general | +# | lp1 | BTC | BTC/ETH | 610 | +# | lp1 | ETH | BTC/ETH | 1865 | + +# When the market states are updated through governance: +# | market id | state | +# | BTC/ETH | MARKET_STATE_UPDATE_TYPE_TERMINATE | + +# And the parties should have the following account balances: +# | party | asset | market id | general | +# | lp1 | BTC | BTC/ETH | 610 | +# | lp1 | ETH | BTC/ETH | 3865 | + +# Then "lp1" should have holding account balance of "0" for asset "ETH" +# And the party "lp1" lp liquidity fee account balance should be "0" for the market "BTC/ETH" +# Then the party "lp1" lp liquidity bond account balance should be "0" for the market "BTC/ETH" + +# And the network treasury balance should be "0" for the asset "ETH" +# And the global insurance pool balance should be "0" for the asset "ETH" +# And the global insurance pool balance should be "0" for the asset "BTC" \ No newline at end of file diff --git a/core/integration/features/spot/liquidity_provision/0041-TSTK.feature b/core/integration/features/spot/liquidity_provision/0041-TSTK.feature new file mode 100644 index 0000000000..4f9e7a22b6 --- /dev/null +++ b/core/integration/features/spot/liquidity_provision/0041-TSTK.feature @@ -0,0 +1,282 @@ +Feature: Target stake calculation in spot markets + + Tests check the target stake of spot markets, which is calculated as a + multiple of the maximum supplied stake over a given time window, is + calculated correctly. + + Tests check both markets using zero decimal places, and markets using + non-zero decimal places. + + Background: + + # Initialise the network and register assets + Given time is updated to "2024-01-01T00:00:00Z" + And the following network parameters are set: + | name | value | + | market.liquidity.earlyExitPenalty | 0 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0 | + And the following assets are registered: + | id | decimal places | quantum | + | USDT.0.1 | 0 | 1 | + | BTC.0.1 | 0 | 1 | + | USDC.2.100 | 2 | 100 | + | ETH.2.100 | 2 | 100 | + And the average block duration is "1" + + # Initialise the zero and non-zero decimal places spot markets + 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/USDT | BTC/USDT | BTC.0.1 | USDT.0.1 | default-log-normal-risk-model | 1 | default-none | default-none | 0 | 0 | default-basic | + | ETH/USDC | BTC/USDT | ETH.2.100 | USDC.2.100 | default-log-normal-risk-model | 1 | default-none | default-none | 1 | 1 | default-basic | + + # Deposits for assets with zero decimal places + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USDT.0.1 | 10000000 | + | lp2 | USDT.0.1 | 10000000 | + | aux1 | USDT.0.1 | 10000000 | + | aux2 | USDT.0.1 | 10000000 | + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | BTC.0.1 | 10000 | + | lp2 | BTC.0.1 | 10000 | + | aux1 | BTC.0.1 | 10000 | + | aux2 | BTC.0.1 | 10000 | + + # Deposits for assets with non-zero decimal places + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USDC.2.100 | 1000000000 | + | lp2 | USDC.2.100 | 1000000000 | + | aux1 | USDC.2.100 | 1000000000 | + | aux2 | USDC.2.100 | 1000000000 | + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | ETH.2.100 | 1000000 | + | lp2 | ETH.2.100 | 1000000 | + | aux1 | ETH.2.100 | 1000000 | + | aux2 | ETH.2.100 | 1000000 | + + + Scenario Outline: Given a spot market using zero decimals, the target stake should be correctly set to the product of the scaling factor and maximum supplied stake over the window. (0041-TSTK-106)(0041-TSTK-108) + + # Set the target stake time window to two epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | | 20s | + And the spot markets are updated: + | id | liquidity monitoring | + | ETH/USDC | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | ETH/USDC | 10000 | 0.02 | submission | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USDC | buy | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/USDC | sell | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "ETH/USDC" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | | 10000 | + + Examples: + | scaling factor | target stake | + | 0 | 0 | + | 0.5 | 5000 | + | 1 | 10000 | + + + Scenario Outline: Given a spot market using non-zero decimals, the target stake should be correctly set to the product of the scaling factor and maximum supplied stake over the window. (0041-TSTK-107)(0041-TSTK-108) + + # Set the target stake time window to two epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | | 20s | + And the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 10000 | 0.02 | submission | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | | 10000 | + + Examples: + | scaling factor | target stake | + | 0 | 0 | + | 0.5 | 5000 | + | 1 | 10000 | + + + Scenario: Given a spot market, if an LP increases or decreases their commitment the target stake should be updated correctly. (0041-TSTK-109)(0041-TSTK-110)(0041-TSTK-112) + + # Set the target stake time window to two epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | 1 | 20s | + And the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 10000 | 0.02 | submission | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 10000 | 10000 | + + # LP reduces commitment, supplied and target stake increased immediately (0041-TSTK-109) + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 20000 | 0.02 | amendment | + When the network moves ahead "1" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 20000 | 20000 | + + # LP reduces commitment, supplied and target stake not decreased immediately (0041-TSTK-110) + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 10000 | 0.02 | amendment | + When the network moves ahead "1" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 20000 | 20000 | + + # LP commitment reduction processed, supplied stake decreases + Given the network moves ahead "1" epochs + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 20000 | 10000 | + + # Previous supplied stake value dropped, target stake decreases + Given the network moves ahead "19" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 20000 | 10000 | + Given the network moves ahead "1" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 10000 | 10000 | + + # Increase time window, previous supplied stake NOT included despite being within time window, target stake does not change (0041-TSTK-112) + Given the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | updated-lqm-params | 1.0 | 1.0 | 30s | + When the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | updated-lqm-params | + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 10000 | 10000 | + + + + Scenario Outline: Given a spot market, change of market.stake.target.scalingFactor will immediately change the target stake. (0041-TSTK-111) + + # Set the target stake time window to two epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | 1 | 20s | + And the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 10000 | 0.02 | submission | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 10000 | 10000 | + + Given the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | updated-lqm-params | 1.0 | | 20s | + When the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | updated-lqm-params | + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | | 10000 | + + Examples: + | scaling factor | target stake | + | 0 | 0 | + | 0.5 | 5000 | + | 1 | 10000 | + + + Scenario: Given a spot market, a decrease of time_window will immediately change the length of time window over which the total stake is measured and old records will be dropped hence the target stake will immediately change. (0041-TSTK-113) + + # Set the target stake time window to two epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | 1 | 20s | + And the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 10000 | 0.02 | submission | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 10000 | 10000 | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 5000 | 0.02 | amendment | + When the network moves ahead "1" epochs + And the network moves ahead "1" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 10000 | 5000 | + + # Decrease time window, previous supplied stake dropped, target stake decreeases (0041-TSTK-112) + Given the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | updated-lqm-params | 1.0 | 1.0 | 0s | + When the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | updated-lqm-params | + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 5000 | 5000 | diff --git a/core/integration/features/spot/liquidity_provision/0042-LIQF-084.feature b/core/integration/features/spot/liquidity_provision/0042-LIQF-084.feature new file mode 100644 index 0000000000..05e2a3ee04 --- /dev/null +++ b/core/integration/features/spot/liquidity_provision/0042-LIQF-084.feature @@ -0,0 +1,245 @@ +Feature: Calculating SLA Performance + + Background: + Given the simple risk model named "simple-risk-model-1": + | long | short | max move up | min move down | probability of trading | + | 0.1 | 0.1 | 500 | 500 | 0.1 | + 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 | + | 1 | 0.99 | 3 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 0.0 | 10s | 0.75 | + And the liquidity sla params named "SLA": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1.0 | 0.5 | 0 | 0 | + + And the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | liquidity monitoring | + | BTC/ETH | BTC/ETH | BTC | ETH | simple-risk-model-1 | 2 | fees-config-1 | price-monitoring | SLA | lqm-params | + + And the following network parameters are set: + | name | value | + | limits.markets.maxPeggedOrders | 2 | + | network.markPriceUpdateMaximumFrequency | 0s | + | market.liquidity.providersFeeCalculationTimeStep | 1s | + | validators.epoch.length | 58s | + | market.liquidity.stakeToCcyVolume | 1 | + + And the average block duration is "1" + + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | ETH | 1000000000000000000 | + | lp1 | BTC | 1000000000000000000 | + | aux1 | ETH | 1000000000000000000 | + | aux1 | BTC | 1000000000000000000 | + | aux2 | ETH | 1000000000000000000 | + | aux2 | BTC | 1000000000000000000 | + | party1 | ETH | 1000000000000000000 | + | party1 | BTC | 1000000000000000000 | + | party2 | BTC | 1000000000000000000 | + + @SPOTSLA + Scenario: LP fulfills the mininum time fraction but is not always on the book when the sla competition factor is zero. (0042-LIQF-084) + + # Setup the market with 1 LP who is initially meeting their commitment + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 500 | 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 | reference | + | lp1 | BTC/ETH | 4 | 1 | buy | MID | 4 | 1 | lp1-ice-buy-1 | + | lp1 | BTC/ETH | 4 | 1 | sell | MID | 4 | 1 | lp1-ice-sell-1 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + # Leave opening auction, then nothing happens for 31 blocks (getting us past 50% of the time fraction) + And the network moves ahead "45" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # Generate liquidity fees to be allocated to the LP + When 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_GTC | + | party2 | BTC/ETH | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "101" for the market "BTC/ETH" + + # Ensure LPs timeBookFraction ~=0.75, then check ~0.0 fees are penalised + # 50 blocks in to the 58s (or 58 block) long epoch. + When the network moves ahead "5" blocks + Then the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-1 | + | lp1 | lp1-ice-sell-1 | + + When the network moves ahead "1" epochs + # We should see these transfers + 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 | BTC/ETH | 101 | ETH | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 101 | ETH | + + @SPOTSLA + Scenario: LP fulfills the mininum time fraction but is not always on the book when the sla competition factor is zero. Same as previous scenario, different timings. (0042-LIQF-084) + + # Setup the market with 1 LP who is initially meeting their commitment + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 500 | 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 | reference | + | lp1 | BTC/ETH | 4 | 1 | buy | MID | 4 | 1 | lp1-ice-buy-1 | + | lp1 | BTC/ETH | 4 | 1 | sell | MID | 4 | 1 | lp1-ice-sell-1 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + # Leave opening auction, then nothing happens for 31 blocks (getting us past 50% of the time fraction) + And the network moves ahead "3" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # Generate liquidity fees to be allocated to the LP + When 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_GTC | + | party2 | BTC/ETH | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "101" for the market "BTC/ETH" + + # Ensure LPs timeBookFraction ~=0.75, then check ~0.0 fees are penalised + When the network moves ahead "45" blocks + Then the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-1 | + | lp1 | lp1-ice-sell-1 | + + When the network moves ahead "1" epochs + # We should see these transfers + 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 | BTC/ETH | 101 | ETH | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 101 | ETH | + + @SPOTSLA + Scenario: LP fulfills the mininum time fraction but is not always on the book when the sla competition factor is zero. (0042-LIQF-085) + + # Setup the market with 1 LP who is initially meeting their commitment + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 500 | 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 | reference | + | lp1 | BTC/ETH | 4 | 1 | buy | MID | 4 | 1 | lp1-ice-buy-1 | + | lp1 | BTC/ETH | 4 | 1 | sell | MID | 4 | 1 | lp1-ice-sell-1 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + # Leave opening auction, then nothing happens for 31 blocks (getting us past 50% of the time fraction) + And the network moves ahead "45" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # Generate liquidity fees to be allocated to the LP + When 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_GTC | + | party2 | BTC/ETH | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "101" for the market "BTC/ETH" + + # Ensure LPs timeBookFraction ~=0.75, then check ~0.0 fees are penalised + # 50 blocks in to the 58s (or 58 block) long epoch. + When the network moves ahead "5" blocks + Then the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-1 | + | lp1 | lp1-ice-sell-1 | + + When the network moves ahead "1" epochs + # We should see these transfers + 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 | BTC/ETH | 101 | ETH | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 101 | ETH | + + @SPOTSLA + Scenario: LP fulfills the mininum time fraction but is not always on the book when the sla competition factor is zero. Same as previous scenario, different timings. The next epoch they meet their commitment such that time on book is 0.75, penalty should be 0.25. (0042-LIQF-085) + + # Setup the market with 1 LP who is initially meeting their commitment + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 500 | 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 | reference | + | lp1 | BTC/ETH | 4 | 1 | buy | MID | 4 | 1 | lp1-ice-buy-1 | + | lp1 | BTC/ETH | 4 | 1 | sell | MID | 4 | 1 | lp1-ice-sell-1 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + # Leave opening auction, then nothing happens for 31 blocks (getting us past 50% of the time fraction) + And the network moves ahead "3" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # Generate liquidity fees to be allocated to the LP + When 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_GTC | + | party2 | BTC/ETH | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "101" for the market "BTC/ETH" + + # Ensure LPs timeBookFraction ~=0.75, then check ~0.0 fees are penalised + When the network moves ahead "44" blocks + Then the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-1 | + | lp1 | lp1-ice-sell-1 | + # re-submit the orders to meet commitment amount + When the network moves ahead "1" 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 | BTC/ETH | 4 | 1 | buy | MID | 4 | 1 | lp1-ice-buy-2 | + | lp1 | BTC/ETH | 4 | 1 | sell | MID | 4 | 1 | lp1-ice-sell-2 | + + When the network moves ahead "1" epochs + # We should see these transfers + 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 | BTC/ETH | 101 | ETH | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 101 | ETH | + + # Now perform some trade so that there are fees to go around once again + When the network moves ahead "40" blocks + 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_GTC | + | party2 | BTC/ETH | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "101" for the market "BTC/ETH" + # Move forwards another 4 blocks to get to 75% of time on book (58 block epochs, 75% == 43.5 blocks) + When the network moves ahead "4" blocks + Then the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-2 | + | lp1 | lp1-ice-sell-2 | + When the network moves ahead "1" epochs + # We should see these transfers + Then debug transfers + 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 | BTC/ETH | 101 | ETH | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 101 | ETH | diff --git a/core/integration/features/spot/liquidity_provision/0042-LIQF-marginal_cost.feature b/core/integration/features/spot/liquidity_provision/0042-LIQF-marginal_cost.feature new file mode 100644 index 0000000000..e6c39fcac9 --- /dev/null +++ b/core/integration/features/spot/liquidity_provision/0042-LIQF-marginal_cost.feature @@ -0,0 +1,428 @@ +Feature: Marginal cost liquidity fee selection for spot markets + + Background: + + # Initialise the network and register assets + Given time is updated to "2024-01-01T00:00:00Z" + And the following network parameters are set: + | name | value | + | market.liquidity.earlyExitPenalty | 0 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0 | + And the following assets are registered: + | id | decimal places | quantum | + | USDT.0.1 | 0 | 1 | + | BTC.0.1 | 0 | 1 | + And the average block duration is "1" + + # Initialise the zero and non-zero decimal places spot markets + 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/USDT | BTC/USDT | BTC.0.1 | USDT.0.1 | default-log-normal-risk-model | 1 | default-none | default-none | 0 | 0 | default-basic | + + # Deposits for assets with zero decimal places + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USDT.0.1 | 10000000 | + | lp2 | USDT.0.1 | 10000000 | + | lp3 | USDT.0.1 | 10000000 | + | aux1 | USDT.0.1 | 10000000 | + | aux2 | USDT.0.1 | 10000000 | + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | aux1 | BTC.0.1 | 10000 | + | aux2 | BTC.0.1 | 10000 | + + + Scenario: An LP joining a market that is below the target stake with a higher fee bid than the current fee: their fee is used (0042-LIQF-073) + + # Set the target stake time window to five epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | 1 | 50s | + And the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 10000 | 0.01 | submission | + | lp2 | lp2 | BTC/USDT | 10000 | 0.02 | submission | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 20000 | 20000 | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 1000 | 0.01 | amendment | + | lp2 | lp2 | BTC/USDT | 1000 | 0.02 | amendment | + When the network moves ahead "1" epochs + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 20000 | 2000 | + And the liquidity fee factor should be "0.02" for the market "BTC/USDT" + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp3 | lp3 | BTC/USDT | 1000 | 0.03 | submission | + When the network moves ahead "1" epochs + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 20000 | 3000 | + And the liquidity fee factor should be "0.03" for the market "BTC/USDT" + + + Scenario: An LP joining a market that is below the target stake with a lower fee bid than the current fee: fee doesn't change (0042-LIQF-074) + + # Set the target stake time window to five epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | 1 | 50s | + And the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 10000 | 0.01 | submission | + | lp2 | lp2 | BTC/USDT | 10000 | 0.02 | submission | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 20000 | 20000 | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 1000 | 0.01 | amendment | + | lp2 | lp2 | BTC/USDT | 1000 | 0.02 | amendment | + When the network moves ahead "1" epochs + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 20000 | 2000 | + And the liquidity fee factor should be "0.02" for the market "BTC/USDT" + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp3 | lp3 | BTC/USDT | 1000 | 0 | submission | + When the network moves ahead "1" epochs + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 20000 | 3000 | + And the liquidity fee factor should be "0.02" for the market "BTC/USDT" + + + Scenario: An LP 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 (0042-LIQF-075) + + # Set the target stake time window to five epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | 0.5 | 50s | + And the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 10000 | 0.01 | submission | + | lp2 | lp2 | BTC/USDT | 10000 | 0.02 | submission | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 10000 | 20000 | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp3 | lp3 | BTC/USDT | 30000 | 0 | submission | + When the network moves ahead "1" epochs + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 25000 | 50000 | + And the liquidity fee factor should be "0" for the market "BTC/USDT" + + + Scenario: An LP 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 (0042-LIQF-076) + + # Set the target stake time window to five epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | 0.8 | 50s | + And the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 10000 | 0.01 | submission | + | lp2 | lp2 | BTC/USDT | 10000 | 0.02 | submission | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 16000 | 20000 | + And the liquidity fee factor should be "0.02" for the market "BTC/USDT" + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp3 | lp3 | BTC/USDT | 10000 | 0 | submission | + When the network moves ahead "1" epochs + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 24000 | 30000 | + And the liquidity fee factor should be "0.02" for the market "BTC/USDT" + + + Scenario: An LP 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 lower fee bid than the current fee: the fee changes to the other lower bid (0042-LIQF-077) + + # Set the target stake time window to five epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | 0.6 | 50s | + And the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 10000 | 0.01 | submission | + | lp2 | lp2 | BTC/USDT | 10000 | 0.02 | submission | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 12000 | 20000 | + And the liquidity fee factor should be "0.02" for the market "BTC/USDT" + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp3 | lp3 | BTC/USDT | 10000 | 0 | submission | + When the network moves ahead "1" epochs + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 18000 | 30000 | + And the liquidity fee factor should be "0.01" for the market "BTC/USDT" + + + Scenario: An LP 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 (0042-LIQF-078) + + # Set the target stake time window to five epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | 0.6 | 50s | + And the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 10000 | 0.01 | submission | + | lp2 | lp2 | BTC/USDT | 10000 | 0.02 | submission | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 12000 | 20000 | + And the liquidity fee factor should be "0.02" for the market "BTC/USDT" + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp3 | lp3 | BTC/USDT | 10000 | 0.03 | submission | + When the network moves ahead "1" epochs + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 18000 | 30000 | + And the liquidity fee factor should be "0.02" for the market "BTC/USDT" + + + Scenario: An LP leaves a market that is above target stake when their fee bid is currently being used: fee changes to fee bid by the LP who takes their place in the bidding order (0042-LIQF-079) + + # Set the target stake time window to five epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | 1 | 50s | + And the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 10000 | 0.01 | submission | + | lp2 | lp2 | BTC/USDT | 10000 | 0.02 | submission | + | lp3 | lp3 | BTC/USDT | 10000 | 0.03 | submission | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 30000 | 30000 | + And the liquidity fee factor should be "0.03" for the market "BTC/USDT" + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp3 | lp3 | BTC/USDT | 10000 | 0.03 | cancellation | + When the network moves ahead "1" epochs + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 30000 | 20000 | + And the liquidity fee factor should be "0.02" for the market "BTC/USDT" + + + Scenario: An LP leaves a market that is above target stake when their fee bid is lower than the one currently being used and their commitment size changes the LP that meets the target stake: fee changes to fee bid by the LP that is now at the place in the bid order to provide the target stake (0042-LIQF-080) + + # Set the target stake time window to five epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | 0.5 | 50s | + And the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 10000 | 0.01 | submission | + | lp2 | lp2 | BTC/USDT | 10000 | 0.02 | submission | + | lp3 | lp3 | BTC/USDT | 10000 | 0.03 | submission | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 15000 | 30000 | + And the liquidity fee factor should be "0.02" for the market "BTC/USDT" + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 10000 | 0.01 | cancellation | + When the network moves ahead "1" epochs + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 15000 | 20000 | + And the liquidity fee factor should be "0.03" for the market "BTC/USDT" + + + Scenario: An LP leaves a market that is above target stake when their fee bid is lower than the one currently being used. The loss of their commitment doesn't change which LP meets the target stake: fee doesn't change (0042-LIQF-081) + + # Set the target stake time window to five epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | 0.4 | 50s | + And the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 2000 | 0.01 | submission | + | lp2 | lp2 | BTC/USDT | 14000 | 0.02 | submission | + | lp3 | lp3 | BTC/USDT | 14000 | 0.03 | submission | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 12000 | 30000 | + And the liquidity fee factor should be "0.02" for the market "BTC/USDT" + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 2000 | 0.01 | cancellation | + When the network moves ahead "1" epochs + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 12000 | 28000 | + And the liquidity fee factor should be "0.02" for the market "BTC/USDT" + + + Scenario: Given the fee setting method is marginal cost. An LP leaves a spot market that is above target stake when their fee bid is higher than the one currently being used: fee doesn't change (0042-LIQF-106) + + # Set the target stake time window to five epochs + Given the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + And the liquidity monitoring parameters: + | name | triggering ratio | scaling factor | time window | + | lqm-params | 1.0 | 0.4 | 50s | + And the spot markets are updated: + | id | liquidity monitoring | + | BTC/USDT | lqm-params | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 2000 | 0.01 | submission | + | lp2 | lp2 | BTC/USDT | 14000 | 0.02 | submission | + | lp3 | lp3 | BTC/USDT | 14000 | 0.03 | submission | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 10 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "2" blocks + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 12000 | 30000 | + And the liquidity fee factor should be "0.02" for the market "BTC/USDT" + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp3 | lp3 | BTC/USDT | 14000 | 0.01 | cancellation | + When the network moves ahead "1" epochs + Then the market data for the market "BTC/USDT" should be: + | trading mode | target stake | supplied stake | + | TRADING_MODE_CONTINUOUS | 12000 | 16000 | + And the liquidity fee factor should be "0.02" for the market "BTC/USDT" \ No newline at end of file diff --git a/core/integration/features/spot/liquidity_provision/0042-LIQF-spots.feature b/core/integration/features/spot/liquidity_provision/0042-LIQF-spots.feature new file mode 100644 index 0000000000..c5e805f02d --- /dev/null +++ b/core/integration/features/spot/liquidity_provision/0042-LIQF-spots.feature @@ -0,0 +1,346 @@ +Feature: Test liquidity provider reward distribution; Should also cover liquidity-fee-setting and equity-like-share calc and total stake. + # to look into and test: If an equity-like share is small and LP rewards are distributed immediately, then how do we round? (does a small share get rounded up or down, do they all add up?) + #Check what happens with time and distribution period (both in genesis and mid-market) + + Background: + + Given the simple risk model named "simple-risk-model-1": + | long | short | max move up | min move down | probability of trading | + | 0.1 | 0.1 | 500 | 500 | 0.1 | + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 1 | 0.99 | 3 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | liquidity fee method | liquidity fee constant | + | 0.0004 | 0.001 | METHOD_CONSTANT | 0.08 | + And the fees configuration named "fees-config-2": + | maker fee | infrastructure fee | liquidity fee method | liquidity fee constant | + | 0.0004 | 0.001 | METHOD_CONSTANT | 0.01 | + And the fees configuration named "fees-config-3": + | maker fee | infrastructure fee | liquidity fee method | liquidity fee constant | + | 0.0004 | 0.001 | METHOD_WEIGHTED_AVERAGE | 0.01 | + And the fees configuration named "fees-config-4": + | maker fee | infrastructure fee | liquidity fee method | liquidity fee constant | + | 0.0004 | 0.001 | METHOD_MARGINAL_COST | 0.01 | + + + Given the following assets are registered: + | id | decimal places | + | ETH | 1 | + | BTC | 1 | + And the following network parameters are set: + | name | value | + | market.value.windowLength | 1h | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 8 | + | validators.epoch.length | 5s | + | market.liquidity.providersFeeCalculationTimeStep | 5s | + + Given the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 0.0 | 10s | 0.75 | + + 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 spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | liquidity monitoring | + | BTC/ETH | BTC/ETH | BTC | ETH | simple-risk-model-1 | 2 | fees-config-4 | price-monitoring | SLA | lqm-params | + + Given the average block duration is "1" + + Scenario: 001: The resulting liquidity-fee-factor is always equal to one of the liquidity provider's individually nominated fee factors (0042-LIQF-063) + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | BTC | 1000000000 | + | lp2 | BTC | 1000000000 | + | party1 | BTC | 100000000 | + | party2 | BTC | 100000000 | + | lp1 | ETH | 1000000000 | + | lp2 | ETH | 1000000000 | + | party1 | ETH | 100000000 | + | party2 | BTC | 100000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 5000 | 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 | BTC/ETH | 4 | 1 | buy | MID | 4 | 1 | + | lp1 | BTC/ETH | 4 | 1 | sell | MID | 4 | 1 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | lp2 | BTC/ETH | 5000 | 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 | BTC/ETH | 4 | 1 | buy | MID | 4 | 1 | + | lp2 | BTC/ETH | 4 | 1 | sell | MID | 4 | 1 | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 90 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 90 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + + When the network moves ahead "1" blocks + + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 90 | party2 | + + And 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" + And the supplied stake should be "10000" for the market "BTC/ETH" + + # 10,000 staked and scaling factor is 10 + And the target stake should be "7500" for the market "BTC/ETH" + + And the liquidity provider fee shares for the market "BTC/ETH" should be: + | party | equity like share | average entry valuation | + | lp1 | 0.5 | 5000 | + | lp2 | 0.5 | 10000 | + + + And the liquidity fee factor should be "0.002" for the market "BTC/ETH" + + # no fees in auction + And the accumulated liquidity fees should be "0" for the market "BTC/ETH" + + Then the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | sell | 20 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | party1-sell | + | party2 | BTC/ETH | buy | 20 | 1000 | 3 | TYPE_LIMIT | TIF_GTC | party2-buy | + + And the following trades should be executed: + | buyer | price | size | seller | + | party2 | 951 | 4 | lp1 | + | party2 | 951 | 4 | lp2 | + | party2 | 1000 | 12 | party1 | + + And the accumulated liquidity fees should be "394" for the market "BTC/ETH" + + # opening auction + time window + 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 | BTC/ETH | 197 | ETH | + | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | BTC/ETH | 197 | ETH | + + Scenario: 002: Liquidity fee factors are recalculated every time the liquidity demand estimate changes. (0042-LIQF-064) + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | BTC | 1000000000 | + | lp2 | BTC | 1000000000 | + | party1 | BTC | 100000000 | + | party2 | BTC | 100000000 | + | lp1 | ETH | 1000000000 | + | lp2 | ETH | 1000000000 | + | party1 | ETH | 100000000 | + | party2 | BTC | 100000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 5000 | 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 | BTC/ETH | 4 | 1 | buy | MID | 4 | 1 | + | lp1 | BTC/ETH | 4 | 1 | sell | MID | 4 | 1 | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 90 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 90 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + + When the network moves ahead "1" blocks + + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 90 | party2 | + + And the liquidity fee factor should be "0.001" for the market "BTC/ETH" + + + # now another LP enters with a different fee + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | lp2 | BTC/ETH | 5000 | 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 | BTC/ETH | 4 | 1 | buy | MID | 4 | 1 | + | lp2 | BTC/ETH | 4 | 1 | sell | MID | 4 | 1 | + + # no liqudiity fee change + When the network moves ahead "1" blocks + And the liquidity fee factor should be "0.001" for the market "BTC/ETH" + + # until we eneter a new epoch and the LP provisions become active + When the network moves ahead "1" epochs + And the liquidity fee factor should be "0.002" for the market "BTC/ETH" + + + Scenario: 003: If passage of time causes the liquidity demand estimate to change, the fee factor is correctly recalculated. (0042-LIQF-065) + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | BTC | 1000000000 | + | lp2 | BTC | 1000000000 | + | lp3 | BTC | 1000000000 | + | party1 | BTC | 100000000 | + | party2 | BTC | 100000000 | + | lp1 | ETH | 1000000000 | + | lp2 | ETH | 1000000000 | + | lp3 | ETH | 1000000000 | + | party1 | ETH | 100000000 | + | party2 | BTC | 100000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 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 | + | lp1 | BTC/ETH | 4 | 1 | buy | MID | 4 | 1 | + | lp1 | BTC/ETH | 4 | 1 | sell | MID | 4 | 1 | + + # now another LP enters with a different fee but small commitment + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | lp2 | BTC/ETH | 1000 | 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 | BTC/ETH | 4 | 1 | buy | MID | 4 | 1 | + | lp2 | BTC/ETH | 4 | 1 | sell | MID | 4 | 1 | + + # now another LP enters with a big fee + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp3 | lp3 | BTC/ETH | 3000 | 0.003 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lp3 | BTC/ETH | 4 | 1 | buy | MID | 4 | 1 | + | lp3 | BTC/ETH | 4 | 1 | sell | MID | 4 | 1 | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 90 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 90 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + + When the network moves ahead "1" blocks + + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 90 | party2 | + + Then the liquidity fee factor should be "0.002" for the market "BTC/ETH" + + # LP3 now cancels + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp3 | lp3 | BTC/ETH | 3000 | 0.003 | cancellation | + + When the network moves ahead "1" epochs + Then the liquidity fee factor should be "0.002" for the market "BTC/ETH" + + # the time window is 10s so from cancellation the target stake (and the calculated fee) should only drop after 10s + When the network moves ahead "9" blocks + Then the liquidity fee factor should be "0.002" for the market "BTC/ETH" + + When the network moves ahead "1" blocks + Then the liquidity fee factor should be "0.001" for the market "BTC/ETH" + + Scenario: 004 Liquidity fee setting to METHOD_CONSTANT(0042-LIQF-070), METHOD_MARGINAL_COST (0042-LIQF-071), and METHOD_WEIGHTED_AVERAGE(0042-LIQF-069) + # setup accounts + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | BTC | 1000000000 | + | lp2 | BTC | 1000000000 | + | party1 | BTC | 100000000 | + | party2 | BTC | 100000000 | + | lp1 | ETH | 1000000000 | + | lp2 | ETH | 1000000000 | + | 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 | BTC/ETH | 800 | 0.005 | submission | + | lp2 | lp2 | BTC/ETH | 300 | 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 | + | lp1 | BTC/ETH | 12 | 1 | buy | BID | 12 | 2 | + | lp1 | BTC/ETH | 12 | 1 | buy | MID | 12 | 1 | + | lp1 | BTC/ETH | 12 | 1 | sell | ASK | 12 | 2 | + | lp1 | BTC/ETH | 12 | 1 | sell | MID | 12 | 1 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + + # update to method constant value 0.08 (0042-LIQF-070) + When the spot markets are updated: + | id | liquidity monitoring | linear slippage factor | quadratic slippage factor | liquidity fee settings | + | BTC/ETH | lqm-params | 1e-3 | 0 | fees-config-1 | + + When the network moves ahead "1" blocks + + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 10 | party2 | + + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | min bound | max bound | target stake | supplied stake | + | 1000 | TRADING_MODE_CONTINUOUS | 500 | 1500 | 825 | 1100 | + + And the liquidity fee factor should be "0.08" for the market "BTC/ETH" + + + # update to constant 0.01 + When the spot markets are updated: + | id | liquidity monitoring | linear slippage factor | quadratic slippage factor | liquidity fee settings | + | BTC/ETH | lqm-params | 1e-3 | 0 | fees-config-2 | + Then the network moves ahead "2" blocks + And the liquidity fee factor should be "0.01" for the market "BTC/ETH" + + # update to weighted average (0042-LIQF-069) + When the spot markets are updated: + | id | liquidity monitoring | linear slippage factor | quadratic slippage factor | liquidity fee settings | + | BTC/ETH | lqm-params | 1e-3 | 0 | fees-config-3 | + Then the network moves ahead "1" blocks + And the liquidity fee factor should be "0.0047272727272727" for the market "BTC/ETH" + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 800 | 0.006 | amendment | + Then the network moves ahead "1" blocks + And the liquidity fee factor should be "0.0054545454545455" for the market "BTC/ETH" + + # update to marginal cost (0042-LIQF-071) + When the spot markets are updated: + | id | liquidity monitoring | linear slippage factor | quadratic slippage factor | liquidity fee settings | + | BTC/ETH | lqm-params | 1e-3 | 0 | fees-config-4 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 800 | 0.0375 | amendment | + Then the network moves ahead "1" blocks + And the liquidity fee factor should be "0.0375" for the market "BTC/ETH" \ No newline at end of file diff --git a/core/integration/features/spot/liquidity_provision/0044-LIME-043.feature b/core/integration/features/spot/liquidity_provision/0044-LIME-043.feature new file mode 100644 index 0000000000..68d9137f7c --- /dev/null +++ b/core/integration/features/spot/liquidity_provision/0044-LIME-043.feature @@ -0,0 +1,117 @@ +Feature: Spot market SLA + + Scenario: 001 0044-LIME-043,For a market with `market.liquidity.earlyExitPenalty = 0.25` and `total stake = target stake + 1200` already, if one liquidity provider places a transaction to reduce their stake by `1000` followed by a second liquidity provider who reduces their commitment by `1000`, the first liquidity provider will receive a full `1000` stake back whilst the second will receive a total of `800` back into their general account with `200` transferred into the market's insurance account (`200` received without penalty, then the remaining `800` receiving a `25%` penalty). + Given time is updated to "2023-07-20T00:00:00Z" + + 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 | 300 | + + And the liquidity sla params named "SLA-1": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.6 | 2 | 0.2 | + + Given the following assets are registered: + | id | decimal places | + | ETH | 1 | + | BTC | 1 | + + And the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 2s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.4 | + | validators.epoch.length | 2s | + + And the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lognormal-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | SLA-1 | + And the following network parameters are set: + | name | value | + | market.liquidity.providersFeeCalculationTimeStep | 1s | + | market.liquidity.stakeToCcyVolume | 1 | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party2 | BTC | 500 | + | lp1 | ETH | 4000 | + | lp1 | BTC | 60 | + | lp2 | ETH | 4000 | + | lp2 | BTC | 60 | + + And the average block duration is "1" + + Given the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | updated-lqm-params | 0.2 | 20s | 0.8 | + + When the spot markets are updated: + | id | liquidity monitoring | linear slippage factor | quadratic slippage factor | + | BTC/ETH | updated-lqm-params | 0.5 | 0.5 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 3000 | 0.1 | submission | + | lp2 | lp2 | BTC/ETH | 3000 | 0.1 | submission | + + Then the network moves ahead "1" blocks + And the network treasury balance should be "0" for the asset "ETH" + And the global insurance pool balance should be "0" for the asset "ETH" + And the global insurance pool balance should be "0" for the asset "BTC" + And the party "lp1" lp liquidity fee account balance should be "0" for the market "BTC/ETH" + Then the party "lp1" lp liquidity bond account balance should be "3000" for the market "BTC/ETH" + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 0 | TRADING_MODE_OPENING_AUCTION | AUCTION_TRIGGER_OPENING | 4800 | 6000 | 0 | + + # place orders and generate trades + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | only | + | party1 | BTC/ETH | buy | 6 | 8 | 0 | TYPE_LIMIT | TIF_GTC | party-order5 | | + | party1 | BTC/ETH | buy | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | party-order3 | | + | party2 | BTC/ETH | sell | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | party-order4 | | + | party2 | BTC/ETH | sell | 6 | 24 | 0 | TYPE_LIMIT | TIF_GTC | party-order6 | | + + When the network moves ahead "2" blocks + + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 15 | 1 | party2 | + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 15 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 4800 | 6000 | 0 | + + Then "lp1" should have general account balance of "1000" for asset "ETH" + Then "lp2" should have general account balance of "1000" for asset "ETH" + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 2000 | 0.1 | amendment | + Then the network moves ahead "4" blocks + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | lp2 | BTC/ETH | 2000 | 0.1 | amendment | + + Then the network moves ahead "4" blocks + + #bond penalty for lp2 = 800*0.25 =200 + And the network treasury balance should be "200" for the asset "ETH" + Then the party "lp1" lp liquidity bond account balance should be "2000" for the market "BTC/ETH" + Then the party "lp2" lp liquidity bond account balance should be "2000" for the market "BTC/ETH" + Then "lp1" should have general account balance of "2000" for asset "ETH" + Then "lp2" should have general account balance of "1800" for asset "ETH" + + diff --git a/core/integration/features/spot/liquidity_provision/0044-LIME-044.feature b/core/integration/features/spot/liquidity_provision/0044-LIME-044.feature new file mode 100644 index 0000000000..df594b32f4 --- /dev/null +++ b/core/integration/features/spot/liquidity_provision/0044-LIME-044.feature @@ -0,0 +1,130 @@ +Feature: Spot market SLA + + Scenario: 001 0044-LIME-044,For a market with `market.liquidity.earlyExitPenalty = 0.25` and `total stake = target stake + 1200` already, a liquidity provider who reduces their commitment by `2000` will receive a total of `1800` back into their general account with `200` transferred into the market's insurance account (`40` received without penalty, then the remaining `60` receiving a `25%` penalty). + Given time is updated to "2023-07-20T00:00:00Z" + + 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 | 300 | + + And the liquidity sla params named "SLA-1": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.6 | 2 | 0.2 | + + Given the following assets are registered: + | id | decimal places | + | ETH | 1 | + | BTC | 1 | + + And the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 2s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.4 | + | validators.epoch.length | 2s | + + And the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lognormal-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | SLA-1 | + And the following network parameters are set: + | name | value | + | market.liquidity.providersFeeCalculationTimeStep | 1s | + | market.liquidity.stakeToCcyVolume | 1 | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party2 | BTC | 500 | + | lp1 | ETH | 4000 | + | lp1 | BTC | 60 | + | lp2 | ETH | 4000 | + | lp2 | BTC | 60 | + + And the average block duration is "1" + + Given the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | updated-lqm-params | 0.2 | 20s | 0.8 | + + When the spot markets are updated: + | id | liquidity monitoring | linear slippage factor | quadratic slippage factor | + | BTC/ETH | updated-lqm-params | 0.5 | 0.5 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 3000 | 0.1 | submission | + | lp2 | lp2 | BTC/ETH | 2000 | 0.1 | submission | + + Then the network moves ahead "1" blocks + And the network treasury balance should be "0" for the asset "ETH" + And the global insurance pool balance should be "0" for the asset "ETH" + And the global insurance pool balance should be "0" for the asset "BTC" + And the party "lp1" lp liquidity fee account balance should be "0" for the market "BTC/ETH" + Then the party "lp1" lp liquidity bond account balance should be "3000" for the market "BTC/ETH" + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 0 | TRADING_MODE_OPENING_AUCTION | AUCTION_TRIGGER_OPENING | 4000 | 5000 | 0 | + + # place orders and generate trades + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | only | + | party1 | BTC/ETH | buy | 6 | 8 | 0 | TYPE_LIMIT | TIF_GTC | party-order5 | | + | party1 | BTC/ETH | buy | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | party-order3 | | + | party2 | BTC/ETH | sell | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | party-order4 | | + | party2 | BTC/ETH | sell | 6 | 24 | 0 | TYPE_LIMIT | TIF_GTC | party-order6 | | + + When the network moves ahead "2" blocks + + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 15 | 1 | party2 | + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 15 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 4000 | 5000 | 0 | + + Then "lp1" should have general account balance of "1000" for asset "ETH" + Then "lp2" should have general account balance of "2000" for asset "ETH" + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 1000 | 0.1 | amendment | + + Then the network moves ahead "4" blocks + + # #bond penalty for lp1 = 1000*0.25 =250 + And the network treasury balance should be "250" for the asset "ETH" + Then the party "lp1" lp liquidity bond account balance should be "1000" for the market "BTC/ETH" + Then the party "lp2" lp liquidity bond account balance should be "2000" for the market "BTC/ETH" + Then "lp1" should have general account balance of "2750" for asset "ETH" + Then "lp2" should have general account balance of "2000" for asset "ETH" + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 15 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 4000 | 3000 | 0 | + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 500 | 0.1 | amendment | + + Then the network moves ahead "4" blocks + + # #bond penalty for lp1 = 500*0.25 =125, so total bond penalty is 125+250=375 + And the network treasury balance should be "375" for the asset "ETH" + Then the party "lp1" lp liquidity bond account balance should be "500" for the market "BTC/ETH" + Then the party "lp2" lp liquidity bond account balance should be "2000" for the market "BTC/ETH" + #general account for lp1: (500-125)+2750=3125 + Then "lp1" should have general account balance of "3125" for asset "ETH" + Then "lp2" should have general account balance of "2000" for asset "ETH" + + diff --git a/core/integration/features/spot/liquidity_provision/0044-LIME-054.feature b/core/integration/features/spot/liquidity_provision/0044-LIME-054.feature new file mode 100644 index 0000000000..3a4adf398c --- /dev/null +++ b/core/integration/features/spot/liquidity_provision/0044-LIME-054.feature @@ -0,0 +1,114 @@ +Feature: Spot market SLA + + Scenario: 001 0044-LIME-054,For a market that is in opening auction and LP has committed liquidity: + #- When a LP increases their commitment then: + # - It takes effect immediately for the purposes of LP stake supplied to the market + # - In terms of the liquidity they are expected to supply: this only takes effect from the start of the next epoch + Given time is updated to "2023-07-20T00:00:00Z" + + 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 | 300 | + + And the liquidity sla params named "SLA-1": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.6 | 2 | 0.2 | + + Given the following assets are registered: + | id | decimal places | + | ETH | 1 | + | BTC | 1 | + + And the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 2s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.4 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.4 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.4 | + | validators.epoch.length | 4s | + + And the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lognormal-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | SLA-1 | + And the following network parameters are set: + | name | value | + | market.liquidity.providersFeeCalculationTimeStep | 1s | + | market.liquidity.stakeToCcyVolume | 1 | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party2 | BTC | 500 | + | lp1 | ETH | 4000 | + | lp1 | BTC | 60 | + | lp2 | ETH | 4000 | + | lp2 | BTC | 60 | + | lp3 | ETH | 4000 | + | lp3 | BTC | 60 | + + And the average block duration is "1" + + Given the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | updated-lqm-params | 0.2 | 20s | 0.8 | + + When the spot markets are updated: + | id | liquidity monitoring | linear slippage factor | quadratic slippage factor | + | BTC/ETH | updated-lqm-params | 0.5 | 0.5 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 1000 | 0.1 | submission | + | lp2 | lp2 | BTC/ETH | 2000 | 0.1 | submission | + | lp3 | lp3 | BTC/ETH | 2000 | 0.1 | submission | + + Then the network moves ahead "1" blocks + And the network treasury balance should be "0" for the asset "ETH" + Then the party "lp1" lp liquidity bond account balance should be "1000" for the market "BTC/ETH" + Then the party "lp2" lp liquidity bond account balance should be "2000" for the market "BTC/ETH" + And the supplied stake should be "5000" for the market "BTC/ETH" + + #0044-LIME-055: LP can decrease or cancel their commitment and it will take effect immediately without incurring penalties + When party "lp3" cancels their liquidity provision for market "BTC/ETH" + + Then the network moves ahead "1" blocks + + And the network treasury balance should be "0" for the asset "ETH" + Then the party "lp1" lp liquidity bond account balance should be "1000" for the market "BTC/ETH" + Then the party "lp2" lp liquidity bond account balance should be "2000" for the market "BTC/ETH" + Then the party "lp3" lp liquidity bond account balance should be "0" for the market "BTC/ETH" + And the supplied stake should be "3000" for the market "BTC/ETH" + + # place orders and generate trades + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | only | + | party1 | BTC/ETH | buy | 6 | 8 | 0 | TYPE_LIMIT | TIF_GTC | party-order5 | | + | party1 | BTC/ETH | buy | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | party-order3 | | + | party2 | BTC/ETH | sell | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | party-order4 | | + | party2 | BTC/ETH | sell | 6 | 24 | 0 | TYPE_LIMIT | TIF_GTC | party-order6 | | + + When the network moves ahead "1" blocks + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 15 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 4000 | 3000 | 0 | + + Then the network moves ahead "5" blocks + And the network treasury balance should be "1200" for the asset "ETH" + Then the party "lp1" lp liquidity bond account balance should be "600" for the market "BTC/ETH" + Then the party "lp2" lp liquidity bond account balance should be "1200" for the market "BTC/ETH" + And the supplied stake should be "1800" for the market "BTC/ETH" + + #0044-LIME-064: When the LP increases its commitment and the increment is higher than its general account balance, the increments are rejected, and the old provision persists. + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | error | + | lp1 | lp1 | BTC/ETH | 50000 | 0.1 | amendments | commitment submission rejected, not enough stake | diff --git a/core/integration/features/spot/liquidity_provision/0044-LIME-102.feature b/core/integration/features/spot/liquidity_provision/0044-LIME-102.feature new file mode 100644 index 0000000000..78355e4c55 --- /dev/null +++ b/core/integration/features/spot/liquidity_provision/0044-LIME-102.feature @@ -0,0 +1,95 @@ +Feature: Check not penalty if time on book amount is high enough + + Background: + + Given the following network parameters are set: + | name | value | + | market.liquidity.bondPenaltyParameter | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 2 | + | 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.10 | 24h | 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.05 | 0.5 | 1 | 1.0 | + And the spot markets: + | id | name | base asset | quote asset | liquidity monitoring | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lqm-params | simple-risk-model-1 | 2 | fees-config-1 | price-monitoring-1 | SLA | + And the following network parameters are set: + | name | value | + | market.liquidity.providersFeeCalculationTimeStep | 5s | + + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 100000000 | + | party2 | ETH | 100000000 | + | party1 | BTC | 100000000 | + | party2 | BTC | 100000000 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | party1 | BTC/ETH | 1000 | 0.001 | submission | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 30 | 910 | 0 | TYPE_LIMIT | TIF_GTC | party1-order1 | + | party1 | BTC/ETH | sell | 20 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | party1-order2 | + | party2 | BTC/ETH | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | party2-order1 | + + Scenario: If a liquidity provider has fraction_of_time_on_book >= market.liquidity.commitmentMinTimeFraction, no penalty will be taken from their bond account (0044-LIME-102) + When the opening auction period ends for market "BTC/ETH" + And the auction ends with a traded volume of "10" at a price of "1000" + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | target stake | supplied stake | open interest | best static bid price | static mid price | best static offer price | + | 1000 | TRADING_MODE_CONTINUOUS | 0 | 1000 | 0 | 910 | 955 | 1000 | + + And the parties should have the following account balances: + | party | asset | market id | general | bond | + | party1 | ETH | BTC/ETH | 99981700 | 1000 | + + # Move forward an epoch and make sure the accounts do not change as we have 5/5 blocks covered + When the network moves ahead "7" blocks + Then the liquidity provisions should have the following states: + | id | party | market | commitment amount | status | + | lp1 | party1 | BTC/ETH | 1000 | STATUS_ACTIVE | + And the parties should have the following account balances: + | party | asset | market id | general | bond | + | party1 | ETH | BTC/ETH | 99981700 | 1000 | + + # Move forward 6 blocks and then cancel the commitment covering order + When the network moves ahead "6" blocks + # Cancel the order so we are no longer covering our commitment + Then the parties cancel the following orders: + | party | reference | + | party1 | party1-order1 | + | party1 | party1-order2 | + + # Move forward 1 block to end the epoch and make sure we still do not get punished as we covered 4/5 blocks (0.8 coverage > 0.5 required) + When the network moves ahead "1" blocks + And the parties should have the following account balances: + | party | asset | market id | general | bond | + | party1 | ETH | BTC/ETH | 100009000 | 1000 | + # Now move forward 7 more blocks to complete another epoch and to show we do get punished + When the network moves ahead "7" blocks + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | target stake | supplied stake | open interest | best static bid price | static mid price | best static offer price | + | 1000 | TRADING_MODE_CONTINUOUS | 1000 | 810 | 0 | 0 | 0 | 0 | + + And the parties should have the following account balances: + | party | asset | market id | general | bond | + | party1 | ETH | BTC/ETH | 100009000 | 810 | diff --git a/core/integration/features/spot/liquidity_provision/0044-LIME-103.feature b/core/integration/features/spot/liquidity_provision/0044-LIME-103.feature new file mode 100644 index 0000000000..c83667e839 --- /dev/null +++ b/core/integration/features/spot/liquidity_provision/0044-LIME-103.feature @@ -0,0 +1,111 @@ +Feature: Check LP slashing after intra-epoch change to time on book requirements + Background: + + Given the following network parameters are set: + | name | value | + | market.liquidity.bondPenaltyParameter | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 2 | + | validators.epoch.length | 10s | + | 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.10 | 24h | 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.05 | 0.6 | 1 | 1.0 | + And the liquidity sla params named "SLA-2": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.05 | 0.3 | 1 | 1.0 | + And the spot markets: + | id | name | base asset | quote asset | liquidity monitoring | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lqm-params | simple-risk-model-1 | 2 | fees-config-1 | price-monitoring-1 | SLA | + And the following network parameters are set: + | name | value | + | market.liquidity.providersFeeCalculationTimeStep | 5s | + + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 100000000 | + | party2 | ETH | 100000000 | + | party1 | BTC | 100000000 | + | party2 | BTC | 100000000 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | party1 | BTC/ETH | 1000 | 0.001 | submission | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 30 | 910 | 0 | TYPE_LIMIT | TIF_GTC | party1-order1 | + | party1 | BTC/ETH | sell | 20 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | party1-order2 | + | party2 | BTC/ETH | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | party2-order1 | + + Scenario: If a liquidity provider has fraction_of_time_on_book >= market.liquidity.commitmentMinTimeFraction, no penalty will be taken from their bond account (0044-LIME-103) + + When the opening auction period ends for market "BTC/ETH" + And the auction ends with a traded volume of "10" at a price of "1000" + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | target stake | supplied stake | open interest | best static bid price | static mid price | best static offer price | + | 1000 | TRADING_MODE_CONTINUOUS | 0 | 1000 | 0 | 910 | 955 | 1000 | + + And the parties should have the following account balances: + | party | asset | market id | general | bond | + | party1 | ETH | BTC/ETH | 99981700 | 1000 | + + # Move forward an epoch and make sure the accounts do not change as we have 5/5 blocks covered + When the network moves ahead "1" epochs + Then the liquidity provisions should have the following states: + | id | party | market | commitment amount | status | + | lp1 | party1 | BTC/ETH | 1000 | STATUS_ACTIVE | + And the parties should have the following account balances: + | party | asset | market id | general | bond | + | party1 | ETH | BTC/ETH | 99981700 | 1000 | + + # Move forward 6 blocks and then cancel the commitment covering order + When the network moves ahead "3" blocks + # Cancel the order so we are no longer covering our commitment + Then the parties cancel the following orders: + | party | reference | + | party1 | party1-order1 | + | party1 | party1-order2 | + + Then the spot markets are updated: + | id | sla params | + | BTC/ETH | SLA-2 | + Then the network moves ahead "1" epochs + + # Move forward 1 block to end the epoch and make sure we still are punished as SLA should not have updated yet + And the parties should have the following account balances: + | party | asset | market id | general | bond | + | party1 | ETH | BTC/ETH | 100009000 | 890 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 30 | 910 | 0 | TYPE_LIMIT | TIF_GTC | party1-order1 | + | party1 | BTC/ETH | sell | 20 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | party1-order2 | + + Then the network moves ahead "4" blocks + Then the parties cancel the following orders: + | party | reference | + | party1 | party1-order1 | + | party1 | party1-order2 | + + Then the network moves ahead "1" epochs + + # Move forward 1 block to end the epoch and make sure we still are punished as SLA should not have updated yet + And the parties should have the following account balances: + | party | asset | market id | general | bond | + | party1 | ETH | BTC/ETH | 100009000 | 890 | diff --git a/core/integration/features/spot/liquidity_provision/0044-LIME-104.feature b/core/integration/features/spot/liquidity_provision/0044-LIME-104.feature new file mode 100644 index 0000000000..3712254f18 --- /dev/null +++ b/core/integration/features/spot/liquidity_provision/0044-LIME-104.feature @@ -0,0 +1,111 @@ +Feature: Check LP slashing after intra-epoch change to time on book requirements + Background: + + Given the following network parameters are set: + | name | value | + | market.liquidity.bondPenaltyParameter | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 2 | + | validators.epoch.length | 10s | + | 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.10 | 24h | 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.05 | 0.1 | 1 | 1.0 | + And the liquidity sla params named "SLA-2": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.05 | 0.6 | 1 | 1.0 | + And the spot markets: + | id | name | base asset | quote asset | liquidity monitoring | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lqm-params | simple-risk-model-1 | 2 | fees-config-1 | price-monitoring-1 | SLA | + And the following network parameters are set: + | name | value | + | market.liquidity.providersFeeCalculationTimeStep | 5s | + + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 100000000 | + | party2 | ETH | 100000000 | + | party1 | BTC | 100000000 | + | party2 | BTC | 100000000 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | party1 | BTC/ETH | 1000 | 0.001 | submission | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 30 | 910 | 0 | TYPE_LIMIT | TIF_GTC | party1-order1 | + | party1 | BTC/ETH | sell | 20 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | party1-order2 | + | party2 | BTC/ETH | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | party2-order1 | + + Scenario: If a liquidity provider has fraction_of_time_on_book >= market.liquidity.commitmentMinTimeFraction, no penalty will be taken from their bond account (0044-LIME-104) + + When the opening auction period ends for market "BTC/ETH" + And the auction ends with a traded volume of "10" at a price of "1000" + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | target stake | supplied stake | open interest | best static bid price | static mid price | best static offer price | + | 1000 | TRADING_MODE_CONTINUOUS | 0 | 1000 | 0 | 910 | 955 | 1000 | + + And the parties should have the following account balances: + | party | asset | market id | general | bond | + | party1 | ETH | BTC/ETH | 99981700 | 1000 | + + # Move forward an epoch and make sure the accounts do not change as we have 5/5 blocks covered + When the network moves ahead "1" epochs + Then the liquidity provisions should have the following states: + | id | party | market | commitment amount | status | + | lp1 | party1 | BTC/ETH | 1000 | STATUS_ACTIVE | + And the parties should have the following account balances: + | party | asset | market id | general | bond | + | party1 | ETH | BTC/ETH | 99981700 | 1000 | + + # Move forward 6 blocks and then cancel the commitment covering order + When the network moves ahead "3" blocks + # Cancel the order so we are no longer covering our commitment + Then the parties cancel the following orders: + | party | reference | + | party1 | party1-order1 | + | party1 | party1-order2 | + + Then the spot markets are updated: + | id | sla params | + | BTC/ETH | SLA-2 | + Then the network moves ahead "1" epochs + + # Move forward 1 block to end the epoch and make sure we are not punished as SLA should not have updated yet + And the parties should have the following account balances: + | party | asset | market id | general | bond | + | party1 | ETH | BTC/ETH | 100009000 | 1000 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 30 | 910 | 0 | TYPE_LIMIT | TIF_GTC | party1-order1 | + | party1 | BTC/ETH | sell | 20 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | party1-order2 | + + Then the network moves ahead "4" blocks + Then the parties cancel the following orders: + | party | reference | + | party1 | party1-order1 | + | party1 | party1-order2 | + + Then the network moves ahead "1" epochs + + # Move forward 1 block to end the epoch and make sure we are punished as SLA has now updates + And the parties should have the following account balances: + | party | asset | market id | general | bond | + | party1 | ETH | BTC/ETH | 100009000 | 916 | \ No newline at end of file diff --git a/core/integration/features/spot/liquidity_provision/0044-LIME-107.feature b/core/integration/features/spot/liquidity_provision/0044-LIME-107.feature new file mode 100644 index 0000000000..7439ce722c --- /dev/null +++ b/core/integration/features/spot/liquidity_provision/0044-LIME-107.feature @@ -0,0 +1,208 @@ +Feature: Spot market SLA + + Scenario: 001 0044-LIME-107 + Given time is updated to "2023-07-20T00:00:00Z" + + 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 fees configuration named "fees-config-4": + | maker fee | infrastructure fee | liquidity fee method | liquidity fee constant | + | 0.0004 | 0.001 | METHOD_MARGINAL_COST | 0.01 | + + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600 | 0.999 | 300 | + + And the liquidity sla params named "SLA-1": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.6 | 2 | 0.2 | + + Given the following assets are registered: + | id | decimal places | + | ETH | 1 | + | BTC | 1 | + + And the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 2s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.15 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.3 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.4 | + | validators.epoch.length | 4s | + + And the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lognormal-risk-model-1 | 1 | fees-config-4 | price-monitoring-1 | SLA-1 | + And the following network parameters are set: + | name | value | + | market.liquidity.providersFeeCalculationTimeStep | 1s | + | market.liquidity.stakeToCcyVolume | 1 | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party2 | BTC | 500 | + | lp1 | ETH | 4000 | + | lp1 | BTC | 60 | + | lp2 | ETH | 4000 | + | lp2 | BTC | 60 | + | lp3 | ETH | 70000 | + | lp3 | BTC | 2500 | + | lp4 | ETH | 70000 | + | lp4 | BTC | 2500 | + + And the average block duration is "1" + + Given the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | updated-lqm-params | 0.2 | 20s | 0.8 | + + When the spot markets are updated: + | id | liquidity monitoring | linear slippage factor | quadratic slippage factor | + | BTC/ETH | updated-lqm-params | 0.5 | 0.5 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 3000 | 0.1 | submission | + | lp2 | lp2 | BTC/ETH | 3000 | 0.1 | submission | + + Then the network moves ahead "1" blocks + And the network treasury balance should be "0" for the asset "ETH" + And the global insurance pool balance should be "0" for the asset "ETH" + And the global insurance pool balance should be "0" for the asset "BTC" + And the party "lp1" lp liquidity fee account balance should be "0" for the market "BTC/ETH" + Then the party "lp1" lp liquidity bond account balance should be "3000" for the market "BTC/ETH" + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 0 | TRADING_MODE_OPENING_AUCTION | AUCTION_TRIGGER_OPENING | 4800 | 6000 | 0 | + + # place orders and generate trades + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | only | + | party1 | BTC/ETH | buy | 6 | 8 | 0 | TYPE_LIMIT | TIF_GTC | party-order5 | | + | party1 | BTC/ETH | buy | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | party-order3 | | + | party2 | BTC/ETH | sell | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | party-order4 | | + | party2 | BTC/ETH | sell | 6 | 24 | 0 | TYPE_LIMIT | TIF_GTC | party-order6 | | + + When the network moves ahead "2" blocks + + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 15 | 1 | party2 | + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 15 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 4800 | 6000 | 0 | + + Then "lp1" should have general account balance of "1000" for asset "ETH" + Then "lp2" should have general account balance of "1000" for asset "ETH" + + #0044-LIME-108:If a liquidity provider with an active liquidity provision at the start of an epoch amends the fee level associated to this commitment during the epoch, this change will only take effect at the end of the epoch. + #0044-LIME-109:If a liquidity provider with an active liquidity provision at the start of an epoch increases their liquidity provision staked commitment during the epoch + #0044-LIME-110:the protocol will increase the bond to the new level if they have sufficient collateral in the settlement asset of the market to meet new commitment amount + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | error | + | lp1 | lp1 | BTC/ETH | 20000 | 0.2 | amendment | commitment submission rejected, not enough stake | + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 2000 | 0.2 | amendment | + | lp2 | lp2 | BTC/ETH | 4000 | 0.4 | amendment | + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 15 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 4800 | 7000 | 0 | + + Then the party "lp1" lp liquidity bond account balance should be "3000" for the market "BTC/ETH" + Then the party "lp2" lp liquidity bond account balance should be "4000" for the market "BTC/ETH" + And the liquidity fee factor should be "0.1" for the market "BTC/ETH" + + Then the network moves ahead "5" blocks + #supplied stake has been reduced after SLA bond penalty, target stake went up temperarily since lp2 increased commitment and its reflected in bond account immediately + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 15 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 5600 | 5100 | 0 | + #0044-LIME-107:Lp reduces LP commitment and got slashed during the epoch, and the lower (slashed) LP bond stake will be retained + Then the party "lp1" lp liquidity bond account balance should be "1550" for the market "BTC/ETH" + #0044-LIME-111:at the end of the current epoch rewards / penalties are evaluated based on the balance of the bond account at start of epoch + Then the party "lp2" lp liquidity bond account balance should be "3550" for the market "BTC/ETH" + And the liquidity fee factor should be "0.4" for the market "BTC/ETH" + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 15 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 5600 | 5100 | 0 | + + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | lp1 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_NETWORK_TREASURY | BTC/ETH | 450 | ETH | + | lp2 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_NETWORK_TREASURY | BTC/ETH | 450 | ETH | + Then the network moves ahead "1" blocks + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp3 | lp3 | BTC/ETH | 3000 | 0.1 | submission | + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 15 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 5600 | 8100 | 0 | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp3 | BTC/ETH | buy | 500 | 7 | 0 | TYPE_LIMIT | TIF_GTC | + | lp3 | BTC/ETH | sell | 200 | 25 | 0 | TYPE_LIMIT | TIF_GTC | + Then the party "lp3" lp liquidity bond account balance should be "3000" for the market "BTC/ETH" + + Then the network moves ahead "5" blocks + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 15 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 6480 | 7336 | 0 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp3 | lp3 | BTC/ETH | 2900 | 0.1 | amendment | + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 15 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 6480 | 7336 | 0 | + + #0044-LIME-112:A liquidity provider who reduces their liquidity provision such that the total stake on the market is still above the target stake + Then the party "lp3" lp liquidity bond account balance should be "3000" for the market "BTC/ETH" + + #0044-LIME-105:A liquidity provider with an active liquidity provision at the start of an epoch reduces their liquidity provision staked commitment during the epoch + Then the network moves ahead "2" blocks + Then the party "lp3" lp liquidity bond account balance should be "3000" for the market "BTC/ETH" + Then the network moves ahead "2" blocks + Then the party "lp3" lp liquidity bond account balance should be "3000" for the market "BTC/ETH" + + Then the network moves ahead "2" blocks + Then the party "lp3" lp liquidity bond account balance should be "2900" for the market "BTC/ETH" + Then "lp3" should have general account balance of "32100" for asset "ETH" + Then "lp3" should have holding account balance of "35000" for asset "ETH" + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp4 | lp4 | BTC/ETH | 3000 | 0.1 | submission | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp4 | BTC/ETH | buy | 500 | 7 | 0 | TYPE_LIMIT | TIF_GTC | + | lp4 | BTC/ETH | sell | 200 | 25 | 0 | TYPE_LIMIT | TIF_GTC | + Then the party "lp4" lp liquidity bond account balance should be "3000" for the market "BTC/ETH" + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp4 | lp4 | BTC/ETH | 2900 | 0.1 | amendment | + Then the network moves ahead "1" blocks + #0044-LIME-106:Lp reduces commitment a few times during the epoch + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp4 | lp4 | BTC/ETH | 2800 | 0.1 | amendment | + Then the network moves ahead "1" blocks + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp4 | lp4 | BTC/ETH | 2700 | 0.1 | amendment | + + Then the network moves ahead "3" blocks + Then the party "lp4" lp liquidity bond account balance should be "2700" for the market "BTC/ETH" diff --git a/core/integration/features/spot/orders/0011-MARA-continuous.feature b/core/integration/features/spot/orders/0011-MARA-continuous.feature index fc29868edb..365422233f 100644 --- a/core/integration/features/spot/orders/0011-MARA-continuous.feature +++ b/core/integration/features/spot/orders/0011-MARA-continuous.feature @@ -72,7 +72,7 @@ Feature: Spot market | limits.markets.maxPeggedOrders | 10 | When the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party | market id | side | volume | price | resulting trades | type | tif | reference | | party2 | BTC/ETH | sell | 5 | 1000000 | 0 | TYPE_LIMIT | TIF_GTC | t2-s-1 | And the parties place the following pegged orders: @@ -81,14 +81,37 @@ Feature: Spot market Then "party5" should have holding account balance of "1" for asset "BTC" + And the order book should have the following volumes for market "BTC/ETH": + | side | price | volume | + | sell | 1000 | 0 | + + #0068-MATC-072, Incoming limit GTT orders match if possible, any remaining is placed on the book. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | expires in | reference | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTT | 2 | buy2 | + | party5 | BTC/ETH | sell | 2 | 1000 | 1 | TYPE_LIMIT | TIF_GTT | 2 | sell2 | + + Then the orders should have the following status: + | party | reference | status | + | party1 | buy2 | STATUS_FILLED | + | party5 | sell2 | STATUS_ACTIVE | + And the order book should have the following volumes for market "BTC/ETH": + | side | price | volume | + | sell | 1000 | 1 | + + When the network moves ahead "2" blocks + Then the orders should have the following status: + | party | reference | status | + | party5 | sell2 | STATUS_EXPIRED | + Scenario: In Spot market, holding in holding account is correctly calculated for all order types in continuous trading pegged GTC. (0011-MARA-026) Given the following network parameters are set: | name | value | | limits.markets.maxPeggedOrders | 10 | When the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | reference | - | party2 | BTC/ETH | sell | 5 | 1000000 | 0 | TYPE_LIMIT | TIF_GTC | t2-s-1 | + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | BTC/ETH | sell | 5 | 1000000 | 0 | TYPE_LIMIT | TIF_GTC | t2-s-1 | When the parties place the following pegged orders: | party | market id | side | volume | pegged reference | offset | @@ -102,11 +125,12 @@ Feature: Spot market | limits.markets.maxPeggedOrders | 10 | When the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | reference | - | party2 | BTC/ETH | sell | 5 | 1000000 | 0 | TYPE_LIMIT | TIF_GFN | t2-s-1 | + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | BTC/ETH | sell | 5 | 1000000 | 0 | TYPE_LIMIT | TIF_GFN | t2-s-1 | When the parties place the following pegged orders: | party | market id | side | volume | pegged reference | offset | | party5 | BTC/ETH | sell | 1 | ASK | 100 | Then "party5" should have holding account balance of "1" for asset "BTC" + diff --git a/core/integration/features/spot/orders/0024-OSTA-040.feature b/core/integration/features/spot/orders/0024-OSTA-040.feature index 29c38c6597..0f4ea2b555 100644 --- a/core/integration/features/spot/orders/0024-OSTA-040.feature +++ b/core/integration/features/spot/orders/0024-OSTA-040.feature @@ -37,8 +37,8 @@ Feature: 0037-OPEG-020, 0037-OPEG-021 Scenario: check invalid order types in spot market #while a sell order pegged to the mid price should have it's price rounded down to the nearest market tick size 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 | + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | liquidity 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 | lqm-params | 2 | 2 | default-basic | And the parties deposit on asset's general account the following amount: | party | asset | amount | | party1 | ETH | 100000000 | @@ -60,7 +60,7 @@ Feature: 0037-OPEG-020, 0037-OPEG-021 And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" Then 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 | - | 1100 | TRADING_MODE_CONTINUOUS | 3600 | 1055 | 1147 | 1000 | 10000 | 0 | + | 1100 | TRADING_MODE_CONTINUOUS | 3600 | 1055 | 1147 | 10000 | 10000 | 0 | Then the following trades should be executed: | buyer | price | size | seller | diff --git a/core/integration/features/spot/orders/0034-PROB-010.feature b/core/integration/features/spot/orders/0034-PROB-010.feature new file mode 100644 index 0000000000..b2a2577340 --- /dev/null +++ b/core/integration/features/spot/orders/0034-PROB-010.feature @@ -0,0 +1,99 @@ +Feature: Spot market quality of committed liquidity + + 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 | + | market.liquidity.probabilityOfTrading.tau.scaling | 1 | + | limits.markets.maxPeggedOrders | 4 | + + Given the following assets are registered: + | id | decimal places | + | ETH | 2 | + | BTC | 2 | + + 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 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 | default-log-normal-risk-model | 1 | default-none | default-none | 2 | 2 | SLA | + + # setup accounts + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party5 | BTC | 100 | + | lp1 | ETH | 100000 | + | lp1 | BTC | 1000 | + | lp2 | ETH | 100000 | + | lp2 | BTC | 1000 | + + And the average block duration is "1" + + # Set up 2 users with liquidity commitments + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 10000 | 0.001 | submission | + | lp2 | lp2 | BTC/ETH | 10000 | 0.001 | submission | + + # 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 | reference | + | party1 | BTC/ETH | buy | 1 | 999 | 0 | TYPE_LIMIT | TIF_GTC | p1-buy1 | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p1-buy2 | + | party5 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p5-sell1 | + | party5 | BTC/ETH | sell | 1 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | p5-sell2 | + + # Place pegged orders to cover their commitment, one close to top of the book, one further away + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | + | lp1 | BTC/ETH | 200 | 100 | buy | BID | 200 | 1 | lp1-buy | + | lp1 | BTC/ETH | 200 | 100 | sell | ASK | 200 | 1 | lp1-sell | + | lp2 | BTC/ETH | 200 | 100 | buy | BID | 200 | 10 | lp2-buy | + | lp2 | BTC/ETH | 200 | 100 | sell | ASK | 200 | 10 | lp2-sell | + + And 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 "1000" for the market "BTC/ETH" + And the network moves ahead "1" epochs + + Scenario: Change of market.liquidity.probabilityOfTrading.tau.scaling will immediately change the + scaling parameter, hence will change the probability of trading used for comparing quality + of committed liquidity (0034-PROB-010) + + And the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | party1 | BTC/ETH | p1-buy1 | buy | 1 | 1 | 999 | STATUS_ACTIVE | + | party1 | BTC/ETH | p1-buy2 | buy | 1 | 0 | 1000 | STATUS_FILLED | + | party5 | BTC/ETH | p5-sell1 | sell | 1 | 0 | 1000 | STATUS_FILLED | + | party5 | BTC/ETH | p5-sell2 | sell | 1 | 1 | 1001 | STATUS_ACTIVE | + + Then the pegged orders should have the following states: + | party | market id | side | volume | reference | offset | price | status | + | lp1 | BTC/ETH | buy | 200 | BID | 1 | 998 | STATUS_ACTIVE | + | lp1 | BTC/ETH | sell | 200 | ASK | 1 | 1002 | STATUS_ACTIVE | + | lp2 | BTC/ETH | buy | 200 | BID | 10 | 989 | STATUS_ACTIVE | + | lp2 | BTC/ETH | sell | 200 | ASK | 10 | 1011 | STATUS_ACTIVE | + + Given the network moves ahead "1" epochs + Then the liquidity provider fee shares for the market "BTC/ETH" should be: + | party | equity like share | average entry valuation | average score | + | lp1 | 0.5 | 10000 | 0.6007854709 | + | lp2 | 0.5 | 20000 | 0.3992145291 | + + # Now change the PoT value and move forward an epoch to apply the change + When the following network parameters are set: + | name | value | + | market.liquidity.probabilityOfTrading.tau.scaling | 1000 | + And the network moves ahead "1" epochs + + # The average score should be updated to be different from the numbers above + Then the liquidity provider fee shares for the market "BTC/ETH" should be: + | party | equity like share | average entry valuation | average score | + | lp1 | 0.5 | 10000 | 0.561840354 | + | lp2 | 0.5 | 20000 | 0.438159646 | \ No newline at end of file diff --git a/core/integration/features/spot/orders/0068-MATC-060.feature b/core/integration/features/spot/orders/0068-MATC-060.feature new file mode 100644 index 0000000000..48fd45a15a --- /dev/null +++ b/core/integration/features/spot/orders/0068-MATC-060.feature @@ -0,0 +1,146 @@ +Feature: Spot market matching engine + + @MATC + Scenario: 0068-MATC-060: Any persistent order that is currently ACTIVE or PARKED can be cancelled. + + Given time is updated to "2023-07-20T00:00:00Z" + + 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 | + | 36000 | 0.999 | 3 | + + And the liquidity sla params named "SLA-1": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.6 | 2 | 0.2 | + + Given the following assets are registered: + | id | decimal places | + | ETH | 1 | + | BTC | 1 | + + And the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 2s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.7 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.4 | + | validators.epoch.length | 2s | + | limits.markets.maxPeggedOrders | 10 | + + And the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lognormal-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | SLA-1 | + And the following network parameters are set: + | name | value | + | market.liquidity.providersFeeCalculationTimeStep | 1s | + | market.liquidity.stakeToCcyVolume | 1 | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party2 | BTC | 500 | + | lp1 | ETH | 4000 | + | lp1 | BTC | 60 | + | lp2 | ETH | 4000 | + | lp2 | BTC | 60 | + + And the average block duration is "1" + + Given the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | updated-lqm-params | 0.2 | 20s | 0.8 | + + When the spot markets are updated: + | id | liquidity monitoring | linear slippage factor | quadratic slippage factor | + | BTC/ETH | updated-lqm-params | 0.5 | 0.5 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 3000 | 0.1 | submission | + + Then the network moves ahead "1" blocks + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | + | 0 | TRADING_MODE_OPENING_AUCTION | AUCTION_TRIGGER_OPENING | 2400 | 3000 | 0 | + + #0068-MATC-084: GFN order rejected + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | expires in | error | + | party1 | BTC/ETH | buy | 4 | 8 | 0 | TYPE_LIMIT | TIF_GTC | party-order5 | | | + | party1 | BTC/ETH | buy | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | party-order3 | | | + | party2 | BTC/ETH | sell | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | party-order4 | | | + | party2 | BTC/ETH | sell | 6 | 24 | 0 | TYPE_LIMIT | TIF_GTC | party-order6 | | | + + When the network moves ahead "2" blocks + + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 15 | 1 | party2 | + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | horizon | min bound | max bound | + | 15 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 36000 | 14 | 17 | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | expires in | error | + | party1 | BTC/ETH | buy | 1 | 8 | 0 | TYPE_LIMIT | TIF_GFN | party1-GFN | | | + | party1 | BTC/ETH | buy | 1 | 8 | 0 | TYPE_LIMIT | TIF_GTT | party1-GTT | 10 | | + + #trigger auction + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 13 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 13 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | + | 15 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | + + #0068-MATC-084: GFN order rejected + #0068-MATC-085: GTT order stays ACTIVE + Then the orders should have the following status: + | party | reference | status | + | party1 | party1-GFN | STATUS_CANCELLED | + | party1 | party1-GTT | STATUS_ACTIVE | + + #0068-MATC-080: orders are placed into the book and no matching takes place. + #0068-MATC-081: post only orders are placed into the book and no matching takes place. + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | only | + | party1 | BTC/ETH | buy | 1 | 15 | 0 | TYPE_LIMIT | TIF_GFA | party1-GFA | | + | party1 | BTC/ETH | buy | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | | | + | party1 | BTC/ETH | sell | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | | | + | party1 | BTC/ETH | buy | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | | post | + | party2 | BTC/ETH | sell | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | | post | + + And the parties place the following pegged orders: + | party | market id | side | volume | pegged reference | offset | reference | + | lp1 | BTC/ETH | buy | 2 | BID | 3 | lp1-peg-b | + | lp1 | BTC/ETH | sell | 2 | ASK | 3 | lp1-peg-s | + + #0068-MATC-083: pegged order is parked during auction + Then the orders should have the following status: + | party | reference | status | + | lp1 | lp1-peg-b | STATUS_PARKED | + | lp1 | lp1-peg-s | STATUS_PARKED | + | party1 | party1-GFA | STATUS_ACTIVE | + + When the parties cancel the following orders: + | party | reference | + | lp1 | lp1-peg-b | + | party1 | party1-GFA | + Then the orders should have the following status: + | party | reference | status | + | lp1 | lp1-peg-b | STATUS_CANCELLED | + | lp1 | lp1-peg-s | STATUS_PARKED | + | party1 | party1-GFA | STATUS_CANCELLED | diff --git a/core/integration/features/spot/orders/0068-MATC-061.feature b/core/integration/features/spot/orders/0068-MATC-061.feature new file mode 100644 index 0000000000..e067dcabaf --- /dev/null +++ b/core/integration/features/spot/orders/0068-MATC-061.feature @@ -0,0 +1,146 @@ +Feature: Spot market order tests. Covers 0068-MATC-061, 0068-MATC-062, 0068-MATC-063, 0068-MATC-064, 0068-MATC-065. + + 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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600 | 0.999 | 10 | + + 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 | 998 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party5 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party5 | BTC/ETH | sell | 1 | 1050 | 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: 0068-MATC-061: Incoming MARKET orders will be matched against the opposite side of the book. + + # set up the book with some volume the market order will uncross with + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p1-ioc-pas | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party5 | BTC/ETH | sell | 2 | 0 | 1 | TYPE_MARKET | TIF_IOC | p5-ioc-agg | + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 2 | party5 | + And the orders should have the following status: + | party | reference | status | + | party1 | p1-ioc-pas | STATUS_ACTIVE | + | party5 | p5-ioc-agg | STATUS_FILLED | + + When the network moves ahead "1" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + 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 | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 959 | 1042 | 0 | 0 | 0 | + + Scenario: 0068-MATC-062: If not enough volume is available to fully fill the order, the remaining will be cancelled. + # set up the book with some volume the market order will partially uncross with + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 2 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p1-ioc-pas | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party5 | BTC/ETH | sell | 5 | 0 | 2 | TYPE_MARKET | TIF_IOC | p5-ioc-agg | + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 2 | party5 | + | party1 | 998 | 1 | party5 | + # filled the order of party 1, the remainder of p5's order is marked as partially filled. + And the orders should have the following status: + | party | reference | status | + | party1 | p1-ioc-pas | STATUS_FILLED | + | party5 | p5-ioc-agg | STATUS_PARTIALLY_FILLED | + + # To ensure the order is cancelled (meaning in a final state) let's ensure we can't amend the order: + When the parties amend the following orders: + | party | reference | tif | size delta | error | + | party5 | p5-ioc-agg | TIF_IOC | -1 | OrderError: Invalid Order ID | + + When the network moves ahead "1" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + 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 | + | 998 | TRADING_MODE_CONTINUOUS | 3600 | 959 | 1042 | 0 | 0 | 0 | + + Scenario: 0068-MATC-064: If there is no match the order will be cancelled. (0068-MATC-063: Incoming LIMIT orders will be matched against the opposite side of the book) + # set up the book with some volume the market order will uncross with + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party5 | BTC/ETH | sell | 2 | 1000 | 0 | TYPE_LIMIT | TIF_IOC | p5-ioc-agg | + Then the orders should have the following status: + | party | reference | status | + | party5 | p5-ioc-agg | STATUS_STOPPED | + + When the network moves ahead "1" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + 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 | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 959 | 1042 | 0 | 0 | 0 | + + Scenario: 0068-MATC-065: If there is a partial match then the remaining will be cancelled. (0068-MATC-063: Incoming LIMIT orders will be matched against the opposite side of the book) + # set up the book with some volume the limit order will partially uncross with + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 2 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p1-ioc-pas | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party5 | BTC/ETH | sell | 5 | 1000 | 1 | TYPE_LIMIT | TIF_IOC | p5-ioc-agg | + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 2 | party5 | + # filled the order of party 1, the remainder of p5's order is marked as partially filled. + And the orders should have the following status: + | party | reference | status | + | party1 | p1-ioc-pas | STATUS_FILLED | + | party5 | p5-ioc-agg | STATUS_PARTIALLY_FILLED | + + # To ensure the order is cancelled (meaning in a final state) let's ensure we can't amend the order: + When the parties amend the following orders: + | party | reference | tif | size delta | error | + | party5 | p5-ioc-agg | TIF_IOC | -1 | OrderError: Invalid Order ID | + + When the network moves ahead "1" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + 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 | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 959 | 1042 | 0 | 0 | 0 | diff --git a/core/integration/features/spot/orders/0068-MATC-068.feature b/core/integration/features/spot/orders/0068-MATC-068.feature new file mode 100644 index 0000000000..ae40af20fd --- /dev/null +++ b/core/integration/features/spot/orders/0068-MATC-068.feature @@ -0,0 +1,74 @@ +Feature: Spot market FOK limit and market order + + Background: + + 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 | 0 | + | BTC | 0 | + + 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 | + 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 | 0 | 0 | default-basic | + + # setup accounts + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 40000 | + | party2 | ETH | 10000 | + | party3 | ETH | 10000 | + | party4 | BTC | 900 | + | party5 | BTC | 900 | + 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" + + Scenario: test FOK limit order and market order (0068-MATC-067, 0068-MATC-068, 0068-MATC-069) + + # Place a buy order + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | party1 | BTC/ETH | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | buy1 | | + | party5 | BTC/ETH | sell | 5 | 1000 | 1 | TYPE_MARKET | TIF_FOK | sell1 | | + | party5 | BTC/ETH | sell | 15 | 1000 | 0 | TYPE_MARKET | TIF_FOK | sell2 | | + | party4 | BTC/ETH | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_FOK | sell3 | | + | party4 | BTC/ETH | sell | 6 | 1000 | 0 | TYPE_LIMIT | TIF_FOK | sell4 | | + + And "party5" should have general account balance of "894" for asset "BTC" + And "party5" should have holding account balance of "0" for asset "BTC" + And "party4" should have general account balance of "899" for asset "BTC" + + #0068-MATC-067,Incoming MARKET orders will be matched fully if the volume is available, otherwise the order is cancelled. + #0068-MATC-068,Incoming FOK limit order will be fully matched if possible to the other side of the book + #0068-MATC-069,for incoming FOK limit order, if a complete fill is not possible the order is stopped without trading at all. + Then the orders should have the following status: + | party | reference | status | + | party1 | buy1 | STATUS_ACTIVE | + | party5 | sell1 | STATUS_FILLED | + | party5 | sell2 | STATUS_STOPPED | + | party4 | sell3 | STATUS_FILLED | + | party4 | sell4 | STATUS_STOPPED | + + And "party4" should have general account balance of "899" for asset "BTC" + And "party5" should have general account balance of "894" for asset "BTC" diff --git a/core/integration/features/spot/orders/0068-MATC-073.feature b/core/integration/features/spot/orders/0068-MATC-073.feature new file mode 100644 index 0000000000..6b9a534819 --- /dev/null +++ b/core/integration/features/spot/orders/0068-MATC-073.feature @@ -0,0 +1,74 @@ +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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 30 | 0.999 | 10 | + | 60 | 0.999 | 10 | + + 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 | 998 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party5 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party5 | BTC/ETH | sell | 1 | 1002 | 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: For Good 'Til Time (GTT) / Good 'Till Cancelled (GTC) / Good For Normal (GFN) orders: + Incoming LIMIT: POST-ONLY TRUE orders will be placed fully on the book if no orders currently cross. (0068-MATC-073) + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | expires in | reference | only | + | party1 | BTC/ETH | buy | 1 | 999 | 0 | TYPE_LIMIT | TIF_GTT | 3600 | buy-gtt | post | + | party1 | BTC/ETH | buy | 1 | 999 | 0 | TYPE_LIMIT | TIF_GTC | | buy-gtc | post | + | party1 | BTC/ETH | buy | 1 | 999 | 0 | TYPE_LIMIT | TIF_GFN | | buy-gfn | post | + | party5 | BTC/ETH | sell | 1 | 1001 | 0 | TYPE_LIMIT | TIF_GTT | 3600 | sell-gtt | post | + | party5 | BTC/ETH | sell | 1 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | | sell-gtc | post | + | party5 | BTC/ETH | sell | 1 | 1001 | 0 | TYPE_LIMIT | TIF_GFN | | sell-gfn | post | + + Then the orders should have the following status: + | party | reference | status | + | party1 | buy-gtt | STATUS_ACTIVE | + | party1 | buy-gtc | STATUS_ACTIVE | + | party1 | buy-gfn | STATUS_ACTIVE | + | party5 | sell-gtt | STATUS_ACTIVE | + | party5 | sell-gtc | STATUS_ACTIVE | + | party5 | sell-gfn | STATUS_ACTIVE | + diff --git a/core/integration/features/spot/orders/0068-MATC-074.feature b/core/integration/features/spot/orders/0068-MATC-074.feature new file mode 100644 index 0000000000..04c533746f --- /dev/null +++ b/core/integration/features/spot/orders/0068-MATC-074.feature @@ -0,0 +1,75 @@ +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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 30 | 0.999 | 10 | + | 60 | 0.999 | 10 | + + 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 | 998 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party5 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party5 | BTC/ETH | sell | 1 | 1002 | 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: For Good 'Til Time (GTT) / Good 'Till Cancelled (GTC) / Good For Normal (GFN) orders: + Incoming LIMIT: POST-ONLY TRUE An order which totally crosses with an existing order on + the book will be STOPPED in full with none executed. (0068-MATC-074) + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | expires in | reference | only | error | + | party1 | BTC/ETH | buy | 1 | 1002 | 0 | TYPE_LIMIT | TIF_GTT | 3600 | buy-gtt | post | OrderError: post only order would trade | + | party1 | BTC/ETH | buy | 1 | 1002 | 0 | TYPE_LIMIT | TIF_GTC | | buy-gtc | post | OrderError: post only order would trade | + | party1 | BTC/ETH | buy | 1 | 1002 | 0 | TYPE_LIMIT | TIF_GFN | | buy-gfn | post | OrderError: post only order would trade | + | party5 | BTC/ETH | sell | 1 | 998 | 0 | TYPE_LIMIT | TIF_GTT | 3600 | sell-gtt | post | OrderError: post only order would trade | + | party5 | BTC/ETH | sell | 1 | 998 | 0 | TYPE_LIMIT | TIF_GTC | | sell-gtc | post | OrderError: post only order would trade | + | party5 | BTC/ETH | sell | 1 | 998 | 0 | TYPE_LIMIT | TIF_GFN | | sell-gfn | post | OrderError: post only order would trade | + + Then the orders should have the following status: + | party | reference | status | + | party1 | buy-gtt | STATUS_STOPPED | + | party1 | buy-gtc | STATUS_STOPPED | + | party1 | buy-gfn | STATUS_STOPPED | + | party5 | sell-gtt | STATUS_STOPPED | + | party5 | sell-gtc | STATUS_STOPPED | + | party5 | sell-gfn | STATUS_STOPPED | + diff --git a/core/integration/features/spot/orders/0068-MATC-075.feature b/core/integration/features/spot/orders/0068-MATC-075.feature new file mode 100644 index 0000000000..62b6150de0 --- /dev/null +++ b/core/integration/features/spot/orders/0068-MATC-075.feature @@ -0,0 +1,84 @@ +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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 30 | 0.999 | 10 | + | 60 | 0.999 | 10 | + + 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 | 998 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party5 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party5 | BTC/ETH | sell | 1 | 1002 | 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: For Good 'Til Time (GTT) / Good 'Till Cancelled (GTC) / Good For Normal (GFN) orders: + Incoming LIMIT: POST-ONLY TRUE An order partially crossing with an existing order on + the book will be STOPPED in full with none executed. (0068-MATC-075) + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | expires in | reference | only | error | + | party1 | BTC/ETH | buy | 2 | 1002 | 0 | TYPE_LIMIT | TIF_GTT | 3600 | buy-gtt | post | OrderError: post only order would trade | + | party1 | BTC/ETH | buy | 2 | 1002 | 0 | TYPE_LIMIT | TIF_GTC | | buy-gtc | post | OrderError: post only order would trade | + | party1 | BTC/ETH | buy | 2 | 1002 | 0 | TYPE_LIMIT | TIF_GFN | | buy-gfn | post | OrderError: post only order would trade | + | party5 | BTC/ETH | sell | 2 | 998 | 0 | TYPE_LIMIT | TIF_GTT | 3600 | sell-gtt | post | OrderError: post only order would trade | + | party5 | BTC/ETH | sell | 2 | 998 | 0 | TYPE_LIMIT | TIF_GTC | | sell-gtc | post | OrderError: post only order would trade | + | party5 | BTC/ETH | sell | 2 | 998 | 0 | TYPE_LIMIT | TIF_GFN | | sell-gfn | post | OrderError: post only order would trade | + + Then the orders should have the following states: + | party | market id | side | volume | remaining | price | status | reference | + | party1 | BTC/ETH | buy | 2 | 2 | 1002 | STATUS_STOPPED | buy-gtt | + | party1 | BTC/ETH | buy | 2 | 2 | 1002 | STATUS_STOPPED | buy-gtc | + | party1 | BTC/ETH | buy | 2 | 2 | 1002 | STATUS_STOPPED | buy-gfn | + | party5 | BTC/ETH | sell | 2 | 2 | 998 | STATUS_STOPPED | sell-gtt | + | party5 | BTC/ETH | sell | 2 | 2 | 998 | STATUS_STOPPED | sell-gtc | + | party5 | BTC/ETH | sell | 2 | 2 | 998 | STATUS_STOPPED | sell-gfn | + + Then the orders should have the following status: + | party | reference | status | + | party1 | buy-gtt | STATUS_STOPPED | + | party1 | buy-gtc | STATUS_STOPPED | + | party1 | buy-gfn | STATUS_STOPPED | + | party5 | sell-gtt | STATUS_STOPPED | + | party5 | sell-gtc | STATUS_STOPPED | + | party5 | sell-gfn | STATUS_STOPPED | + diff --git a/core/integration/features/spot/orders/0068-MATC-076.feature b/core/integration/features/spot/orders/0068-MATC-076.feature new file mode 100644 index 0000000000..0d859b7e94 --- /dev/null +++ b/core/integration/features/spot/orders/0068-MATC-076.feature @@ -0,0 +1,103 @@ +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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600 | 0.999 | 10 | + + 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 | 998 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party5 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party5 | BTC/ETH | sell | 1 | 1050 | 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: For Good 'Til Time (GTT) orders: + A market will enter auction if the mark price moves by a larger amount than the price monitoring settings allow. (0068-MATC-076) + + 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 | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 959 | 1042 | 0 | 0 | 0 | + + # Place a GTT order that is outside the price bounds + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | expires in | reference | + | party1 | BTC/ETH | buy | 1 | 1050 | 0 | TYPE_LIMIT | TIF_GTT | 3600 | buy-gtt | + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + + When the network moves ahead "11" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "1050" for the market "BTC/ETH" + + + Scenario: For Good 'Till Cancelled (GTC) orders: + A market will enter auction if the mark price moves by a larger amount than the price monitoring settings allow. (0068-MATC-076) + + 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 | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 959 | 1042 | 0 | 0 | 0 | + + # Place a GTC order that is outside 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 | 1050 | 0 | TYPE_LIMIT | TIF_GTC | buy-gtc | + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + + When the network moves ahead "11" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "1050" for the market "BTC/ETH" + + + Scenario: For Good For Normal (GFN) orders: + A market will enter auction if the mark price moves by a larger amount than the price monitoring settings allow. (0068-MATC-076) + + 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 | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 959 | 1042 | 0 | 0 | 0 | + + # Place a GFN order that is outside the price bounds, this will be treated as a non persistent order and will be rejected + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | party1 | BTC/ETH | buy | 1 | 1050 | 0 | TYPE_LIMIT | TIF_GFN | buy-gfn | OrderError: non-persistent order trades out of price bounds | + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + + diff --git a/core/integration/features/spot/orders/0068-MATC-077.feature b/core/integration/features/spot/orders/0068-MATC-077.feature new file mode 100644 index 0000000000..127d641d2a --- /dev/null +++ b/core/integration/features/spot/orders/0068-MATC-077.feature @@ -0,0 +1,110 @@ +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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600 | 0.999 | 10 | + + 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 | + | party2 | BTC | 1000 | + | party5 | ETH | 10000 | + | 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_GTC | + | 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" + + 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 | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 959 | 1042 | 0 | 0 | 0 | + + Scenario: For Good 'Til Time (GTT) orders: All attempts to self trade are prevented and the aggressive + side is STOPPED even if partially filled. The passive side is left untouched. (0068-MATC-077) + + # Place some orders and try to self trade + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | expires in | reference | + | party2 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | sell-gtc1 | + | party1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | sell-gtc2 | + | party2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTT | 3600 | buy-gtt1 | + | party1 | BTC/ETH | buy | 2 | 1000 | 1 | TYPE_LIMIT | TIF_GTT | 3600 | buy-gtt2 | + + Then the orders should have the following status: + | party | reference | status | + | party2 | sell-gtc1 | STATUS_FILLED | + | party1 | sell-gtc2 | STATUS_ACTIVE | + | party2 | buy-gtt1 | STATUS_STOPPED | + | party1 | buy-gtt2 | STATUS_PARTIALLY_FILLED | + + + Scenario: For Good 'Till Cancelled (GTC) orders: All attempts to self trade are prevented and the aggressive + side is STOPPED even if partially filled. The passive side is left untouched. (0068-MATC-077) + + # Place some orders and try to self trade + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | sell-gtc1 | + | party1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | sell-gtc2 | + | party2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | buy-gtc1 | + | party1 | BTC/ETH | buy | 2 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | buy-gtc2 | + + Then the orders should have the following status: + | party | reference | status | + | party2 | sell-gtc1 | STATUS_FILLED | + | party1 | sell-gtc2 | STATUS_ACTIVE | + | party2 | buy-gtc1 | STATUS_STOPPED | + | party1 | buy-gtc2 | STATUS_PARTIALLY_FILLED | + + + Scenario: For Good For Normal (GFN) orders: All attempts to self trade are prevented and the aggressive + side is STOPPED even if partially filled. The passive side is left untouched. (0068-MATC-077) + + # Place some orders and try to self trade + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | sell-gtc1 | + | party1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | sell-gtc2 | + | party2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GFN | buy-gfn1 | + | party1 | BTC/ETH | buy | 2 | 1000 | 1 | TYPE_LIMIT | TIF_GFN | buy-gfn2 | + + Then the orders should have the following status: + | party | reference | status | + | party2 | sell-gtc1 | STATUS_FILLED | + | party1 | sell-gtc2 | STATUS_ACTIVE | + | party2 | buy-gfn1 | STATUS_STOPPED | + | party1 | buy-gfn2 | STATUS_PARTIALLY_FILLED | diff --git a/core/integration/features/spot/orders/0068-MATC-078.feature b/core/integration/features/spot/orders/0068-MATC-078.feature new file mode 100644 index 0000000000..55485ed1d9 --- /dev/null +++ b/core/integration/features/spot/orders/0068-MATC-078.feature @@ -0,0 +1,102 @@ +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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600 | 0.999 | 10 | + + 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 | + | party2 | BTC | 1000 | + | party5 | ETH | 10000 | + | party5 | BTC | 1000 | + And the average block duration is "1" + + Scenario: In auction IOC/FOK/GFN Incoming orders have their status set to REJECTED and are not processed further. (0068-MATC-078) + + # Place some orders while in opening auction to make sure they are rejected + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | error | reference | + | party1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_IOC | ioc order received during auction trading | sell1 | + | party1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_FOK | fok order received during auction trading | sell2 | + | party1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GFN | gfn order received during auction trading | sell3 | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_IOC | ioc order received during auction trading | buy1 | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_FOK | fok order received during auction trading | buy2 | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GFN | gfn order received during auction trading | buy3 | + + And the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | party1 | BTC/ETH | sell1 | sell | 1 | 1 | 1000 | STATUS_REJECTED | + | party1 | BTC/ETH | sell2 | sell | 1 | 1 | 1000 | STATUS_REJECTED | + | party1 | BTC/ETH | sell3 | sell | 1 | 1 | 1000 | STATUS_REJECTED | + | party1 | BTC/ETH | buy1 | buy | 1 | 1 | 1000 | STATUS_REJECTED | + | party1 | BTC/ETH | buy2 | buy | 1 | 1 | 1000 | STATUS_REJECTED | + | party1 | BTC/ETH | buy3 | buy | 1 | 1 | 1000 | STATUS_REJECTED | + + # 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_GTC | + | 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" + + 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 | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 959 | 1042 | 0 | 0 | 0 | + + # Now move into a price auction so we can test all the orders again + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 1050 | 0 | TYPE_LIMIT | TIF_GTC | + | party5 | BTC/ETH | sell | 1 | 1050 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + + # Place some orders while in price monitoring auction to make sure they are rejected + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | error | reference | + | party1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_IOC | ioc order received during auction trading | sell4 | + | party1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_FOK | fok order received during auction trading | sell5 | + | party1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GFN | gfn order received during auction trading | sell6 | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_IOC | ioc order received during auction trading | buy4 | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_FOK | fok order received during auction trading | buy5 | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GFN | gfn order received during auction trading | buy6 | + + And the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | party1 | BTC/ETH | sell4 | sell | 1 | 1 | 1000 | STATUS_REJECTED | + | party1 | BTC/ETH | sell5 | sell | 1 | 1 | 1000 | STATUS_REJECTED | + | party1 | BTC/ETH | sell6 | sell | 1 | 1 | 1000 | STATUS_REJECTED | + | party1 | BTC/ETH | buy4 | buy | 1 | 1 | 1000 | STATUS_REJECTED | + | party1 | BTC/ETH | buy5 | buy | 1 | 1 | 1000 | STATUS_REJECTED | + | party1 | BTC/ETH | buy6 | buy | 1 | 1 | 1000 | STATUS_REJECTED | diff --git a/core/integration/features/spot/orders/0068-MATC-079.feature b/core/integration/features/spot/orders/0068-MATC-079.feature new file mode 100644 index 0000000000..fc5f196cb6 --- /dev/null +++ b/core/integration/features/spot/orders/0068-MATC-079.feature @@ -0,0 +1,94 @@ +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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600 | 0.999 | 10 | + + 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 | + | party2 | BTC | 1000 | + | party5 | ETH | 10000 | + | party5 | BTC | 1000 | + And the average block duration is "1" + + Scenario: In auction GTC/GTT All MARKET orders are rejected. For product spot: (0068-MATC-079) + + # Place some orders that are invalid in the opening auction + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | expires in | reference | error | + | party1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_MARKET | TIF_GTC | | sell1 | OrderError: Invalid Persistence | + | party1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_MARKET | TIF_GTT | 3600 | sell2 | OrderError: Invalid Expiration Datetime | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_MARKET | TIF_GTC | | buy1 | OrderError: Invalid Persistence | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_MARKET | TIF_GTT | 3600 | buy2 | OrderError: Invalid Expiration Datetime | + + Then the orders should have the following status: + | party | reference | status | + | party1 | sell1 | STATUS_REJECTED | + | party1 | sell2 | STATUS_REJECTED | + | party1 | buy1 | STATUS_REJECTED | + | party1 | buy2 | STATUS_REJECTED | + + # 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_GTC | + | 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" + + 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 | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 959 | 1042 | 0 | 0 | 0 | + + # Now get into a price monitoring auction + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | BTC/ETH | sell | 1 | 1050 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 1 | 1050 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + + # Place some orders that are invalid in the price monitoring auction + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | expires in | reference | error | + | party1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_MARKET | TIF_GTC | | sell3 | OrderError: Invalid Persistence | + | party1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_MARKET | TIF_GTT | 3600 | sell4 | OrderError: Invalid Expiration Datetime | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_MARKET | TIF_GTC | | buy3 | OrderError: Invalid Persistence | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_MARKET | TIF_GTT | 3600 | buy4 | OrderError: Invalid Expiration Datetime | + + Then the orders should have the following status: + | party | reference | status | + | party1 | sell3 | STATUS_REJECTED | + | party1 | sell4 | STATUS_REJECTED | + | party1 | buy3 | STATUS_REJECTED | + | party1 | buy4 | STATUS_REJECTED | diff --git a/core/integration/features/spot/orders/0074-BTCH-012.feature b/core/integration/features/spot/orders/0074-BTCH-012.feature new file mode 100644 index 0000000000..8b0cb6aac7 --- /dev/null +++ b/core/integration/features/spot/orders/0074-BTCH-012.feature @@ -0,0 +1,85 @@ +Feature: Testing batch orders in spot markets + + 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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600 | 0.999 | 10 | + + 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 | + | party2 | ETH | 10000 | + | party4 | BTC | 100 | + | party5 | BTC | 100 | + 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_GTC | + | 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" + + 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 | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 959 | 1042 | 0 | 0 | 0 | + + Scenario: Given a market with a party having two orders, A and B, a batch transaction to cancel A, amend B to B' + and place a limit order which does not immediately execute C should result in a market with orders + B' and C. (0074-BTCH-012) + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | order-a | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | order-b | + + Then the party "party1" starts a batch instruction + + Then the party "party1" adds the following cancels to a batch: + | market id | reference | + | BTC/ETH | order-a | + + Then the party "party1" adds the following amends to a batch: + | market id | reference | price | size delta | tif | + | BTC/ETH | order-b | 1001 | 1 | TIF_GTC | + + Then the party "party1" submits their batch instruction + + When the network moves ahead "1" blocks + + # Both orders rest on the book in the auction instead of crossing + Then the orders should have the following states: + | party | market id | side | price | remaining | volume | reference | status | + | party1 | BTC/ETH | buy | 1000 | 1 | 1 | order-a | STATUS_CANCELLED | + | party1 | BTC/ETH | buy | 1001 | 2 | 2 | order-b | STATUS_ACTIVE | + + + + diff --git a/core/integration/features/spot/orders/0074-BTCH-015.feature b/core/integration/features/spot/orders/0074-BTCH-015.feature new file mode 100644 index 0000000000..0227044199 --- /dev/null +++ b/core/integration/features/spot/orders/0074-BTCH-015.feature @@ -0,0 +1,78 @@ +Feature: If an instruction causes the market to enter a Price Monitoring Auction the market should enter the auction immediately + before continuing with later instructions. (0074-BTCH-015) + + 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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600 | 0.999 | 10 | + + 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 | + | party2 | ETH | 10000 | + | party4 | BTC | 100 | + | party5 | BTC | 100 | + 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_GTC | + | party5 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party5 | BTC/ETH | sell | 2 | 1050 | 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" + + 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 | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 959 | 1042 | 0 | 0 | 0 | + + Scenario: Placing an order outside of price bands will force the market to go into auction before the order is traded. + All other orders after the out of bounds order will be placed in the auction. + + Then the party "party1" starts a batch instruction + Then the party "party1" adds the following orders to a batch: + | market id | side | volume | price | type | tif | reference | + | BTC/ETH | buy | 1 | 1050 | TYPE_LIMIT | TIF_GTC | p1-buy1 | + | BTC/ETH | buy | 1 | 1060 | TYPE_LIMIT | TIF_GTC | p1-buy2 | + Then the party "party1" submits their batch instruction + When the network moves ahead "1" blocks + + # `p1-buy1` forced us into an auction + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + + # Both orders rest on the book in the auction instead of crossing + Then the orders should have the following states: + | party | market id | side | price | remaining | volume | reference | status | + | party1 | BTC/ETH | buy | 1050 | 1 | 1 | p1-buy1 | STATUS_ACTIVE | + | party1 | BTC/ETH | buy | 1060 | 1 | 1 | p1-buy2 | STATUS_ACTIVE | + + + + diff --git a/core/integration/features/spot/orders/0074-BTCH-016.feature b/core/integration/features/spot/orders/0074-BTCH-016.feature new file mode 100644 index 0000000000..b21feffbf0 --- /dev/null +++ b/core/integration/features/spot/orders/0074-BTCH-016.feature @@ -0,0 +1,88 @@ +Feature: An instruction which is valid at the start of the batch execution but becomes invalid before it is executed should fail. (0074-BTCH-016) + 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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600 | 0.999 | 10 | + + 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 | + | party2 | ETH | 10000 | + | party4 | BTC | 100 | + | party5 | BTC | 100 | + 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_GTC | + | 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" + + 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 | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 959 | 1042 | 0 | 0 | 0 | + + Scenario: A batch consisting of two limit order placements p1-buy1 and pl-buy2 where the party has enough balance to place + either of them individually but not both should place C1 but reject C2. + + Then the party "party1" starts a batch instruction + Then the party "party1" adds the following orders to a batch: + | market id | side | volume | price | type | tif | reference | error | + | BTC/ETH | buy | 500 | 1000 | TYPE_LIMIT | TIF_GTC | p1-buy1 | | + | BTC/ETH | buy | 500 | 1000 | TYPE_LIMIT | TIF_GTC | p1-buy2 | | + Then the party "party1" submits their batch instruction with error "party does not have sufficient balance to cover the trade and fees" + When the network moves ahead "1" blocks + + Then the orders should have the following states: + | party | market id | side | price | remaining | volume | reference | status | + | party1 | BTC/ETH | buy | 1000 | 500 | 500 | p1-buy1 | STATUS_ACTIVE | + + + Scenario: A batch transaction containing aggressive limit order C1 which moves the market into price monitoring auction + and a C2 which is marked GFN (good for normal) should execute C1 but reject C2. + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | BTC/ETH | sell | 1 | 1050 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the party "party1" starts a batch instruction + Then the party "party1" adds the following orders to a batch: + | market id | side | volume | price | type | tif | reference | error | + | BTC/ETH | buy | 1 | 1050 | TYPE_LIMIT | TIF_GTC | p1-buy1 | | + | BTC/ETH | buy | 1 | 1000 | TYPE_LIMIT | TIF_GFN | p1-buy2 | | + Then the party "party1" submits their batch instruction with error "gfn order received during auction trading" + When the network moves ahead "1" blocks + + # Both orders rest on the book in the auction instead of crossing + Then the orders should have the following states: + | party | market id | side | price | remaining | volume | reference | status | + | party1 | BTC/ETH | buy | 1050 | 1 | 1 | p1-buy1 | STATUS_ACTIVE | + diff --git a/core/integration/features/spot/orders/0074-BTCH-019.feature b/core/integration/features/spot/orders/0074-BTCH-019.feature new file mode 100644 index 0000000000..7f6004280d --- /dev/null +++ b/core/integration/features/spot/orders/0074-BTCH-019.feature @@ -0,0 +1,109 @@ +Feature: Testing batch orders in spot markets + + 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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600 | 0.999 | 10 | + + 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 | + | party2 | ETH | 10000 | + | party4 | BTC | 100 | + | party5 | BTC | 100 | + 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_GTC | + | 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" + + 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 | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 959 | 1042 | 0 | 0 | 0 | + + @OrdCan + Scenario: Funds released by cancellations or amendments within the batch should be immediately available + for later instructions (0074-BTCH-019) + + # Try to place 3 orders, the third one should fail due to not having enough ETH to put into the holding account + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | party1 | BTC/ETH | buy | 400 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | order-a | | + | party1 | BTC/ETH | buy | 400 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | order-b | | + | party1 | BTC/ETH | buy | 400 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | order-c | party does not have sufficient balance to cover the trade and fees | + + Then "party1" should have holding account balance of "8000" for asset "ETH" + Then the orders should have the following states: + | party | market id | side | price | remaining | volume | reference | status | + | party1 | BTC/ETH | buy | 1000 | 400 | 400 | order-a | STATUS_ACTIVE | + | party1 | BTC/ETH | buy | 1000 | 400 | 400 | order-b | STATUS_ACTIVE | + + # If I cancel an existing order and place a new one of the same size it should work + Then the party "party1" starts a batch instruction + Then the party "party1" adds the following cancels to a batch: + | market id | reference | + | BTC/ETH | order-a | + Then the party "party1" adds the following orders to a batch: + | market id | side | volume | price | type | tif | reference | + | BTC/ETH | buy | 400 | 1000 | TYPE_LIMIT | TIF_GTC | order-d | + Then the party "party1" submits their batch instruction + + Then "party1" should have holding account balance of "8000" for asset "ETH" + Then the orders should have the following states: + | party | market id | side | price | remaining | volume | reference | status | + | party1 | BTC/ETH | buy | 1000 | 400 | 400 | order-a | STATUS_CANCELLED | + | party1 | BTC/ETH | buy | 1000 | 400 | 400 | order-b | STATUS_ACTIVE | + | party1 | BTC/ETH | buy | 1000 | 400 | 400 | order-d | STATUS_ACTIVE | + + # If we amend an order to size 1, we should be able to place an order of 400 successfully. + Then the party "party1" starts a batch instruction + Then the party "party1" adds the following amends to a batch: + | market id | reference | price | size delta | tif | + | BTC/ETH | order-b | 1000 | -399 | TIF_GTC | + + Then the party "party1" adds the following orders to a batch: + | market id | side | volume | price | type | tif | reference | + | BTC/ETH | buy | 400 | 1000 | TYPE_LIMIT | TIF_GTC | order-e | + Then the party "party1" submits their batch instruction + + Then "party1" should have holding account balance of "8010" for asset "ETH" + Then the orders should have the following states: + | party | market id | side | price | remaining | volume | reference | status | + | party1 | BTC/ETH | buy | 1000 | 400 | 400 | order-a | STATUS_CANCELLED | + | party1 | BTC/ETH | buy | 1000 | 1 | 1 | order-b | STATUS_ACTIVE | + | party1 | BTC/ETH | buy | 1000 | 400 | 400 | order-d | STATUS_ACTIVE | + | party1 | BTC/ETH | buy | 1000 | 400 | 400 | order-e | STATUS_ACTIVE | + + + + diff --git a/core/integration/features/spot/orders/0080-SPOT-024.feature b/core/integration/features/spot/orders/0080-SPOT-024.feature new file mode 100644 index 0000000000..787c4137f1 --- /dev/null +++ b/core/integration/features/spot/orders/0080-SPOT-024.feature @@ -0,0 +1,131 @@ +Feature: Spot market bug (from the incentive) replication + + Scenario: 0080-SPOT-024, 0080-SPOT-025 market orders should be rejected when traders do not have enough collateral to cover the trades in spot market + Background: + + Given the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 1s | + | market.value.windowLength | 1h | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.4 | + | validators.epoch.length | 4s | + + Given the following assets are registered: + | id | decimal places | + | USD | 0 | + | BTC | 0 | + + 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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 36000 | 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/USD | BTC/USD | BTC | USD | lognormal-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | 0 | 0 | default-basic | + + And the following network parameters are set: + | name | value | + | limits.markets.maxPeggedOrders | 2 | + | network.markPriceUpdateMaximumFrequency | 0s | + | market.liquidity.providersFeeCalculationTimeStep | 1s | + | validators.epoch.length | 58s | + | market.liquidity.stakeToCcyVolume | 1 | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | USD | 50000000 | + | party1 | BTC | 100 | + | party2 | USD | 1000 | + | party3 | USD | 1000 | + | party5 | USD | 70000 | + | party2 | BTC | 100 | + | party4 | BTC | 1 | + | lp | USD | 1000 | + | lp | BTC | 100 | + And the average block duration is "1" + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp | BTC/USD | 5 | 0.025 | submission | + + Then "party2" should have general account balance of "1000" for asset "USD" + Then "party2" should have general account balance of "100" for asset "BTC" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/USD | buy | 10 | 55000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/USD | buy | 3 | 58000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/USD | buy | 3 | 59000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/USD | buy | 1 | 60000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/USD | sell | 1 | 60000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/USD | sell | 3 | 61000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/USD | sell | 3 | 62000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/USD | sell | 4 | 63000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/USD | sell | 10 | 64000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/USD | sell | 5 | 65000 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the network moves ahead "2" blocks + + Then the market data for the market "BTC/USD" should be: + | mark price | trading mode | auction trigger | horizon | min bound | max bound | open interest | + | 60000 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 36000 | 52466 | 68503 | 0 | + + Then "party2" should have general account balance of "61000" for asset "USD" + Then "party2" should have general account balance of "74" for asset "BTC" + + Then "party2" should have holding account balance of "25" for asset "BTC" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | party3 | BTC/USD | buy | 20 | 0 | 0 | TYPE_MARKET | TIF_IOC | p3-b1 | insufficient funds for order | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | party4 | BTC/USD | sell | 10 | 0 | 0 | TYPE_MARKET | TIF_IOC | p4-s1 | party does not have sufficient balance to cover the trade and fees | + + Then the network moves ahead "1" blocks + + Then "party2" should have general account balance of "61000" for asset "USD" + Then "party2" should have general account balance of "74" for asset "BTC" + + Then "party2" should have holding account balance of "25" for asset "BTC" + + Then "party3" should have general account balance of "1000" for asset "USD" + Then "party4" should have general account balance of "1" for asset "BTC" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | party3 | BTC/USD | buy | 20 | 10 | 0 | TYPE_LIMIT | TIF_GTC | p3-b2 | | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | party4 | BTC/USD | sell | 1 | 66000 | 0 | TYPE_LIMIT | TIF_GTC | p4-s2 | | + + #0080-SPOT-026: amend order - order is amended such that would trade immediately and the party can't afford none/some of the trades + When the parties amend the following orders: + | party | reference | price | size delta | tif | error | + | party3 | p3-b2 | 66000 | -10 | TIF_GTC | party does not have sufficient balance to cover the trade and fees | + | party4 | p4-s2 | 59000 | 2 | TIF_GTC | party does not have sufficient balance to cover the new size | + + And the order book should have the following volumes for market "BTC/USD": + | side | price | volume | + | buy | 10 | 20 | + | sell | 66000 | 1 | + + #0080-SPOT-027:submit order - limit order, partly matched, party can't afford the trades + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | party3 | BTC/USD | buy | 6 | 61000 | 0 | TYPE_LIMIT | TIF_GTC | p3-b3 | party does not have sufficient balance to cover the trade and fees | + | party5 | BTC/USD | buy | 2 | 61000 | 0 | TYPE_LIMIT | TIF_GTC | p5-b1 | party does not have sufficient balance to cover the trade and fees | + + #0080-SPOT-028:submit order - limit order, no match, added to the book, party can't cover the amount that needs to be transfered to the holding + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | party4 | BTC/USD | sell | 2 | 67000 | 0 | TYPE_LIMIT | TIF_GTC | p4-s3 | party does not have sufficient balance to cover the trade and fees | + diff --git a/core/integration/features/spots/SpotFunctionalTests/TC-0014-Spot-MultipleParties.feature b/core/integration/features/spots/SpotFunctionalTests/TC-0014-Spot-MultipleParties.feature index 457f2387cd..e03e278a68 100644 --- a/core/integration/features/spots/SpotFunctionalTests/TC-0014-Spot-MultipleParties.feature +++ b/core/integration/features/spots/SpotFunctionalTests/TC-0014-Spot-MultipleParties.feature @@ -7,6 +7,10 @@ Feature: Spot order gets filled partially by 10 different parties Given the fees configuration named "fees-config-1": | maker fee | infrastructure fee | | 0.005 | 0.002 | + + 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 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 | @@ -15,10 +19,10 @@ Feature: Spot order gets filled partially by 10 different parties | 0.004 | 0.001 | And the price monitoring named "price-monitoring-1": | horizon | probability | auction extension | - | 1 | 0.9999999 | 3 | + | 36000 | 0.999 | 3 | And the spot markets: - | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | - | BTC/ETH | BTC/ETH | BTC | ETH | my-simple-risk-model | 1 | fees-config-1 | price-monitoring-1 | default-basic | + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lognormal-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | default-basic | # setup accounts Given the parties deposit on asset's general account the following amount: @@ -37,18 +41,19 @@ Feature: Spot order gets filled partially by 10 different parties # place orders and generate trades And the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | reference | - | party1 | BTC/ETH | buy | 1 | 20 | 0 | TYPE_LIMIT | TIF_GFA | party-order1 | - | party2 | BTC/ETH | sell | 1 | 30 | 0 | TYPE_LIMIT | TIF_GTC | party-order2 | - | party3 | BTC/ETH | buy | 5 | 10 | 0 | TYPE_LIMIT | TIF_GTC | party-order3 | | party4 | BTC/ETH | buy | 1 | 3 | 0 | TYPE_LIMIT | TIF_GTC | party-order4 | | party5 | BTC/ETH | buy | 1 | 5 | 0 | TYPE_LIMIT | TIF_GTC | party-order5 | | party6 | BTC/ETH | buy | 1 | 12 | 0 | TYPE_LIMIT | TIF_GTC | party-order6 | - | party7 | BTC/ETH | sell | 2 | 60 | 0 | TYPE_LIMIT | TIF_GTC | party-order7 | | party8 | BTC/ETH | buy | 5 | 10 | 0 | TYPE_LIMIT | TIF_GTC | party-order8 | - | party9 | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | party-order9 | - | party10 | BTC/ETH | sell | 5 | 200 | 0 | TYPE_LIMIT | TIF_GTC | party-order10 | + | party3 | BTC/ETH | buy | 5 | 10 | 0 | TYPE_LIMIT | TIF_GTC | party-order3 | | party1 | BTC/ETH | buy | 2 | 10 | 0 | TYPE_LIMIT | TIF_GTC | party-order11 | + | party1 | BTC/ETH | buy | 1 | 20 | 0 | TYPE_LIMIT | TIF_GFA | party-order1 | + | party2 | BTC/ETH | sell | 1 | 30 | 0 | TYPE_LIMIT | TIF_GTC | party-order2 | + | party7 | BTC/ETH | sell | 2 | 60 | 0 | TYPE_LIMIT | TIF_GTC | party-order7 | | party2 | BTC/ETH | sell | 1 | 90 | 0 | TYPE_LIMIT | TIF_GTC | party-order12 | + | party9 | BTC/ETH | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | party-order9 | + | party10 | BTC/ETH | sell | 5 | 200 | 0 | TYPE_LIMIT | TIF_GTC | party-order10 | + Then "party1" should have holding account balance of "40" for asset "ETH" Then "party2" should have holding account balance of "2" for asset "BTC" @@ -67,9 +72,13 @@ Feature: Spot order gets filled partially by 10 different parties And the opening auction period ends for market "BTC/ETH" And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | horizon | min bound | max bound | target stake | supplied stake | open interest | + | 15 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 36000 | 14 | 17 | 0 | 0 | 0 | Then "party1" should have holding account balance of "20" for asset "ETH" Then "party2" should have holding account balance of "1" for asset "BTC" + Then "party7" should have holding account balance of "2" for asset "BTC" And the following trades should be executed: | buyer | price | size | seller | @@ -79,12 +88,12 @@ Feature: Spot order gets filled partially by 10 different parties | party | reference | price | size delta | tif | | party2 | party-order12 | 10 | 0 | TIF_GTC | - And the following trades should be executed: - | buyer | price | size | seller | - | party1 | 15 | 1 | party2 | + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | + | 15 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | Then "party1" should have holding account balance of "21" for asset "ETH" - Then "party2" should have holding account balance of "0" for asset "BTC" + Then "party2" should have holding account balance of "1" for asset "BTC" Then "party3" should have holding account balance of "51" for asset "ETH" Then "party4" should have holding account balance of "4" for asset "ETH" Then "party5" should have holding account balance of "6" for asset "ETH" @@ -94,25 +103,33 @@ Feature: Spot order gets filled partially by 10 different parties Then "party9" should have holding account balance of "1" for asset "BTC" Then "party10" should have holding account balance of "5" for asset "BTC" + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | + | 15 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | + And the parties amend the following orders: | party | reference | price | size delta | tif | | party7 | party-order7 | 10 | 0 | TIF_GTC | - Then "party7" should have holding account balance of "3" for asset "BTC" - - # as we're amending sell orders the price change doesn't affect their ability to cover the trade, only the size matters, - And the parties amend the following orders: - | party | reference | price | size delta | tif | error | - | party10 | party-order10 | 10 | 5 | TIF_GTC | party does not have sufficient balance to cover the new size | - | party9 | party-order9 | 10 | 3 | TIF_GTC | party does not have sufficient balance to cover the new size | + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | + | 15 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | - Then "party1" should have holding account balance of "21" for asset "ETH" - Then "party2" should have holding account balance of "0" for asset "BTC" - Then "party3" should have holding account balance of "51" for asset "ETH" - Then "party4" should have holding account balance of "4" for asset "ETH" - Then "party5" should have holding account balance of "6" for asset "ETH" - Then "party6" should have holding account balance of "13" for asset "ETH" Then "party7" should have holding account balance of "3" for asset "BTC" - Then "party8" should have holding account balance of "51" for asset "ETH" - Then "party9" should have holding account balance of "1" for asset "BTC" - Then "party10" should have holding account balance of "5" for asset "BTC" \ No newline at end of file + +# as we're amending sell orders the price change doesn't affect their ability to cover the trade, only the size matters, +And the parties amend the following orders: + | party | reference | price | size delta | tif | error | + | party10 | party-order10 | 10 | 5 | TIF_GTC | party does not have sufficient balance to cover the new size | + | party9 | party-order9 | 10 | 3 | TIF_GTC | party does not have sufficient balance to cover the new size | + +Then "party1" should have holding account balance of "21" for asset "ETH" +Then "party2" should have holding account balance of "1" for asset "BTC" +Then "party3" should have holding account balance of "51" for asset "ETH" +Then "party4" should have holding account balance of "4" for asset "ETH" +Then "party5" should have holding account balance of "6" for asset "ETH" +Then "party6" should have holding account balance of "13" for asset "ETH" +Then "party7" should have holding account balance of "3" for asset "BTC" +Then "party8" should have holding account balance of "51" for asset "ETH" +Then "party9" should have holding account balance of "1" for asset "BTC" +Then "party10" should have holding account balance of "5" for asset "BTC" \ No newline at end of file diff --git a/core/integration/features/spots/opening-auction-expires.feature b/core/integration/features/spots/opening-auction-expires.feature index 8579086ff0..968063d3f3 100644 --- a/core/integration/features/spots/opening-auction-expires.feature +++ b/core/integration/features/spots/opening-auction-expires.feature @@ -18,26 +18,57 @@ Feature: Set up a spot market, with an opening auction, then uncross the book. M | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | | BTC/ETH | BTC/ETH | BTC | ETH | my-simple-risk-model | 5 | fees-config-1 | default-none | default-basic | - Scenario: Ensure spot markets get cancelled if they fail to leave opening auction + Scenario: 0043-MKTL-013 Ensure spot markets get cancelled if they fail to leave opening auction # setup accounts Given the parties deposit on asset's general account the following amount: - | party | asset | amount | - | party1 | ETH | 1000000000 | - | party2 | ETH | 1000000000 | - | party2 | BTC | 5 | + | party | asset | amount | + | party1 | ETH | 100000 | + | party2 | ETH | 100000 | + | party3 | ETH | 100000 | + | party2 | BTC | 5 | + Then the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | party3 | BTC/ETH | 3000 | 0.1 | submission | # place orders and generate trades When the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | reference | - | party2 | BTC/ETH | buy | 1 | 950000 | 0 | TYPE_LIMIT | TIF_GTC | t2-b-1 | - | party1 | BTC/ETH | buy | 1 | 1000000 | 0 | TYPE_LIMIT | TIF_GFA | t1-b-1 | + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | BTC/ETH | buy | 1 | 95 | 0 | TYPE_LIMIT | TIF_GTC | t2-b-1 | + | party1 | BTC/ETH | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GFA | t1-b-1 | + | party3 | BTC/ETH | buy | 1 | 110 | 0 | TYPE_LIMIT | TIF_GFA | t3-b-1 | - Then "party1" should have holding account balance of "1000000" for asset "ETH" + Then "party1" should have holding account balance of "100" for asset "ETH" + Then "party2" should have holding account balance of "95" for asset "ETH" + Then "party3" should have holding account balance of "110" for asset "ETH" When the network moves ahead "1" blocks Then the market data for the market "BTC/ETH" should be: | trading mode | | TRADING_MODE_OPENING_AUCTION | - When the network moves ahead "11" blocks + When the network moves ahead "9" blocks + Then the last market state should be "STATE_PENDING" for the market "BTC/ETH" + + When the network moves ahead "1" blocks Then the last market state should be "STATE_CANCELLED" for the market "BTC/ETH" + + #orders are cancelled + And the orders should have the following status: + | party | reference | status | + | party2 | t2-b-1 | STATUS_CANCELLED | + | party1 | t1-b-1 | STATUS_CANCELLED | + | party3 | t3-b-1 | STATUS_CANCELLED | + + #asset is released for party with orders and LP commitment + Then "party1" should have general account balance of "100000" for asset "ETH" + Then "party2" should have general account balance of "100000" for asset "ETH" + Then "party3" should have general account balance of "100000" for asset "ETH" + + # check transfers for asset releasing + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | party3 | party3 | ACCOUNT_TYPE_HOLDING | ACCOUNT_TYPE_GENERAL | | 110 | ETH | + | party2 | party2 | ACCOUNT_TYPE_HOLDING | ACCOUNT_TYPE_GENERAL | | 95 | ETH | + | party1 | party1 | ACCOUNT_TYPE_HOLDING | ACCOUNT_TYPE_GENERAL | | 100 | ETH | + | party3 | party3 | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_GENERAL | BTC/ETH | 3000 | ETH | + diff --git a/core/integration/features/teams/0083-RFPR-062.feature b/core/integration/features/teams/0083-RFPR-062.feature index 9595657fac..f956d6174f 100644 --- a/core/integration/features/teams/0083-RFPR-062.feature +++ b/core/integration/features/teams/0083-RFPR-062.feature @@ -109,6 +109,6 @@ Feature: Test allow lists, based on team_rewards.feature test in rewards set. | aux1 | ETH/USD-1-10 | sell | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | referee3 | ETH/USD-1-10 | buy | 5 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | When the network moves ahead "1" epochs - Then "referee1" should have vesting account balance of "3999" for asset "USD-1-10" - And "referee2" should have vesting account balance of "3000" for asset "USD-1-10" - And "referee3" should have vesting account balance of "3000" for asset "USD-1-10" + Then "referee1" should have vesting account balance of "5714" for asset "USD-1-10" + And "referee2" should have vesting account balance of "2142" for asset "USD-1-10" + And "referee3" should have vesting account balance of "2142" for asset "USD-1-10" diff --git a/core/integration/features/teams/0083-RFPR-063.feature b/core/integration/features/teams/0083-RFPR-063.feature index 992ec64139..549d8c44e8 100644 --- a/core/integration/features/teams/0083-RFPR-063.feature +++ b/core/integration/features/teams/0083-RFPR-063.feature @@ -108,9 +108,9 @@ Feature: Test allow lists, based on team_rewards.feature test in rewards set. | aux1 | ETH/USD-1-10 | sell | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | referee3 | ETH/USD-1-10 | buy | 5 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | When the network moves ahead "1" epochs - Then "referee1" should have vesting account balance of "5000" for asset "USD-1-10" - And "referee2" should have vesting account balance of "2500" for asset "USD-1-10" - And "referee3" should have vesting account balance of "2500" for asset "USD-1-10" + Then "referee1" should have vesting account balance of "5714" for asset "USD-1-10" + And "referee2" should have vesting account balance of "2142" for asset "USD-1-10" + And "referee3" should have vesting account balance of "2142" for asset "USD-1-10" @Closed Scenario: 0083-RFPR-063 Joining a closed team while not on the allow list should fail, team with non-empty join list @@ -141,7 +141,7 @@ Feature: Test allow lists, based on team_rewards.feature test in rewards set. | aux1 | ETH/USD-1-10 | sell | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | referee3 | ETH/USD-1-10 | buy | 5 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | When the network moves ahead "1" epochs - Then "referee1" should have vesting account balance of "5000" for asset "USD-1-10" - And "referee2" should have vesting account balance of "2500" for asset "USD-1-10" - And "referee3" should have vesting account balance of "2500" for asset "USD-1-10" + Then "referee1" should have vesting account balance of "5714" for asset "USD-1-10" + And "referee2" should have vesting account balance of "2142" for asset "USD-1-10" + And "referee3" should have vesting account balance of "2142" for asset "USD-1-10" diff --git a/core/integration/features/tick_size/0004-AMND-060.feature b/core/integration/features/tick_size/0004-AMND-060.feature index 13069b3a57..4341e86093 100644 --- a/core/integration/features/tick_size/0004-AMND-060.feature +++ b/core/integration/features/tick_size/0004-AMND-060.feature @@ -66,10 +66,10 @@ Feature: Price change amends specifying a new price which is not an integer mult | 976 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 134907600000 | 3905000000000000 | 5 | When the parties amend the following orders: - | party | reference | price | size delta | tif | error | - | trader1 | t1-b-1 | 903 | 0 | TIF_GTC | invalid OrderError | + | party | reference | price | size delta | tif | error | + | trader1 | t1-b-1 | 903 | 0 | TIF_GTC | OrderError: price not in tick size | And the network moves ahead "1" blocks Then the orders should have the following states: | party | market id | reference | side | volume | remaining | price | status | - | trader1 | ETH/DEC19 | t1-b-1 | buy | 5 | 5 | 902 | STATUS_ACTIVE | \ No newline at end of file + | trader1 | ETH/DEC19 | t1-b-1 | buy | 5 | 5 | 902 | STATUS_ACTIVE | \ No newline at end of file diff --git a/core/integration/features/verified/0003-MTMK-mark_to_market_settlement_using_insurance_pool.feature b/core/integration/features/verified/0003-MTMK-mark_to_market_settlement_using_insurance_pool.feature index 9cd134eddf..7627f86301 100644 --- a/core/integration/features/verified/0003-MTMK-mark_to_market_settlement_using_insurance_pool.feature +++ b/core/integration/features/verified/0003-MTMK-mark_to_market_settlement_using_insurance_pool.feature @@ -10,7 +10,7 @@ Feature: Test mark to market settlement with insurance pool | network.markPriceUpdateMaximumFrequency | 0s | | limits.markets.maxPeggedOrders | 2 | - @Liquidation @NoPerp + @Liquidation Scenario: If settlement amount > party’s margin account balance + party’s general account balance for the asset, the full balance of the party’s margin account is transferred to the market’s temporary settlement account, the full balance of the party’s general account for the assets are transferred to the market’s temporary settlement account, the minimum insurance pool account balance for the market & asset, and the remainder, i.e. the difference between the total amount transferred from the trader’s margin + general accounts and the settlement amount, is transferred from the insurance pool account for the market to the temporary settlement account for the market (0003-MTMK-003) Given the initial insurance pool balance is "10000" for all the markets Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/verified/0015-INSR-insurance_pool_balance_test.feature b/core/integration/features/verified/0015-INSR-insurance_pool_balance_test.feature index 92cbeb72af..ce94fece62 100644 --- a/core/integration/features/verified/0015-INSR-insurance_pool_balance_test.feature +++ b/core/integration/features/verified/0015-INSR-insurance_pool_balance_test.feature @@ -1,6 +1,6 @@ Feature: Test closeout type 1: margin >= cost of closeout - @NoPerp @PanicDebug + @PanicDebug Scenario: case 1 (using simple risk model) from https://docs.google.com/spreadsheets/d/1CIPH0aQmIKj6YeFW9ApP_l-jwB4OcsNQ/edit#gid=1555964910 (0015-INSR-001, 0015-INSR-003, 0018-RSKM-001, 0018-RSKM-003, 0010-MARG-004, 0010-MARG-005, 0010-MARG-006, 0010-MARG-007, 0010-MARG-008. 0010-MARG-009) Given the simple risk model named "simple-risk-model-1": | long | short | max move up | min move down | probability of trading | @@ -53,9 +53,9 @@ Feature: Test closeout type 1: margin >= cost of closeout Then the parties should have the following account balances: | party | asset | market id | margin | general | | aux1 | USD | ETH/DEC19 | 1200 | 999998800 | - | aux2 | USD | ETH/DEC19 | 180 | 999999820 | + | aux2 | USD | ETH/DEC19 | 300 | 999999700 | | sellSideProvider | USD | ETH/DEC19 | 450000 | 999550000 | - | buySideProvider | USD | ETH/DEC19 | 120000 | 999880000 | + | buySideProvider | USD | ETH/DEC19 | 150000 | 999850000 | Then the opening auction period ends for market "ETH/DEC19" And the mark price should be "100" for the market "ETH/DEC19" diff --git a/core/integration/features/verified/0029-FEES-trading_fees.feature b/core/integration/features/verified/0029-FEES-trading_fees.feature index 86931a7964..ae1af4122b 100644 --- a/core/integration/features/verified/0029-FEES-trading_fees.feature +++ b/core/integration/features/verified/0029-FEES-trading_fees.feature @@ -523,7 +523,6 @@ Feature: Fees calculations | party | market id | maintenance | search | initial | release | | trader4 | ETH/DEC21 | 0 | 0 | 0 | 0 | - @NoPerp Scenario: S008, Testing fees in continuous trading when insufficient balance in their general and margin account with LP, then the trade does not execute (0029-FEES-007,0029-FEES-008) 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 | @@ -980,7 +979,7 @@ Feature: Fees calculations | trading mode | auction trigger | | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | - @Liquidation @NoPerp + @Liquidation Scenario:S016, Testing fees in Price auction session trading with insufficient balance in their general and margin account, then the trade still goes ahead (0029-FEES-008) And the average block duration is "1" @@ -1160,7 +1159,7 @@ Feature: Fees calculations | trading mode | auction trigger | | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | - @now @Liquidation @NoPerp + @now @Liquidation Scenario: S018, Testing fees in continuous trading during position resolution (0029-FEES-001) Given the fees configuration named "fees-config-1": @@ -1254,7 +1253,7 @@ Feature: Fees calculations And the insurance pool balance should be "0" for the market "ETH/DEC21" - @Liquidation @NoPerp + @Liquidation Scenario: S019, Testing fees in continuous trading during position resolution with insufficient balance in their general and margin account, partial or full fees does not get paid (0029-FEES-008) Given the fees configuration named "fees-config-1": diff --git a/core/integration/features/verified/0032-PRIM-price_monitoring_horizon.feature b/core/integration/features/verified/0032-PRIM-price_monitoring_horizon.feature index 857afc10d0..57f6049981 100644 --- a/core/integration/features/verified/0032-PRIM-price_monitoring_horizon.feature +++ b/core/integration/features/verified/0032-PRIM-price_monitoring_horizon.feature @@ -73,7 +73,7 @@ Feature: 0032-PRIM-price-mornitoring, test horizon trigger. # check the requried balances And the parties should have the following account balances: | party | asset | market id | margin | general | bond | - | lp | USD | ETH/MAR22 | 24223462159 | 9585276537841 | 390500000000 | + | lp | USD | ETH/MAR22 | 25107048175 | 9584392951825 | 390500000000 | #check the margin levels Then the parties should have the following margin levels: @@ -153,7 +153,7 @@ Feature: 0032-PRIM-price-mornitoring, test horizon trigger. # check the requried balances And the parties should have the following account balances: | party | asset | market id | margin | general | bond | - | lp | USD | ETH/MAR22 | 24223462159 | 9585276537841 | 390500000000 | + | lp | USD | ETH/MAR22 | 25107048175 | 9584392951825 | 390500000000 | #check the margin levels Then the parties should have the following margin levels: @@ -235,7 +235,7 @@ Feature: 0032-PRIM-price-mornitoring, test horizon trigger. # check the requried balances And the parties should have the following account balances: | party | asset | market id | margin | general | bond | - | lp | USD | ETH/MAR22 | 24223781616 | 99585276218384 | 390500000000 | + | lp | USD | ETH/MAR22 | 25107538095 | 99584392461905 | 390500000000 | #check the margin levels Then the parties should have the following margin levels: diff --git a/core/integration/features/verified/0041-TSK-target_stake.feature b/core/integration/features/verified/0041-TSK-target_stake.feature index e58b78552a..5c3120f6e4 100644 --- a/core/integration/features/verified/0041-TSK-target_stake.feature +++ b/core/integration/features/verified/0041-TSK-target_stake.feature @@ -42,7 +42,6 @@ Feature: Target stake | tt_3 | BTC | 100000000 | | tt_4 | BTC | 100000000 | - @NoPerp Scenario: Max open interest changes over time (0041-TSTK-002, 0041-TSTK-003, 0042-LIQF-007) Given the liquidity monitoring parameters: @@ -211,7 +210,6 @@ Feature: Target stake | 110 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 0 | 2000 | 0 | And the liquidity fee factor should be "0.001" for the market "ETH/DEC21" - @NoPerp Scenario: Max open interest changes over time, testing change of timewindow (0041-TSTK-001; 0041-TSTK-004; 0041-TSTK-005) Given the liquidity monitoring parameters: @@ -307,7 +305,6 @@ Feature: Target stake # target_stake = 110 x (140+30) x 170 x 1 x 0.1=1870 And the target stake should be "1870" for the market "ETH/DEC21" - @NoPerp Scenario: Target stake is calculate correctly during auction in presence of wash trades Given the liquidity monitoring parameters: @@ -359,7 +356,6 @@ Feature: Target stake | mark price | trading mode | auction trigger | target stake | supplied stake | open interest | | 110 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 550 | 2000 | 50 | - @NoPerp Scenario: Target stake can drop during auction Given the liquidity monitoring parameters: diff --git a/core/integration/features/verified/0042-LIQF-SLA_spot.feature b/core/integration/features/verified/0042-LIQF-SLA_spot.feature new file mode 100644 index 0000000000..95be0bc73c --- /dev/null +++ b/core/integration/features/verified/0042-LIQF-SLA_spot.feature @@ -0,0 +1,686 @@ +Feature: Calculating SLA Performance + + Background: + Given 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 spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | default-log-normal-risk-model | 1 | default-none | default-none | default-basic | + And the following network parameters are set: + | name | value | + | limits.markets.maxPeggedOrders | 2 | + | network.markPriceUpdateMaximumFrequency | 0s | + | market.liquidity.providersFeeCalculationTimeStep | 1s | + | validators.epoch.length | 58s | + | market.liquidity.stakeToCcyVolume | 1 | + + And the average block duration is "1" + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | BTC | 1000000000000000000 | + | lp2 | BTC | 1000000000000000000 | + | lp3 | BTC | 1000000000000000000 | + | lp4 | BTC | 1000000000000000000 | + | aux1 | BTC | 1000000000000000000 | + | aux2 | BTC | 1000000000000000000 | + | party1 | BTC | 1000000000000000000 | + | party2 | BTC | 1000000000000000000 | + | lp1 | ETH | 1000000000000000000 | + | lp2 | ETH | 1000000000000000000 | + | lp3 | ETH | 1000000000000000000 | + | lp4 | ETH | 1000000000000000000 | + | aux1 | ETH | 1000000000000000000 | + | aux2 | ETH | 1000000000000000000 | + | party1 | ETH | 1000000000000000000 | + | party2 | ETH | 1000000000000000000 | + + Scenario: LP fulfills the mininum time fraction but is not always on the book when the sla competition factor is non-zero. (0042-LIQF-085)(0042-LIQF-101) + # Initialise the market with the required parameters + Given the liquidity sla params named "scenario-sla-params": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.5 | 0 | 0.5 | + And the spot markets are updated: + | id | sla params | linear slippage factor | quadratic slippage factor | + | BTC/ETH | scenario-sla-params | 1e-3 | 0 | + + # Setup the market with 1 LP who is initially meeting their commitment + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 10000 | 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 | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-1 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-1 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "BTC/ETH" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # Generate liquidity fees to be allocated to the LP + Given 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_GTC | + | party2 | BTC/ETH | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "100" for the market "BTC/ETH" + + # Ensure LPs timeBookFraction ~=0.75, then check ~0.25 fees are penalised (then returned as a bonus as they are the only LP) + Given the network moves ahead "45" blocks + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-1 | + | lp1 | lp1-ice-sell-1 | + 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 | BTC/ETH | 100 | ETH | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 75 | ETH | + | lp1 | | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | BTC/ETH | 25 | ETH | + | | lp1 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | BTC/ETH | 25 | ETH | + + Scenario: LP fulfills the mininum time fraction and provides liquidity throughout the epoch when performance hysteresis epochs is 1. (0042-LIQF-086)(0042-LIQF-101) + # Initialise the market with the required parameters + Given the liquidity sla params named "scenario-sla-params": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 1 | 1 | 1 | + And the spot markets are updated: + | id | sla params | linear slippage factor | quadratic slippage factor | + | BTC/ETH | scenario-sla-params | 1e-3 | 0 | + + # Setup the market with 1 LP who is initially meeting their commitment + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 10000 | 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 | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-1 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-1 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "BTC/ETH" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # Generate liquidity fees to be allocated to the LP + Given 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_GTC | + | party2 | BTC/ETH | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "100" for the market "BTC/ETH" + + # Ensure LPs timeBookFraction ~=1.00, then check ~0.0 fees are penalised + When the network moves ahead "1" epochs + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 100 | ETH | + + Scenario: LPs previous failures to meet the minimum time fraction if the markets performance hysteresis epochs is increased. (0042-LIQF-101)(0042-LIQF-088) + # Initialise the market with the required parameters + Given the liquidity sla params named "scenario-sla-params": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 1.0 | 0 | 1 | + And the spot markets are updated: + | id | sla params | linear slippage factor | quadratic slippage factor | + | BTC/ETH | scenario-sla-params | 1e-3 | 0 | + + # Setup the market with 1 LP who is initially meeting their commitment + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 10000 | 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 | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-1 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-1 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + + # Ensure LPs average timeBookFraction ~0.75 over the last 2 epochs, and will be ~1.0 in the next epoch + Given the network moves ahead "45" blocks + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-1 | + | lp1 | lp1-ice-sell-1 | + And the network moves ahead "1" epochs + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-2 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-2 | + And the network moves ahead "45" blocks + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-2 | + | lp1 | lp1-ice-sell-2 | + + # Update the market by increasing 'performance hysteresis epochs'. This will take effect for next epoch and + # no penalty should be applied. + Given the liquidity sla params named "updated-sla-params": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.5 | 2 | 1 | + And the spot markets are updated: + | id | sla params | linear slippage factor | quadratic slippage factor | + | BTC/ETH | updated-sla-params | 1e-3 | 0 | + + And the network moves ahead "1" epochs + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-3 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-3 | + + # Generate liquidity fees to be allocated to the LP + Given 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_GTC | + | party2 | BTC/ETH | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "100" for the market "BTC/ETH" + + 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 | BTC/ETH | 100 | ETH | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 100 | ETH | + + Scenario: LP does not fulfill the mininum time fraction when performance hysteresis epochs is 1. (0042-LIQF-101)(0042-LIQF-087) + # Initialise the market with the required parameters + Given the liquidity sla params named "scenario-sla-params": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 1 | 1 | 1 | + And the spot markets are updated: + | id | sla params | linear slippage factor | quadratic slippage factor | + | BTC/ETH | scenario-sla-params | 1e-3 | 0 | + + # Setup the market with 1 LP who is initially meeting their commitment + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 10000 | 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 | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-1 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-1 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "BTC/ETH" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # Generate liquidity fees to be allocated to the LP + Given 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_GTC | + | party2 | BTC/ETH | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "100" for the market "BTC/ETH" + + # Ensure LPs timeBookFraction <1.00, then check ~1.0 fees are penalised + Given the network moves ahead "1" blocks + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-1 | + | lp1 | lp1-ice-sell-1 | + 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 | BTC/ETH | 100 | ETH | + + Scenario: LPs average penalty over the last N epochs is worse then their current performance when performance hysteresis epochs is > 1. (0042-LIQF-101)(0042-LIQF-089) + + # Initialise the market with the required parameters + Given the liquidity sla params named "scenario-sla-params": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.0 | 3 | 1 | + And the spot markets are updated: + | id | sla params | linear slippage factor | quadratic slippage factor | + | BTC/ETH | scenario-sla-params | 1e-3 | 0 | + + # Setup the market with 1 LP who is initially meeting their commitment + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 10000 | 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 | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-1 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-1 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "BTC/ETH" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # Ensure LPs average timeBookFraction ~0.75 over the last 2 epochs, and will be ~1.0 in the next epoch + Given the network moves ahead "45" blocks + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-1 | + | lp1 | lp1-ice-sell-1 | + And the network moves ahead "1" epochs + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-2 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-2 | + And the network moves ahead "45" blocks + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-2 | + | lp1 | lp1-ice-sell-2 | + And the network moves ahead "1" epochs + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-3 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-3 | + + # Generate liquidity fees to be allocated to the LP + Given 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_GTC | + | party2 | BTC/ETH | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "100" for the market "BTC/ETH" + + 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 | BTC/ETH | 100 | ETH | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 75 | ETH | + | lp1 | | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | BTC/ETH | 25 | ETH | + | | lp1 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | BTC/ETH | 25 | ETH | + + Scenario: LPs average penalty over the last N epochs is worse then their current performance when performance hysteresis epochs is > 1. (0042-LIQF-090)(0042-LIQF-101)(0042-LIQF-104)(0042-LIQF-091) + # Initialise the market with the required parameters + Given the liquidity sla params named "scenario-sla-params": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.0 | 3 | 1 | + And the spot markets are updated: + | id | sla params | linear slippage factor | quadratic slippage factor | + | BTC/ETH | scenario-sla-params | 1e-3 | 0 | + + # Setup the market with 1 LP who is initially meeting their commitment + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 10000 | 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 | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-1 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-1 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "BTC/ETH" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # Ensure LPs average timeBookFraction ~0.50 over the last 2 epochs, and will be ~1.0 in the next epoch + Given the network moves ahead "30" blocks + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-1 | + | lp1 | lp1-ice-sell-1 | + And the network moves ahead "1" epochs + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-2 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-2 | + And the network moves ahead "30" blocks + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-2 | + | lp1 | lp1-ice-sell-2 | + And the network moves ahead "1" epochs + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-3 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-3 | + + # Generate liquidity fees to be allocated to the LP + Given 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_GTC | + | party2 | BTC/ETH | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "100" for the market "BTC/ETH" + + 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 | BTC/ETH | 100 | ETH | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 50 | ETH | + | lp1 | | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | BTC/ETH | 50 | ETH | + | | lp1 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | BTC/ETH | 50 | ETH | + + Scenario: 2 LPs fulfill the mininum time fraction but have different SLA performance when the sla competition factor is non-zero.(0042-LIQF-101)(0042-LIQF-102) + # Initialise the market with the required parameters + Given the liquidity sla params named "scenario-sla-params": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.5 | 3 | 1 | + And the following network parameters are set: + | name | value | + | validators.epoch.length | 1m58s | + And the spot markets are updated: + | id | sla params | linear slippage factor | quadratic slippage factor | + | BTC/ETH | scenario-sla-params | 1e-3 | 0 | + + # Setup the market with 2 LPs who are initially meeting their commitment + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 10000 | 0.1 | submission | + | lp2 | lp2 | BTC/ETH | 10000 | 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 | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-1 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-1 | + | lp2 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp2-ice-buy-1 | + | lp2 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp2-ice-sell-1 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "BTC/ETH" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # Generate liquidity fees to be allocated to the LP + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 2 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 2 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "200" for the market "BTC/ETH" + + # Ensure LP1s average timeBookFraction ~0.75 and penalties will be ~0.5 in the next epoch + Given the network moves ahead "90" blocks + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-1 | + | lp1 | lp1-ice-sell-1 | + # Ensure LP2s average timeBookFraction ~0.875 and penalties will be ~0.75 in the next epoch + Given the network moves ahead "15" blocks + And the parties cancel the following orders: + | party | reference | + | lp2 | lp2-ice-buy-1 | + | lp2 | lp2-ice-sell-1 | + And 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 | BTC/ETH | 100 | ETH | + | | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | BTC/ETH | 100 | ETH | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 50 | ETH | + | lp1 | | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | BTC/ETH | 50 | ETH | + | lp2 | lp2 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 75 | ETH | + | lp2 | | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | BTC/ETH | 25 | ETH | + | | lp1 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | BTC/ETH | 30 | ETH | + | | lp2 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | BTC/ETH | 45 | ETH | + + Scenario: 2 LPs fulfill the mininum time fraction but have different SLA performance when the sla competition factor is non-zero. (0042-LIQF-101)(0042-LIQF-103) + + # Initialise the market with the required parameters + Given the liquidity sla params named "scenario-sla-params": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.5 | 3 | 1 | + And the spot markets are updated: + | id | sla params | linear slippage factor | quadratic slippage factor | + | BTC/ETH | scenario-sla-params | 1e-3 | 0 | + + And the following network parameters are set: + | name | value | + | validators.epoch.length | 1m58s | + + # Setup the market with 1 LP who is initially meeting their commitment and 1 LP who isn't + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 10000 | 0.1 | submission | + | lp2 | lp2 | BTC/ETH | 10000 | 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 | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-1 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-1 | + | lp2 | BTC/ETH | 9 | 9 | buy | BID | 1 | 1 | lp1-ice-buy-1 | + | lp2 | BTC/ETH | 9 | 9 | sell | ASK | 1 | 1 | lp1-ice-sell-1 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "BTC/ETH" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # Generate liquidity fees to be allocated to the LP + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 2 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 2 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "200" for the market "BTC/ETH" + + # Ensure LP1s average timeBookFraction ~0.75 and penalties will be ~0.5 in the next epoch + Given the network moves ahead "90" blocks + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-1 | + | lp1 | lp1-ice-sell-1 | + And 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 | BTC/ETH | 100 | ETH | + | | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | BTC/ETH | 100 | ETH | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 50 | ETH | + | lp1 | | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | BTC/ETH | 50 | ETH | + | 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": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0 | 1 | 1 | + And the spot markets are updated: + | id | sla params | linear slippage factor | quadratic slippage factor | + | BTC/ETH | 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 | BTC/ETH | 10000000 | 0.1 | submission | + | lp2 | lp2 | BTC/ETH | 1000000 | 0.1 | submission | + | lp3 | lp3 | BTC/ETH | 70000000 | 0.1 | submission | + | lp4 | lp4 | BTC/ETH | 919000000 | 0.1 | submission | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | BTC/ETH | buy | 10000 | 999 | 0 | TYPE_LIMIT | TIF_GTC | lp1-bid | + | lp1 | BTC/ETH | sell | 10000 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | lp1-ask | + | lp2 | BTC/ETH | buy | 1000 | 999 | 0 | TYPE_LIMIT | TIF_GTC | lp2-bid | + | lp2 | BTC/ETH | sell | 1000 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | lp2-ask | + | lp3 | BTC/ETH | buy | 70000 | 999 | 0 | TYPE_LIMIT | TIF_GTC | lp3-bid | + | lp3 | BTC/ETH | sell | 70000 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | lp3-ask | + | lp4 | BTC/ETH | buy | 919000 | 999 | 0 | TYPE_LIMIT | TIF_GTC | lp4-bid | + | lp4 | BTC/ETH | 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 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "BTC/ETH" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # 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 | BTC/ETH | buy | 1000 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1000 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "100000" for the market "BTC/ETH" + + # 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 | BTC/ETH | 1000 | ETH | + | | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | BTC/ETH | 100 | ETH | + | | lp3 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | BTC/ETH | 7000 | ETH | + | | lp4 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | BTC/ETH | 91900 | ETH | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 1000 | ETH | + | lp2 | lp2 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 95 | ETH | + | lp3 | lp3 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 2800 | ETH | + | | lp1 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | BTC/ETH | 24673 | ETH | + | | lp2 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | BTC/ETH | 2344 | ETH | + | | lp3 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | BTC/ETH | 69087 | ETH | + + Scenario: LP fulfills the mininum time fraction but only provides liquidity scattered throughout the epoch (0042-LIQF-083) + + # Initialise the market with the required parameters + Given the liquidity sla params named "scenario-sla-params": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.5 | 0 | 1.0 | + And the spot markets are updated: + | id | sla params | linear slippage factor | quadratic slippage factor | + | BTC/ETH | scenario-sla-params | 1e-3 | 0 | + + # Setup the market with 1 LP who is initially meeting their commitment + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 10000 | 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 | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-1 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-1 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "BTC/ETH" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # Generate liquidity fees to be allocated to the LP + Given 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_GTC | + | party2 | BTC/ETH | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "100" for the market "BTC/ETH" + + # Ensure LPs timeBookFraction ~=0.75, then check ~0.5 fees are penalised (then returned as a bonus as they are the only LP) + Given the network moves ahead "10" blocks + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-1 | + | lp1 | lp1-ice-sell-1 | + And the network moves ahead "5" 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 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-2 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-2 | + And the network moves ahead "10" blocks + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-2 | + | lp1 | lp1-ice-sell-2 | + And the network moves ahead "5" 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 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-3 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-3 | + And the network moves ahead "10" blocks + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-3 | + | lp1 | lp1-ice-sell-3 | + And the network moves ahead "5" 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 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-4 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-4 | + 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 | BTC/ETH | 100 | ETH | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 50 | ETH | + | lp1 | | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | BTC/ETH | 50 | ETH | + | | lp1 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | BTC/ETH | 50 | ETH | + + Scenario: LP fulfills the mininum time fraction but only provides liquidity at the start of the epoch (0042-LIQF-082) + + # Initialise the market with the required parameters + Given the liquidity sla params named "scenario-sla-params": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0.5 | 0 | 1.0 | + And the spot markets are updated: + | id | sla params | linear slippage factor | quadratic slippage factor | + | BTC/ETH | scenario-sla-params | 1e-3 | 0 | + + # Setup the market with 1 LP who is initially meeting their commitment + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/ETH | 10000 | 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 | reference | + | lp1 | BTC/ETH | 200 | 120 | buy | BID | 1000 | 1 | lp1-ice-buy-1 | + | lp1 | BTC/ETH | 200 | 120 | sell | ASK | 1000 | 1 | lp1-ice-sell-1 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/ETH | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/ETH | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "BTC/ETH" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # Generate liquidity fees to be allocated to the LP + Given 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_GTC | + | party2 | BTC/ETH | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "100" for the market "BTC/ETH" + + # Ensure LPs timeBookFraction ~=0.75, then check ~0.5 fees are penalised (then returned as a bonus as they are the only LP) + Given the network moves ahead "45" blocks + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-ice-buy-1 | + | lp1 | lp1-ice-sell-1 | + 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 | BTC/ETH | 100 | ETH | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/ETH | 50 | ETH | + | lp1 | | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | BTC/ETH | 50 | ETH | + | | lp1 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | BTC/ETH | 50 | ETH | diff --git a/core/integration/features/verified/0042-LIQF-fees_rewards_VirtualStake.feature b/core/integration/features/verified/0042-LIQF-fees_rewards_VirtualStake.feature index f948d66087..9e9c28ee8e 100644 --- a/core/integration/features/verified/0042-LIQF-fees_rewards_VirtualStake.feature +++ b/core/integration/features/verified/0042-LIQF-fees_rewards_VirtualStake.feature @@ -477,7 +477,7 @@ Feature: Test liquidity provider reward distribution; Should also cover liquidit And the accumulated liquidity fees should be "1" for the market "ETH/MAR22" - @FeeRound @Liquidation @NoPerp + @FeeRound @Liquidation Scenario: 004 2 LPs joining at start, 1 LP forcibly closed out (0042-LIQF-008) Given the average block duration is "601" diff --git a/core/integration/features/verified/0044-LIME-SLA_spot.feature b/core/integration/features/verified/0044-LIME-SLA_spot.feature new file mode 100644 index 0000000000..652ae5cd58 --- /dev/null +++ b/core/integration/features/verified/0044-LIME-SLA_spot.feature @@ -0,0 +1,246 @@ +Feature: Test LP mechanics when there are multiple liquidity providers; + + Background: + + Given the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.000001 | 0.1 | 0 | 0 | 1.0 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | ETH | 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.99 | 40 | + + And the liquidity sla params named "SLA": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.05 | 1 | 1 | 1.0 | + + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 10 | 20s | 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 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | validators.epoch.length | 5s | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.5 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 1 | + | validators.epoch.length | 10s | + | market.liquidity.providersFeeCalculationTimeStep | 10s | + Given the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 0.5 | 20s | 1.0 | + + And the spot markets: + | id | name | base asset | quote asset | liquidity monitoring | risk model | auction duration | fees | price monitoring | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lqm-params | log-normal-risk-model | 2 | fees-config-1 | price-monitoring | SLA | + + Given the average block duration is "2" + + Scenario: An LP with orders inside valid range during auction isn't penalised (0044-LIME-116) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | ETH | 20000000 | + | party1 | ETH | 1000000000 | + | party2 | ETH | 1000000000 | + | party3 | ETH | 1000000 | + | lp1 | BTC | 20000000 | + | party1 | BTC | 1000000000 | + | party2 | BTC | 1000000000 | + | party3 | BTC | 1000000 | + + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | BTC/ETH | 180000 | 0.02 | submission | + + When the network moves ahead "2" blocks + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp1 | BTC/ETH | buy | 100 | 4750 | 0 | TYPE_LIMIT | TIF_GTC | + | lp1 | BTC/ETH | sell | 100 | 5250 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 10 | 5100 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 5000 | 1 | party2 | + + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | + | 5000 | TRADING_MODE_CONTINUOUS | 3600 | 4865 | 5139 | 180000 | 180000 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 4850 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 4850 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 10 | 4900 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | auction end | + | 5000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 180000 | 180000 | 40 | + + When the network moves ahead "2" blocks + And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | target stake | supplied stake | + | 5000 | TRADING_MODE_MONITORING_AUCTION | 180000 | 180000 | + And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "1" epochs + And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + Then the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 19340012 | 90000 | + + When the network moves ahead "1" epochs + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + Then the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 19340012 | 45000 | + + Scenario: An LP with bid orders outside valid range during auction is penalised (0044-LIME-117) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | ETH | 20000000 | + | party1 | ETH | 1000000000 | + | party2 | ETH | 1000000000 | + | party3 | ETH | 1000000 | + | lp1 | BTC | 20000000 | + | party1 | BTC | 1000000000 | + | party2 | BTC | 1000000000 | + | party3 | BTC | 1000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | BTC/ETH | 180000 | 0.02 | submission | + + When the network moves ahead "2" blocks + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp1 | BTC/ETH | buy | 100 | 4740 | 0 | TYPE_LIMIT | TIF_GTC | + | lp1 | BTC/ETH | sell | 100 | 5250 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 10 | 5100 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 5000 | 1 | party2 | + + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | + | 5000 | TRADING_MODE_CONTINUOUS | 3600 | 4865 | 5139 | 180000 | 180000 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 4850 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 4850 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 10 | 4900 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | auction end | + | 5000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 180000 | 180000 | 40 | + + When the network moves ahead "2" blocks + And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "1" epochs + And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + Then the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 19341023 | 90000 | + + When the network moves ahead "2" epochs + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + Then the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 19341023 | 22500 | + + Scenario: An LP with ask orders outside valid range during auction is penalised (0044-LIME-118) + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | ETH | 20000000 | + | party1 | ETH | 1000000000 | + | party2 | ETH | 1000000000 | + | party3 | ETH | 1000000 | + | lp1 | BTC | 20000000 | + | party1 | BTC | 1000000000 | + | party2 | BTC | 1000000000 | + | party3 | BTC | 1000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | BTC/ETH | 180000 | 0.02 | submission | + + When the network moves ahead "2" blocks + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp1 | BTC/ETH | buy | 100 | 4750 | 0 | TYPE_LIMIT | TIF_GTC | + | lp1 | BTC/ETH | sell | 100 | 5260 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 10 | 5100 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "BTC/ETH" + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 5000 | 1 | party2 | + + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | + | 5000 | TRADING_MODE_CONTINUOUS | 3600 | 4865 | 5139 | 180000 | 180000 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 4850 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 4850 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | BTC/ETH | buy | 10 | 4900 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the market data for the market "BTC/ETH" should be: + | mark price | trading mode | auction trigger | target stake | supplied stake | auction end | + | 5000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 180000 | 180000 | 40 | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | BTC/ETH | sell | 1 | 5000 | 0 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "1" epochs + And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + Then the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 19340012 | 90000 | + + When the network moves ahead "2" epochs + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + Then the parties should have the following account balances: + | party | asset | market id | general | bond | + | lp1 | ETH | BTC/ETH | 19340012 | 22500 | diff --git a/core/integration/features/verified/0044-LIME_lp_at_termination.feature b/core/integration/features/verified/0044-LIME_lp_at_termination.feature index 9e968f66f1..ac618453b4 100644 --- a/core/integration/features/verified/0044-LIME_lp_at_termination.feature +++ b/core/integration/features/verified/0044-LIME_lp_at_termination.feature @@ -147,8 +147,8 @@ Feature: Test LP bond account when market is terminated #And time is updated to "2020-01-01T01:01:01Z" 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: - | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | - | 1120 | TRADING_MODE_NO_TRADING | 360000 | 786 | 1361 | 63739 | 3240 | 16 | + | mark price | trading mode | horizon | ref price | min bound | max bound | target stake | supplied stake | open interest | + | 1120 | TRADING_MODE_NO_TRADING | 360000 | 1060 | 801 | 1387 | 63739 | 3240 | 16 | Then the oracles broadcast data signed with "0xCAFECAFE19": | name | value | diff --git a/core/integration/features/verified/closeout-LP_New_Exit_Price.feature b/core/integration/features/verified/closeout-LP_New_Exit_Price.feature index d00c0621c5..8a32c1a62d 100644 --- a/core/integration/features/verified/closeout-LP_New_Exit_Price.feature +++ b/core/integration/features/verified/closeout-LP_New_Exit_Price.feature @@ -30,7 +30,7 @@ Feature: Replicate a scenario from Lewis with Elias' implementation on Exit_pric | limits.markets.maxPeggedOrders | 2 | And the average block duration is "1" - @Liquidation @NoPerp + @Liquidation Scenario: 001 Replicate a scenario from Lewis with Elias' implementation on Exit_price when there is insufficient orders, linear slippage factor = 1e6, quadratic slippage factor = 1e6, 0019-MCAL-001, 0019-MCAL-002 # 1. trader B made LP commitment 150,000 # 2. trader C and A cross at 0.5 with size of 111, and this opens continuous trading (trade B is short) diff --git a/core/integration/features/verified/closeout-cascade.feature b/core/integration/features/verified/closeout-cascade.feature index 732c1deabe..cdf35f0882 100644 --- a/core/integration/features/verified/closeout-cascade.feature +++ b/core/integration/features/verified/closeout-cascade.feature @@ -19,7 +19,7 @@ Feature: Closeout-cascades | limits.markets.maxPeggedOrders | 2 | @NetworkParty - @CloseOutTrades @Liquidation @NoPerp + @CloseOutTrades @Liquidation Scenario: Distressed position gets taken over by another party whose margin level is insufficient to support it (however mark price doesn't get updated on closeout trade and hence no further closeouts are carried out) (0005-COLL-002) # setup accounts, we are trying to closeout trader3 first and then trader2 diff --git a/core/integration/features/verified/closeout-lognormal.feature b/core/integration/features/verified/closeout-lognormal.feature index 2900549ca6..7380ff30ce 100644 --- a/core/integration/features/verified/closeout-lognormal.feature +++ b/core/integration/features/verified/closeout-lognormal.feature @@ -21,7 +21,7 @@ Feature: Closeout scenarios | network.markPriceUpdateMaximumFrequency | 0s | | limits.markets.maxPeggedOrders | 2 | - @EndBlock @Liquidation @NoPerp + @EndBlock @Liquidation Scenario: 001, 2 parties get close-out at the same time. Distressed position gets taken over by LP, distressed order gets canceled (0005-COLL-002; 0012-POSR-001; 0012-POSR-002; 0012-POSR-004; 0012-POSR-005; 0007-POSN-015) # setup accounts, we are trying to closeout trader3 first and then trader2 diff --git a/core/integration/features/verified/liquidity-provision-bond-account.feature b/core/integration/features/verified/liquidity-provision-bond-account.feature index fb791736c7..6f9aedea39 100644 --- a/core/integration/features/verified/liquidity-provision-bond-account.feature +++ b/core/integration/features/verified/liquidity-provision-bond-account.feature @@ -34,7 +34,7 @@ Feature: Replicate LP getting distressed during continuous trading, check if pen | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0 | - @Now @NoPerp + @Now Scenario: 001, LP gets distressed during continuous trading, no DPD setting (0044-LIME-002, 0035-LIQM-004) Given the liquidity monitoring parameters: diff --git a/core/integration/features/verified/negative_price_factor.feature b/core/integration/features/verified/negative_price_factor.feature new file mode 100644 index 0000000000..35a607e866 --- /dev/null +++ b/core/integration/features/verified/negative_price_factor.feature @@ -0,0 +1,93 @@ +Feature: Simple negative price factor - future and perpetual markets + + Test simply checks if an asset and market is configured such that the market + decimal places are greater than the asset decimal places, yielding a + negative price factor, the market still operates correctly. + + This is validated by checking an LP meets their obligation when their orders + are sized and priced correctly. i.e. they are not penalised at the end of + the epoch. + + Background: + + Given time is updated to "2024-01-01T00:00:00Z" + And the average block duration is "1" + And the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + | market.liquidity.providersFeeCalculationTimeStep | 5s | + + Given the following assets are registered: + | id | decimal places | quantum | + | USDT.0.1 | 0 | 1 | + | ETH.0.1 | 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 | + | BTC/USDT | USDT | USDT.0.1 | default-log-normal-risk-model | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 1e-3 | 0 | default-futures | 2 | -2 | + + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USDT.0.1 | 1000000000 | + | aux1 | USDT.0.1 | 1000000000 | + | aux2 | USDT.0.1 | 1000000000 | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USDT.0.1 | 1000000000 | + | aux1 | USDT.0.1 | 1000000000 | + | aux2 | USDT.0.1 | 1000000000 | + + + Scenario: Check if a futures / perpetual market operates correctly with a negative price factor + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 200 | 0.1 | submission | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp1 | BTC/USDT | buy | 2 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + | lp1 | BTC/USDT | sell | 1 | 200 | 0 | TYPE_LIMIT | TIF_GTC | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 1 | 150 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 1 | 150 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "BTC/USDT" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/USDT" + + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 1 | 150 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 1 | 150 | 1 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "1" blocks + When the network moves ahead "1" epochs + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/USDT | 10 | USDT.0.1 | + + + Scenario: Check if a spot market operates correctly with a negative price factor + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 200 | 0.1 | submission | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp1 | BTC/USDT | buy | 2 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + | lp1 | BTC/USDT | sell | 1 | 200 | 0 | TYPE_LIMIT | TIF_GTC | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 1 | 150 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 1 | 150 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "BTC/USDT" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/USDT" + + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 1 | 150 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 1 | 150 | 1 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "1" blocks + When the network moves ahead "1" epochs + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/USDT | 10 | USDT.0.1 | diff --git a/core/integration/features/verified/negative_price_factor_spot.feature b/core/integration/features/verified/negative_price_factor_spot.feature new file mode 100644 index 0000000000..40f82f6d4b --- /dev/null +++ b/core/integration/features/verified/negative_price_factor_spot.feature @@ -0,0 +1,96 @@ +Feature: Simple negative price factor - spot markets + + Test simply checks if an asset and market is configured such that the market + decimal places are greater than the asset decimal places, yielding a + negative price factor, the market still operates correctly. + + This is validated by checking an LP meets their obligation when their orders + are sized and priced correctly. i.e. they are not penalised at the end of + the epoch. + + Background: + + Given time is updated to "2024-01-01T00:00:00Z" + And the average block duration is "1" + And the following network parameters are set: + | name | value | + | validators.epoch.length | 10s | + | market.liquidity.providersFeeCalculationTimeStep | 5s | + + Given the following assets are registered: + | id | decimal places | quantum | + | USDT.0.1 | 0 | 1 | + | BTC.0.1 | 0 | 1 | + And the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | sla params | decimal places | position decimal places | + | BTC/USDT | ETH/USDT | BTC.0.1 | USDT.0.1 | default-log-normal-risk-model | 1 | default-none | default-none | default-basic | 2 | -2 | + + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USDT.0.1 | 1000000000 | + | aux1 | USDT.0.1 | 1000000000 | + | aux2 | USDT.0.1 | 1000000000 | + | lp1 | BTC.0.1 | 1000000000 | + | aux1 | BTC.0.1 | 1000000000 | + | aux2 | BTC.0.1 | 1000000000 | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USDT.0.1 | 1000000000 | + | aux1 | USDT.0.1 | 1000000000 | + | aux2 | USDT.0.1 | 1000000000 | + + + Scenario: Check if a futures / perpetual market operates correctly with a negative price factor + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 200 | 0.1 | submission | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp1 | BTC/USDT | buy | 2 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + | lp1 | BTC/USDT | sell | 1 | 200 | 0 | TYPE_LIMIT | TIF_GTC | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 1 | 150 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 1 | 150 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "BTC/USDT" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/USDT" + + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 1 | 150 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 1 | 150 | 1 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "1" blocks + When the network moves ahead "1" epochs + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/USDT | 10 | USDT.0.1 | + + + Scenario: Check if a spot market operates correctly with a negative price factor + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | BTC/USDT | 200 | 0.1 | submission | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp1 | BTC/USDT | buy | 2 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + | lp1 | BTC/USDT | sell | 1 | 200 | 0 | TYPE_LIMIT | TIF_GTC | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 1 | 150 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 1 | 150 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "BTC/USDT" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/USDT" + + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | BTC/USDT | buy | 1 | 150 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | BTC/USDT | sell | 1 | 150 | 1 | TYPE_LIMIT | TIF_GTC | + And the network moves ahead "1" blocks + When the network moves ahead "1" epochs + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | BTC/USDT | 10 | USDT.0.1 | diff --git a/core/integration/features/verified/network_disposing_position_outside_bounds.feature b/core/integration/features/verified/network_disposing_position_outside_bounds.feature index dd716b083d..5a30951f1a 100644 --- a/core/integration/features/verified/network_disposing_position_outside_bounds.feature +++ b/core/integration/features/verified/network_disposing_position_outside_bounds.feature @@ -16,9 +16,9 @@ Feature: Disposing position outside bounds # Configure the markets Given the liquidation strategies: - | name | disposal step | disposal fraction | full disposal size | max fraction consumed | - | liquidation-strat-1 | 1 | 0.5 | 0 | 1 | - | liquidation-strat-2 | 1 | 1 | 0 | 0.5 | + | name | disposal step | disposal fraction | full disposal size | max fraction consumed | disposal slippage range | + | liquidation-strat-1 | 1 | 0.5 | 0 | 1 | 0.1 | + | liquidation-strat-2 | 1 | 1 | 0 | 0.5 | 0.1 | And the price monitoring named "price-monitoring": | horizon | probability | auction extension | | 6200 | 0.99 | 5 | @@ -357,4 +357,4 @@ Feature: Disposing position outside bounds When the network moves ahead "1" blocks Then the parties should have the following profit and loss: | party | volume | unrealised pnl | realised pnl | - | network | 1 | 0 | 0 | \ No newline at end of file + | network | 1 | 0 | 0 | diff --git a/core/integration/features/verified/network_pnl.feature b/core/integration/features/verified/network_pnl.feature index f83815733c..8e74f30cb3 100644 --- a/core/integration/features/verified/network_pnl.feature +++ b/core/integration/features/verified/network_pnl.feature @@ -13,9 +13,9 @@ Feature: Profit and loss for network a running liquidation strategy # Configure the markets Given the liquidation strategies: - | name | disposal step | disposal fraction | full disposal size | max fraction consumed | - | liquidation-strat-1 | 3600 | 0.5 | 0 | 1 | - | liquidation-strat-2 | 5 | 0.5 | 0 | 1 | + | name | disposal step | disposal fraction | full disposal size | max fraction consumed | disposal slippage range | + | liquidation-strat-1 | 3600 | 0.5 | 0 | 1 | 0.1 | + | liquidation-strat-2 | 5 | 0.5 | 0 | 1 | 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 | liquidation strategy | sla params | diff --git a/core/integration/features/verified/network_pnl_funding.feature b/core/integration/features/verified/network_pnl_funding.feature index 1268913c3c..f7df129a0b 100644 --- a/core/integration/features/verified/network_pnl_funding.feature +++ b/core/integration/features/verified/network_pnl_funding.feature @@ -15,8 +15,8 @@ Feature: Network profit and loss consideres funding | 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 | ETH | perp.ETH.value | TYPE_INTEGER | perp.funding.cue | TYPE_TIMESTAMP | 0.9 | 0.1 | 0 | 0 | ETH | 0 | Given the liquidation strategies: - | name | disposal step | disposal fraction | full disposal size | max fraction consumed | - | liquidation-strat-1 | 3600 | 0.5 | 0 | 1 | + | name | disposal step | disposal fraction | full disposal size | max fraction consumed | disposal slippage range | + | liquidation-strat-1 | 3600 | 0.5 | 0 | 1 | 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 | liquidation strategy | sla params | market type | | ETH/MAR22 | ETH | ETH | default-log-normal-risk-model | default-margin-calculator | 1 | default-none | default-none | perp-oracle | 0.001 | 0 | liquidation-strat-1 | default-basic | perp | diff --git a/core/integration/features/verified/network_position_disposal.feature b/core/integration/features/verified/network_position_disposal.feature index e58fca8c41..8fdb500de8 100644 --- a/core/integration/features/verified/network_position_disposal.feature +++ b/core/integration/features/verified/network_position_disposal.feature @@ -12,17 +12,18 @@ Feature: Network disposing position | id | decimal places | quantum | | USD.0.10 | 0 | 10 | + # disposal strat 1 set to 0.5 for scenario at line 244 Given the liquidation strategies: - | name | disposal step | disposal fraction | full disposal size | max fraction consumed | - | disposal-strat-1 | 5 | 0.2 | 0 | 0.1 | - | disposal-strat-2 | 5 | 0.2 | 5 | 0.1 | + | name | disposal step | disposal fraction | full disposal size | max fraction consumed | disposal slippage range | + | disposal-strat-1 | 5 | 0.2 | 0 | 0.1 | 0.5 | + | disposal-strat-2 | 5 | 0.2 | 5 | 0.1 | 0.1 | And the log normal risk model named "log-normal-risk-model-1": | risk aversion | tau | mu | r | sigma | | 0.000001 | 0.00000380258 | 0 | 0 | 1.5 | And the price monitoring named "price-monitoring-1": | horizon | probability | auction extension | - | 100000 | 0.99 | 3 | + | 100000 | 0.99 | 60 | And the liquidity sla params named "SLA": | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | | 1 | 0.85 | 1 | 0.5 | @@ -240,9 +241,138 @@ Feature: Network disposing position | lp1 | buy | 4 | And clear trade events +Scenario: Network takes over distressed position and attempts to dispose position during price monitoring auction + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD.0.10 | 100000000000 | + | aux1 | USD.0.10 | 10000000000 | + | aux2 | USD.0.10 | 10000000000 | + | atRiskParty | USD.0.10 | 180 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | ETH/MAR22 | 500000 | 0 | submission | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | buy | 1000 | 999 | 0 | TYPE_LIMIT | TIF_GTC | best-bid | + | lp1 | ETH/MAR22 | sell | 1000 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | best-ask | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/MAR22 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/MAR22 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "ETH/MAR22" + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | + | 1000 | TRADING_MODE_CONTINUOUS | + + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/MAR22 | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | atRiskParty | ETH/MAR22 | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the network moves ahead "1" blocks + + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | + | atRiskParty | -10 | 0 | 0 | + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | + | atRiskParty | ETH/MAR22 | 156 | 171 | 187 | 218 | + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | atRiskParty | USD.0.10 | ETH/MAR22 | 175 | 5 | + Given the parties amend the following orders: + | party | reference | price | size delta | tif | + | lp1 | best-ask | 1240 | 0 | TIF_GTC | + | lp1 | best-bid | 1009 | 0 | TIF_GTC | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/MAR22 | buy | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/MAR22 | sell | 1 | 1010 | 1 | TYPE_LIMIT | TIF_GTC | + Then the network moves ahead "1" blocks + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | + | 1010 | TRADING_MODE_CONTINUOUS | + Then debug trades + Then the parties should have the following profit and loss: + | party | market id | volume | unrealised pnl | realised pnl | + | atRiskParty | ETH/MAR22 | 0 | 0 | -180 | + And the following network trades should be executed: + | party | aggressor side | volume | + | atRiskParty | sell | 10 | + And clear trade events + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | horizon | min bound | max bound | + | 1010 | TRADING_MODE_CONTINUOUS | 100000 | 802 | 1238 | + Then debug detailed orderbook volumes for market "ETH/MAR22" + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/MAR22 | buy | 1 | 1239 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/MAR22 | sell | 1 | 1239 | 0 | TYPE_LIMIT | TIF_GTC | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | + | 1010 | TRADING_MODE_MONITORING_AUCTION | + + When the network moves ahead "30" blocks + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | + | 1010 | TRADING_MODE_MONITORING_AUCTION | + When the network moves ahead "31" blocks + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | + | 1239 | TRADING_MODE_CONTINUOUS | + # Position size is 10, next disposal should be ceil(10*0.2)=ceil(2)=2 + And the following network trades should be executed: + | party | aggressor side | volume | + | lp1 | buy | 2 | + Then debug trades + And clear trade events + + # Position size is 8, next disposal should be ceil(8*0.2)=ceil(1.6)=2 + Then the network moves ahead "5" blocks + Then debug trades + And the following network trades should be executed: + | party | aggressor side | volume | + | lp1 | buy | 2 | + And clear trade events + + # Position size is 6, next disposal should be ceil(6*0.2)=ceil(1.4)=2 + Then the network moves ahead "5" blocks + Then debug trades + And the following network trades should be executed: + | party | aggressor side | volume | + | lp1 | buy | 2 | + And clear trade events + + # Position size is 4, next disposal should be ceil(10*0.2)=ceil(2)=2 + Then the network moves ahead "5" blocks + And the following network trades should be executed: + | party | aggressor side | volume | + | lp1 | buy | 1 | + And clear trade events + + # Position size is 3, next disposal should be ceil(10*0.2)=ceil(2)=2 + Then the network moves ahead "5" blocks + And the following network trades should be executed: + | party | aggressor side | volume | + | lp1 | buy | 1 | + And clear trade events + + # Position size is 2, next disposal should be ceil(10*0.2)=ceil(2)=2 + Then the network moves ahead "5" blocks + And the following network trades should be executed: + | party | aggressor side | volume | + | lp1 | buy | 1 | + And clear trade events + + # Position size is 1, next disposal should be ceil(10*0.2)=ceil(2)=2 + Then the network moves ahead "5" blocks + And the following network trades should be executed: + | party | aggressor side | volume | + | lp1 | buy | 1 | + And clear trade events diff --git a/core/integration/features/verified/reward_cap.feature b/core/integration/features/verified/reward_cap.feature new file mode 100644 index 0000000000..cec6c19cd7 --- /dev/null +++ b/core/integration/features/verified/reward_cap.feature @@ -0,0 +1,138 @@ +Feature: Capping distributed rewards at a multiple of fees paid + + Tests checks: + - the cap_reward_fee_multiple correctly caps rewards distributed + to parties to a multiple of the total fees paid by each respective party. + - reallocation of unallocated rewards is attempted upto 10 times. + - unallocated rewards are carried over to the next epoch. + + Background: + + # Initialise the network and register the assets + Given time is updated to "2023-01-01T00:00:00Z" + And the average block duration is "1" + And the following network parameters are set: + | name | value | + | market.fee.factors.makerFee | 0.0005 | + | market.fee.factors.infrastructureFee | 0.0015 | + And the following assets are registered: + | id | decimal places | quantum | + | USD-1-10 | 1 | 10 | + + # Initialise the parties and deposit assets + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp | USD-1-10 | 10000000000 | + | aux1 | USD-1-10 | 10000000000 | + | aux2 | USD-1-10 | 10000000000 | + | party1 | USD-1-10 | 10000000000 | + | party2 | USD-1-10 | 10000000000 | + | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | USD-1-10 | 10000000000 | + + # Setup the market in continuous trading + 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 | default-log-normal-risk-model | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 1e-3 | 0 | default-futures | 0 | 0 | + + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp | ETH/USD-1-10 | 1000000 | 0.008 | submission | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USD-1-10 | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | 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 | + | aux2 | ETH/USD-1-10 | sell | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | + When 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: Capping distributed rewards at a multiple of fees paid (0057-TRAN-070)(0057-TRAN-071) + + # Start a new epoch then generate trades + Given the network moves ahead "1" epochs + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | aux1 | ETH/USD-1-10 | buy | 20 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/USD-1-10 | sell | 20 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + When the network moves ahead "1" blocks + Then the following trades should be executed: + | buyer | price | size | seller | buyer fee | seller fee | + | party1 | 1000 | 10 | aux1 | 1000 | 0 | + | aux1 | 1000 | 20 | party2 | 0 | 2000 | + # Setup a recurring transfer funding a reward pool + Given the current epoch is "1" + And the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | entity_scope | individual_scope | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | cap_reward_fee_multiple | lock_period | + | 1 | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES | INDIVIDUALS | ALL | USD-1-10 | 10000 | 1 | | 1 | DISPATCH_METRIC_MAKER_FEES_PAID | USD-1-10 | ETH/USD-1-10 | | 100 | + When the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | party1 | USD-1-10 | | + | party2 | USD-1-10 | | + + Examples: + | cap_reward_fee_multiple | party1_rewards | party2_rewards | + | 0.1 | 100 | 200 | + | 1 | 1000 | 2000 | + | 10 | 3333 | 6666 | + + + Scenario Outline: Attempting to reallocate rewards after a party hits the cap and carrying over unallocated rewards (0057-TRAN-072)(0057-TRAN-073) + + # Start a new epoch then generate trades + Given the network moves ahead "1" epochs + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/USD-1-10 | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | ETH/USD-1-10 | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/USD-1-10 | sell | 20 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | ETH/USD-1-10 | buy | 20 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/USD-1-10 | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/USD-1-10 | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + When the network moves ahead "1" blocks + Then the following trades should be executed: + | buyer | price | size | seller | buyer fee | seller fee | + | party1 | 1000 | 10 | aux1 | 0 | 1000 | + | aux1 | 1000 | 20 | party2 | 2000 | 0 | + | party1 | 1000 | 10 | party2 | 0 | 1000 | + + # Setup a recurring transfer funding a reward pool + Given the current epoch is "1" + And the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | entity_scope | individual_scope | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | cap_reward_fee_multiple | lock_period | + | 1 | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_MAKER_RECEIVED_FEES | INDIVIDUALS | ALL | USD-1-10 | 10000 | 1 | | 1 | DISPATCH_METRIC_MAKER_FEES_RECEIVED | USD-1-10 | ETH/USD-1-10 | | 100 | + When the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | party1 | USD-1-10 | | + | party2 | USD-1-10 | | + + # In the second epoch both parties generate the same maker fees and pay a large amount of fees + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/USD-1-10 | buy | 1000 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/USD-1-10 | sell | 1000 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/USD-1-10 | buy | 1000 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/USD-1-10 | sell | 1000 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + When the network moves ahead "1" blocks + Then the following trades should be executed: + | buyer | price | size | seller | buyer fee | seller fee | + | party1 | 1000 | 1000 | party2 | 0 | 100000 | + | party2 | 1000 | 1000 | party1 | 0 | 100000 | + + # In the next epoch unallocated rewards from the previous epoch are distributed + Given the current epoch is "2" + When the network moves ahead "1" epochs + Then parties should have the following vesting account balances: + | party | asset | balance | + | party1 | USD-1-10 | | + | party1 | USD-1-10 | | + + Examples: + | cap_reward_fee_multiple | epoch1_party1_rewards | epoch1_party2_rewards | epoch2_party1_rewards | epoch2_party2_rewards | + | 1 | 0 | 1000 | 9500 | 9500 | + | 5 | 0 | 5000 | 7500 | 7500 | + | 10 | 0 | 9990 | 5005 | 5005 | diff --git a/core/integration/features/verified/rewards-over-window.feature b/core/integration/features/verified/rewards-over-window.feature index 8f184b9ea5..b8dd1dded2 100644 --- a/core/integration/features/verified/rewards-over-window.feature +++ b/core/integration/features/verified/rewards-over-window.feature @@ -96,6 +96,40 @@ Feature: Maker fees paid reward metric calculated correctly for time window And "referee3" should have vesting account balance of "2000" for asset "USD-1-10" + Scenario: Party funds pool with recurring transfer scoping individuals with transfer interval 5 + + Given the parties submit the following recurring transfers: + | id | from | from_account_type | to | to_account_type | entity_scope | teams | ntop | asset | amount | start_epoch | end_epoch | factor | metric | metric_asset | markets | window_length | transfer_interval | + | 1 | a3c024b4e23230c89884a54a813b1ecb4cb0f827a38641c66eeca466da6b2ddf | ACCOUNT_TYPE_GENERAL | 0000000000000000000000000000000000000000000000000000000000000000 | ACCOUNT_TYPE_REWARD_MAKER_PAID_FEES | INDIVIDUALS | | 1 | USD-1-10 | 10000 | 1 | | 1 | DISPATCH_METRIC_MAKER_FEES_PAID | USD-1-10 | ETH/USD-1-10 | 5 | 5 | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | referrer1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | referee1 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | referrer1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | referee2 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | referrer1 | ETH/USD-1-10 | sell | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | referee3 | ETH/USD-1-10 | buy | 5 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "5" epochs + Then "referee1" should have vesting account balance of "4000" for asset "USD-1-10" + And "referee2" should have vesting account balance of "4000" for asset "USD-1-10" + And "referee3" should have vesting account balance of "2000" for asset "USD-1-10" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | referrer1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | referee1 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | referrer1 | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | referee2 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + | referrer1 | ETH/USD-1-10 | sell | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | referee3 | ETH/USD-1-10 | buy | 5 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "5" epochs + Then "referee1" should have vesting account balance of "8000" for asset "USD-1-10" + And "referee2" should have vesting account balance of "8000" for asset "USD-1-10" + And "referee3" should have vesting account balance of "4000" for asset "USD-1-10" + + Scenario: Party funds pool with recurring transfer scoping teams Given the parties submit the following recurring transfers: @@ -111,6 +145,8 @@ Feature: Maker fees paid reward metric calculated correctly for time window | referee3 | ETH/USD-1-10 | buy | 5 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | When the network moves ahead "1" epochs - Then "referee1" should have vesting account balance of "5000" for asset "USD-1-10" - And "referee2" should have vesting account balance of "2500" for asset "USD-1-10" - And "referee3" should have vesting account balance of "2500" for asset "USD-1-10" + # NB: the change here is because before we were returning the score for fees paid for 0 so when choosing the top n members we'd be looking at the top 2 scores out of the 3 + # so team2 would get a score of 0.6, now they get 0.3, and team1 gets 0.4 so team1 gets 0.4/0.7 and team2 gets 0.3/0.7 + Then "referee1" should have vesting account balance of "5714" for asset "USD-1-10" + And "referee2" should have vesting account balance of "2142" for asset "USD-1-10" + And "referee3" should have vesting account balance of "2142" for asset "USD-1-10" diff --git a/core/integration/features/verified/risk-parameters-ranges-test.feature b/core/integration/features/verified/risk-parameters-ranges-test.feature index c311916ce7..1f504d3d58 100644 --- a/core/integration/features/verified/risk-parameters-ranges-test.feature +++ b/core/integration/features/verified/risk-parameters-ranges-test.feature @@ -124,7 +124,7 @@ Feature: test risk model parameter ranges | network.markPriceUpdateMaximumFrequency | 0s | | limits.markets.maxPeggedOrders | 22 | - @Now @NoPerp @SLABug + @Now @SLABug Scenario: 001, test different value of risk parameters within defined ranges in different market, AC: 0018-RSKM-001 Given the liquidity monitoring parameters: @@ -452,7 +452,7 @@ Feature: test risk model parameter ranges | party1 | USD | ETH/MAR51 | 3021 | 49999999875869 | | | party2 | USD | ETH/MAR51 | 3021 | 49999999584845 | | -@Now @NoPerp + @Now Scenario: 002, test market ETH/MAR23 (tau=1) Given the liquidity monitoring parameters: @@ -519,7 +519,7 @@ Feature: test risk model parameter ranges # initial margin level for LP = 1000*9092*86.2176101*1.2=9.4e8 - @Now @NoPerp + @Now Scenario: 003, test market ETH/MAR52(sigma=10), Given the liquidity monitoring parameters: diff --git a/core/integration/features/verified/risk-parameters-sigma-test.feature b/core/integration/features/verified/risk-parameters-sigma-test.feature index ad50423fb2..6be89b99dd 100644 --- a/core/integration/features/verified/risk-parameters-sigma-test.feature +++ b/core/integration/features/verified/risk-parameters-sigma-test.feature @@ -41,7 +41,7 @@ Feature: test risk model parameter sigma | network.markPriceUpdateMaximumFrequency | 0s | | limits.markets.maxPeggedOrders | 2 | - @Now @NoPerp + @Now Scenario: 001, test market ETH/MAR53(sigma=50), Given the liquidity monitoring parameters: @@ -101,7 +101,7 @@ Feature: test risk model parameter sigma | party | market id | maintenance | search | initial | release | | party0 | ETH/MAR53 | 49999950000000 | 59999940000000 | 74999925000000 | 84999915000000 | - @Now @NoPerp + @Now Scenario: 002, test market ETH/MAR0 (kind of "normal" risk parameters setting), Given the liquidity monitoring parameters: diff --git a/core/integration/features/verified/verified-positions-resolution-2.feature b/core/integration/features/verified/verified-positions-resolution-2.feature index 4fc0477b35..4940f3d96d 100644 --- a/core/integration/features/verified/verified-positions-resolution-2.feature +++ b/core/integration/features/verified/verified-positions-resolution-2.feature @@ -9,7 +9,7 @@ Feature: Position resolution case 2 | market.auction.minimumDuration | 1 | | network.markPriceUpdateMaximumFrequency | 0s | - @Liquidation @NoPerp + @Liquidation Scenario: close out when there is not enough orders on the orderbook to cover the position (0008-TRAD-003, 0008-TRAD-004) # setup accounts Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/verified/verified-positions-resolution-3.feature b/core/integration/features/verified/verified-positions-resolution-3.feature index ab26c4a39b..da8b9109a1 100644 --- a/core/integration/features/verified/verified-positions-resolution-3.feature +++ b/core/integration/features/verified/verified-positions-resolution-3.feature @@ -9,7 +9,7 @@ Feature: Position resolution case 3 | market.auction.minimumDuration | 1 | | network.markPriceUpdateMaximumFrequency | 0s | - @Liquidation @NoPerp + @Liquidation Scenario: close out when there is enough orders on the orderbook to cover the position (0008-TRAD-002,0008-TRAD-003, 0008-TRAD-006) # setup accounts Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/zero-position.feature b/core/integration/features/zero-position.feature index 0f8be3b93a..1cc077f8f7 100644 --- a/core/integration/features/zero-position.feature +++ b/core/integration/features/zero-position.feature @@ -21,7 +21,7 @@ Feature: Closeout scenarios | network.markPriceUpdateMaximumFrequency | 0s | | limits.markets.maxPeggedOrders | 2 | - @ZeroPos @Liquidation @NoPerp + @ZeroPos @Liquidation Scenario: 001, 2 parties get close-out at the same time. Distressed position gets taken over by LP, distressed order gets canceled (0005-COLL-002; 0012-POSR-001; 0012-POSR-002; 0012-POSR-004; 0012-POSR-005; 0007-POSN-015) # setup accounts, we are trying to closeout trader3 first and then trader2 diff --git a/core/integration/main_test.go b/core/integration/main_test.go index fd683e82a0..fa686c0844 100644 --- a/core/integration/main_test.go +++ b/core/integration/main_test.go @@ -180,7 +180,7 @@ func InitializeScenario(s *godog.ScenarioContext) { return err }) s.Step(`^the spot markets:$`, func(table *godog.Table) error { - markets, err := steps.TheSpotMarkets(marketConfig, execsetup.executionEngine, execsetup.collateralEngine, execsetup.netParams, execsetup.timeService.GetTimeNow(), table) + markets, err := steps.TheSpotMarkets(marketConfig, execsetup.executionEngine, execsetup.collateralEngine, execsetup.timeService.GetTimeNow(), table) execsetup.markets = markets return err }) @@ -289,6 +289,14 @@ func InitializeScenario(s *godog.ScenarioContext) { return steps.PartyAddsTheFollowingOrdersToABatch(party, execsetup.executionEngine, execsetup.timeService, table) }) + s.Step(`^the party "([^"]+)" adds the following cancels to a batch:$`, func(party string, table *godog.Table) error { + return steps.PartyAddsTheFollowingCancelsToABatch(party, execsetup.executionEngine, execsetup.timeService, table) + }) + + s.Step(`^the party "([^"]+)" adds the following amends to a batch:$`, func(party string, table *godog.Table) error { + return steps.PartyAddsTheFollowingAmendsToABatch(party, execsetup.executionEngine, execsetup.timeService, table) + }) + s.Step(`^the party "([^"]+)" adds the following iceberg orders to a batch:$`, func(party string, table *godog.Table) error { return steps.PartyAddsTheFollowingIcebergOrdersToABatch(party, execsetup.executionEngine, execsetup.timeService, table) }) @@ -300,6 +308,9 @@ func InitializeScenario(s *godog.ScenarioContext) { s.Step(`^the party "([^"]+)" submits their batch instruction$`, func(party string) error { return steps.PartySubmitsTheirBatchInstruction(party, execsetup.executionEngine) }) + s.Step(`^the party "([^"]+)" submits their batch instruction with error "([^"]+)"$`, func(party, err string) error { + return steps.PartySubmitsTheirBatchInstructionWithError(party, err, execsetup.executionEngine) + }) s.Step(`^the parties place the following orders "([^"]+)" blocks apart:$`, func(blockCount string, table *godog.Table) error { return steps.PartiesPlaceTheFollowingOrdersBlocksApart(execsetup.executionEngine, execsetup.timeService, execsetup.block, execsetup.epochEngine, table, blockCount) @@ -346,6 +357,10 @@ func InitializeScenario(s *godog.ScenarioContext) { return steps.TheFollowingLPEventsShouldBeEmitted(execsetup.broker, table) }) + s.Step(`the following orders are cancelled on market "([^"]+)":$`, func(market string, table *godog.Table) error { + return steps.TheCancelledOrdersEventContains(execsetup.broker, market, table) + }) + // block time stuff s.Step(`^the average block duration is "([^"]+)" with variance "([^"]+)"$`, func(block, variance string) error { return steps.TheAverageBlockDurationWithVariance(execsetup.block, block, variance) diff --git a/core/integration/setup_test.go b/core/integration/setup_test.go index 405bdadec0..89ab69ca32 100644 --- a/core/integration/setup_test.go +++ b/core/integration/setup_test.go @@ -28,6 +28,7 @@ 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" @@ -126,6 +127,7 @@ type executionTestSetup struct { activityStreak *activitystreak.Engine vesting *vesting.Engine volumeDiscountProgram *volumediscount.Engine + marketActivityTracker *common.MarketActivityTracker } func newExecutionTestSetup() *executionTestSetup { @@ -166,7 +168,7 @@ func newExecutionTestSetup() *executionTestSetup { execsetup.witness = validators.NewWitness(ctx, execsetup.log, validators.NewDefaultConfig(), execsetup.topology, commander, execsetup.timeService) - eventForwarder := evtforward.NewNoopEngine(execsetup.log, evtforward.NewDefaultConfig()) + eventForwarder := evtforward.NewNoopEngine(execsetup.log, ethereum.Config{}) execsetup.oracleEngine = spec.NewEngine(execsetup.log, spec.NewDefaultConfig(), execsetup.timeService, execsetup.broker) execsetup.builtinOracle = spec.NewBuiltin(execsetup.oracleEngine, execsetup.timeService) @@ -180,19 +182,19 @@ func newExecutionTestSetup() *executionTestSetup { execsetup.stateVarEngine = stubs.NewStateVar() broker := bmocks.NewMockBroker(ctrl) broker.EXPECT().Send(gomock.Any()).AnyTimes() - marketActivityTracker := common.NewMarketActivityTracker(execsetup.log, execsetup.teamsEngine, execsetup.stakingAccount, broker) + execsetup.marketActivityTracker = common.NewMarketActivityTracker(execsetup.log, execsetup.teamsEngine, execsetup.stakingAccount, broker) execsetup.notary = notary.NewWithSnapshot(execsetup.log, notary.NewDefaultConfig(), execsetup.topology, execsetup.broker, commander) execsetup.assetsEngine = stubs.NewAssetStub() - execsetup.referralProgram = referral.NewEngine(execsetup.broker, execsetup.timeService, marketActivityTracker, execsetup.stakingAccount) + execsetup.referralProgram = referral.NewEngine(execsetup.broker, execsetup.timeService, execsetup.marketActivityTracker, execsetup.stakingAccount) execsetup.epochEngine.NotifyOnEpoch(execsetup.referralProgram.OnEpoch, execsetup.referralProgram.OnEpochRestore) - execsetup.volumeDiscountProgram = volumediscount.New(execsetup.broker, marketActivityTracker) + 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, marketActivityTracker, stubs.NewBridgeViewStub(), eventForwarder) + 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.executionEngine = newExEng( execution.NewEngine( @@ -203,7 +205,7 @@ func newExecutionTestSetup() *executionTestSetup { execsetup.oracleEngine, execsetup.broker, execsetup.stateVarEngine, - marketActivityTracker, + execsetup.marketActivityTracker, execsetup.assetsEngine, // assets execsetup.referralProgram, execsetup.volumeDiscountProgram, @@ -212,7 +214,7 @@ func newExecutionTestSetup() *executionTestSetup { execsetup.broker, ) execsetup.epochEngine.NotifyOnEpoch(execsetup.executionEngine.OnEpochEvent, execsetup.executionEngine.OnEpochRestore) - execsetup.epochEngine.NotifyOnEpoch(marketActivityTracker.OnEpochEvent, marketActivityTracker.OnEpochRestore) + execsetup.epochEngine.NotifyOnEpoch(execsetup.marketActivityTracker.OnEpochEvent, execsetup.marketActivityTracker.OnEpochRestore) execsetup.epochEngine.NotifyOnEpoch(execsetup.banking.OnEpoch, execsetup.banking.OnEpochRestore) execsetup.delegationEngine = delegation.New(execsetup.log, delegation.NewDefaultConfig(), execsetup.broker, execsetup.topology, execsetup.stakingAccount, execsetup.epochEngine, execsetup.timeService) @@ -221,7 +223,7 @@ func newExecutionTestSetup() *executionTestSetup { execsetup.epochEngine.NotifyOnEpoch(execsetup.activityStreak.OnEpochEvent, execsetup.activityStreak.OnEpochRestore) execsetup.vesting = vesting.New(execsetup.log, execsetup.collateralEngine, execsetup.activityStreak, execsetup.broker, execsetup.assetsEngine) - execsetup.rewardsEngine = rewards.New(execsetup.log, rewards.NewDefaultConfig(), execsetup.broker, execsetup.delegationEngine, execsetup.epochEngine, execsetup.collateralEngine, execsetup.timeService, marketActivityTracker, execsetup.topology, execsetup.vesting, execsetup.banking, execsetup.activityStreak) + 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. execsetup.epochEngine.NotifyOnEpoch(execsetup.vesting.OnEpochEvent, execsetup.vesting.OnEpochRestore) @@ -521,5 +523,9 @@ func (e *executionTestSetup) registerNetParamsCallbacks() error { Param: netparams.RewardsVestingBenefitTiers, Watcher: execsetup.vesting.OnBenefitTiersUpdate, }, + netparams.WatchParam{ + Param: netparams.MinEpochsInTeamForMetricRewardEligibility, + Watcher: execsetup.marketActivityTracker.OnMinEpochsInTeamForRewardEligibilityUpdated, + }, ) } diff --git a/core/integration/steps/cancelled_orders.go b/core/integration/steps/cancelled_orders.go new file mode 100644 index 0000000000..d3df5e5393 --- /dev/null +++ b/core/integration/steps/cancelled_orders.go @@ -0,0 +1,69 @@ +// 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 TheCancelledOrdersEventContains(broker *stubs.BrokerStub, market string, table *godog.Table) error { + allCancelled := broker.GetCancelledOrdersPerMarket() + cancelled, ok := allCancelled[market] + if !ok { + return fmt.Errorf("no cancelled orders event for market %s", market) + } + rows := parseReferenceTable(table) + for _, r := range rows { + rr := referenceRow{ + r: r, + } + o, err := broker.GetFirstByReference(rr.Party(), rr.Reference()) + if err != nil { + return err + } + if o.MarketId != market { + return fmt.Errorf("could not find order with reference %s for party %s and market %s", rr.Reference(), rr.Party(), market) + } + // now check if this ID was indeed emitted as part of a cancelled orders event. + if _, ok := cancelled[o.Id]; !ok { + return fmt.Errorf("order with reference %s for party %s and market %s (ID %s) missing from cancelled orders event", rr.Reference(), rr.Party(), market, o.Id) + } + } + return nil +} + +func parseReferenceTable(table *godog.Table) []RowWrapper { + return StrictParseTable(table, []string{ + "reference", + "party", + }, []string{}) +} + +type referenceRow struct { + r RowWrapper +} + +func (r referenceRow) Reference() string { + return r.r.MustStr("reference") +} + +func (r referenceRow) Party() string { + return r.r.MustStr("party") +} diff --git a/core/integration/steps/debug_transfers.go b/core/integration/steps/debug_transfers.go index aab41673bd..7a9957d7df 100644 --- a/core/integration/steps/debug_transfers.go +++ b/core/integration/steps/debug_transfers.go @@ -24,12 +24,12 @@ import ( func DebugTransfers(broker *stubs.BrokerStub, log *logging.Logger) { log.Info("DUMPING TRANSFERS") - s := fmt.Sprintf("\n\t|%37s |%89s |%89s |%12s |\n", "Type", "From", "To", "Amount") + s := fmt.Sprintf("\n\t|%38s |%85s |%85s |%19s |\n", "Type", "From", "To", "Amount") transferEvents := broker.GetLedgerMovements(false) for _, e := range transferEvents { for _, t := range e.LedgerMovements() { for _, v := range t.GetEntries() { - s += fmt.Sprintf("\t|%37s |%89s |%89s |%12s |\n", v.Type, v.FromAccount, v.ToAccount, v.Amount) + s += fmt.Sprintf("\t|%38s |%85s |%85s |%19s |\n", v.Type, v.FromAccount, v.ToAccount, v.Amount) } } } diff --git a/core/integration/steps/execution.go b/core/integration/steps/execution.go index 162b57480d..064a47ebe2 100644 --- a/core/integration/steps/execution.go +++ b/core/integration/steps/execution.go @@ -51,6 +51,8 @@ type Execution interface { // it is part of the execution engine StartBatch(party string) error AddSubmitOrderToBatch(submission *types.OrderSubmission, party string) error + AddCancelOrderToBatch(cancellation *types.OrderCancellation, party string) error + AddAmendOrderToBatch(amend *types.OrderAmendment, party string) error ProcessBatch(ctx context.Context, party string) error OnEpochEvent(ctx context.Context, epoch types.Epoch) UpdateMarketState(ctx context.Context, changes *types.MarketStateUpdateConfiguration) error diff --git a/core/integration/steps/market/defaults/liquidation-config/AC-013-strat.json b/core/integration/steps/market/defaults/liquidation-config/AC-013-strat.json index bf1aa2d901..6d93f5c820 100644 --- a/core/integration/steps/market/defaults/liquidation-config/AC-013-strat.json +++ b/core/integration/steps/market/defaults/liquidation-config/AC-013-strat.json @@ -2,5 +2,6 @@ "disposal_time_step": 10, "disposal_fraction": "0.5", "full_disposal_size": 50, - "max_fraction_consumed": "0.01" + "max_fraction_consumed": "0.01", + "disposal_slippage_range": "0.1" } diff --git a/core/integration/steps/market/defaults/liquidation-config/default-liquidation-strat.json b/core/integration/steps/market/defaults/liquidation-config/default-liquidation-strat.json index f3479abb0d..b588c88794 100644 --- a/core/integration/steps/market/defaults/liquidation-config/default-liquidation-strat.json +++ b/core/integration/steps/market/defaults/liquidation-config/default-liquidation-strat.json @@ -2,5 +2,6 @@ "disposal_time_step": 10, "disposal_fraction": "0.1", "full_disposal_size": 20, - "max_fraction_consumed": "0.05" + "max_fraction_consumed": "0.05", + "disposal_slippage_range": "0.1" } diff --git a/core/integration/steps/market/defaults/liquidation-config/legacy-liquidation-strategy.json b/core/integration/steps/market/defaults/liquidation-config/legacy-liquidation-strategy.json index d1e1b7ff1a..c4326c07d3 100644 --- a/core/integration/steps/market/defaults/liquidation-config/legacy-liquidation-strategy.json +++ b/core/integration/steps/market/defaults/liquidation-config/legacy-liquidation-strategy.json @@ -2,5 +2,6 @@ "disposal_time_step": 0, "disposal_fraction": "1", "full_disposal_size": 18446744073709551615, - "max_fraction_consumed": "1" + "max_fraction_consumed": "1", + "disposal_slippage_range": "10" } diff --git a/core/integration/steps/market/defaults/liquidation-config/slow-liquidation-strat.json b/core/integration/steps/market/defaults/liquidation-config/slow-liquidation-strat.json index ca90c3c07e..7b158419fa 100644 --- a/core/integration/steps/market/defaults/liquidation-config/slow-liquidation-strat.json +++ b/core/integration/steps/market/defaults/liquidation-config/slow-liquidation-strat.json @@ -2,6 +2,7 @@ "disposal_time_step": 100, "disposal_fraction": "0.2", "full_disposal_size": 1, - "max_fraction_consumed": "0.2" + "max_fraction_consumed": "0.2", + "disposal_slippage_range": "0.5" } diff --git a/core/integration/steps/parties_cancel_all_their_orders_for_the_markets.go b/core/integration/steps/parties_cancel_all_their_orders_for_the_markets.go index 376c9b8b22..f056339916 100644 --- a/core/integration/steps/parties_cancel_all_their_orders_for_the_markets.go +++ b/core/integration/steps/parties_cancel_all_their_orders_for_the_markets.go @@ -21,7 +21,6 @@ import ( "code.vegaprotocol.io/vega/core/integration/stubs" "code.vegaprotocol.io/vega/core/types" - "code.vegaprotocol.io/vega/protos/vega" "github.com/cucumber/godog" ) @@ -33,26 +32,14 @@ func PartiesCancelAllTheirOrdersForTheMarkets( ) error { for _, r := range parseCancelAllOrderTable(table) { row := cancelAllOrderRow{row: r} - party := row.Party() - - orders := broker.GetOrdersByPartyAndMarket(party, row.MarketID()) - - dedupOrders := map[string]vega.Order{} - for _, o := range orders { - dedupOrders[o.Reference] = o + cancel := types.OrderCancellation{ + MarketID: row.MarketID(), } - - for _, o := range dedupOrders { - cancel := types.OrderCancellation{ - OrderID: o.Id, - MarketID: o.MarketId, - } - _, err := exec.CancelOrder(context.Background(), &cancel, party) - err = checkExpectedError(row, err, nil) - if err != nil { - return err - } + _, err := exec.CancelOrder(context.Background(), &cancel, party) + err = checkExpectedError(row, err, nil) + if err != nil { + return err } } diff --git a/core/integration/steps/parties_place_the_following_orders.go b/core/integration/steps/parties_place_the_following_orders.go index ccbcfa2a87..bb1c95ac8b 100644 --- a/core/integration/steps/parties_place_the_following_orders.go +++ b/core/integration/steps/parties_place_the_following_orders.go @@ -298,10 +298,68 @@ func PartyAddsTheFollowingOrdersToABatch(party string, exec Execution, time *stu return nil } +func PartyAddsTheFollowingCancelsToABatch(party string, exec Execution, time *stubs.TimeStub, table *godog.Table) error { + // ensure time is set + idgen is not nil + now := time.GetTimeNow() + time.SetTime(now) + for _, r := range parseAddCancelToBatchTable(table) { + row := newCancelOrderInBatchRow(r) + + // Convert the reference into a orderID + orderID := refToOrderId[row.Reference()] + orderCancel := types.OrderCancellation{ + MarketID: row.MarketID(), + OrderID: orderID, + } + if err := exec.AddCancelOrderToBatch(&orderCancel, party); err != nil { + return err + } + } + return nil +} + +func PartyAddsTheFollowingAmendsToABatch(party string, exec Execution, time *stubs.TimeStub, table *godog.Table) error { + // ensure time is set + idgen is not nil + now := time.GetTimeNow() + time.SetTime(now) + for _, r := range parseAddAmendToBatchTable(table) { + row := newAmendOrderInBatchRow(r) + + // Convert the reference into a orderID + orderID := refToOrderId[row.Reference()] + orderAmend := types.OrderAmendment{ + OrderID: orderID, + Price: row.Price(), + SizeDelta: row.SizeDelta(), + MarketID: row.MarketID(), + Size: row.Size(), + ExpiresAt: row.ExpiresAt(), + TimeInForce: row.TimeInForce(), + PeggedOffset: row.PeggedOffset(), + PeggedReference: row.PeggedReference(), + } + if err := exec.AddAmendOrderToBatch(&orderAmend, party); err != nil { + return err + } + } + return nil +} + func PartySubmitsTheirBatchInstruction(party string, exec Execution) error { return exec.ProcessBatch(context.Background(), party) } +func PartySubmitsTheirBatchInstructionWithError(party, err string, exec Execution) error { + retErr := exec.ProcessBatch(context.Background(), party) + + err = fmt.Sprintf("1 (%s)", err) + re := retErr.Error() + if re != err { + return retErr + } + return nil +} + func PartyStartsABatchInstruction(party string, exec Execution) error { return exec.StartBatch(party) } @@ -478,6 +536,111 @@ func parseAddOrderToBatchTable(table *godog.Table) []RowWrapper { }) } +func parseAddCancelToBatchTable(table *godog.Table) []RowWrapper { + return StrictParseTable(table, []string{ + "market id", + "reference", + }, []string{}) +} + +func parseAddAmendToBatchTable(table *godog.Table) []RowWrapper { + return StrictParseTable(table, []string{ + "market id", + "reference", + }, []string{ + "price", + "size", + "size delta", + "expires at", + "tif", + "pegged offset", + "pegged reference", + }) +} + +type cancelOrderInBatchRow struct { + row RowWrapper +} + +func newCancelOrderInBatchRow(r RowWrapper) cancelOrderInBatchRow { + row := cancelOrderInBatchRow{ + row: r, + } + return row +} + +func (r cancelOrderInBatchRow) MarketID() string { + return r.row.MustStr("market id") +} + +func (r cancelOrderInBatchRow) Reference() string { + return r.row.MustStr("reference") +} + +type amendOrderInBatchRow struct { + row RowWrapper +} + +func newAmendOrderInBatchRow(r RowWrapper) amendOrderInBatchRow { + row := amendOrderInBatchRow{ + row: r, + } + return row +} + +func (r amendOrderInBatchRow) MarketID() string { + return r.row.MustStr("market id") +} + +func (r amendOrderInBatchRow) Price() *num.Uint { + return r.row.MustUint("price") +} + +func (r amendOrderInBatchRow) PeggedOffset() *num.Uint { + if !r.row.HasColumn("pegged offset") { + return nil + } + return r.row.MustUint("pegged offset") +} + +func (r amendOrderInBatchRow) PeggedReference() types.PeggedReference { + if !r.row.HasColumn("pegged reference") { + return types.PeggedReferenceUnspecified + } + return r.row.MustPeggedReference("pegged reference") +} + +func (r amendOrderInBatchRow) SizeDelta() int64 { + if !r.row.HasColumn("size delta") { + return 0 + } + return r.row.MustI64("size delta") +} + +func (r amendOrderInBatchRow) Size() *uint64 { + if !r.row.HasColumn("size") { + return nil + } + size := r.row.MustU64("size") + return &size +} + +func (r amendOrderInBatchRow) ExpiresAt() *int64 { + if !r.row.HasColumn("expires at") { + return nil + } + expires := r.row.MustI64("expires at") + return &expires +} + +func (r amendOrderInBatchRow) TimeInForce() types.OrderTimeInForce { + return r.row.MustTIF("tif") +} + +func (r amendOrderInBatchRow) Reference() string { + return r.row.MustStr("reference") +} + type submitOrderRow struct { row RowWrapper } 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 42152c8fdd..1398961dcf 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 @@ -53,6 +53,9 @@ func positionAPIProduceTheFollowingRow(positionService *plugins.Positions, row p p, err := positionService.GetPositionsByMarketAndParty(row.market(), party) pos = []*types.Position{p} if err != nil { + if row.volume() == 0 && row.realisedPNL().IsZero() && row.unrealisedPNL().IsZero() { + return nil + } return errCannotGetPositionForParty(party, err) } } else { @@ -60,6 +63,9 @@ func positionAPIProduceTheFollowingRow(positionService *plugins.Positions, row p } if err != nil { + if row.volume() == 0 && row.realisedPNL().IsZero() && row.unrealisedPNL().IsZero() { + return nil + } return errCannotGetPositionForParty(party, err) } @@ -79,6 +85,9 @@ func positionAPIProduceTheFollowingRow(positionService *plugins.Positions, row p } if len(pos) == 0 { + if row.volume() == 0 && row.realisedPNL().IsZero() && row.unrealisedPNL().IsZero() { + return nil + } return errNoPositionForMarket(row.party()) } diff --git a/core/integration/steps/table_wrapper.go b/core/integration/steps/table_wrapper.go index 319885bdac..57a591c226 100644 --- a/core/integration/steps/table_wrapper.go +++ b/core/integration/steps/table_wrapper.go @@ -299,6 +299,12 @@ func (r RowWrapper) U32(name string) uint32 { return uint32(value) } +func (r RowWrapper) I32(name string) int32 { + value, err := strconv.ParseInt(r.values[name], 10, 32) + panicW(name, err) + return int32(value) +} + func (r RowWrapper) MustU64Slice(name, sep string) []uint64 { value, err := U64Slice(r.mustColumn(name), sep) panicW(name, err) diff --git a/core/integration/steps/the_following_transfers_should_happen.go b/core/integration/steps/the_following_transfers_should_happen.go index d33d1f3dfc..ffa8140fde 100644 --- a/core/integration/steps/the_following_transfers_should_happen.go +++ b/core/integration/steps/the_following_transfers_should_happen.go @@ -128,7 +128,12 @@ func (r transferRow) ToAccount() vegapb.AccountType { } func (r transferRow) ToAccountID() string { - return AccountID(r.MarketID(), r.To(), r.Asset(), r.ToAccount()) + mID := r.MarketID() + ta := r.ToAccount() + if ta == vegapb.AccountType_ACCOUNT_TYPE_NETWORK_TREASURY { + mID = "" + } + return AccountID(mID, r.To(), r.Asset(), ta) } func (r transferRow) MarketID() string { diff --git a/core/integration/steps/the_iceberg_orders_should_have_the_following_states.go b/core/integration/steps/the_iceberg_orders_should_have_the_following_states.go index 9c988a40e0..19943d0bf6 100644 --- a/core/integration/steps/the_iceberg_orders_should_have_the_following_states.go +++ b/core/integration/steps/the_iceberg_orders_should_have_the_following_states.go @@ -20,6 +20,7 @@ import ( "code.vegaprotocol.io/vega/core/events" "code.vegaprotocol.io/vega/core/integration/stubs" + proto "code.vegaprotocol.io/vega/protos/vega" "github.com/cucumber/godog" ) @@ -49,9 +50,17 @@ func TheIcebergOrdersShouldHaveTheFollowingStates(broker *stubs.BrokerStub, tabl ref, hasRef := row.StrB("reference") reservedRemaining := row.MustU64("reserved volume") + checkCancel := status == proto.Order_STATUS_CANCELLED + match := false for _, e := range data { o := e.Order() + // just set to cancelled, we may be applying the status change too soon, but that doesn't matter. + // if we're applying this too soon, then the size/remaining/visible fields won't match. Subsequent events + // cancellation only applies to the last order event anyway. + if checkCancel && broker.IsCancelledOrder(o.MarketId, o.PartyId, o.Id) { + o.Status = proto.Order_STATUS_CANCELLED + } if hasRef { if ref != o.Reference { continue diff --git a/core/integration/steps/the_liquidation_strategy.go b/core/integration/steps/the_liquidation_strategy.go index 1f9dce0ef2..4ce274dafd 100644 --- a/core/integration/steps/the_liquidation_strategy.go +++ b/core/integration/steps/the_liquidation_strategy.go @@ -43,6 +43,7 @@ func parseLiquidationStrategyTable(table *godog.Table) []RowWrapper { "disposal fraction", "full disposal size", "max fraction consumed", + "disposal slippage range", }, nil) } @@ -56,6 +57,7 @@ func (l lsRow) liquidationStrategy() *types.LiquidationStrategy { DisposalFraction: l.disposalFraction(), FullDisposalSize: l.fullDisposalSize(), MaxFractionConsumed: l.maxFraction(), + DisposalSlippage: l.disposalSlippage(), } } @@ -79,3 +81,7 @@ func (l lsRow) fullDisposalSize() uint64 { func (l lsRow) maxFraction() num.Decimal { return l.r.MustDecimal("max fraction consumed") } + +func (l lsRow) disposalSlippage() num.Decimal { + return l.r.MustDecimal("disposal slippage range") +} 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 037694866b..e96825f02a 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 @@ -72,9 +72,11 @@ func TheMarketStateIsUpdatedTo(exec Execution, data *godog.Table) error { row: r, } changes := &vtypes.MarketStateUpdateConfiguration{ - MarketID: mu.MarketID(), - SettlementPrice: mu.SettlementPrice(), - UpdateType: mu.MarketStateUpdate(), + MarketID: mu.MarketID(), + UpdateType: mu.MarketStateUpdate(), + } + if r.HasColumn("settlement price") { + changes.SettlementPrice = mu.SettlementPrice() } if err := exec.UpdateMarketState(ctx, changes); err != nil { return err @@ -91,8 +93,7 @@ func parseStateUpdate(data *godog.Table) []RowWrapper { return StrictParseTable(data, []string{ "market id", "state", - "settlement price", - }, nil) + }, []string{"settlement price"}) } func errMismatchedMarketState(market string, expectedMarketState, marketState types.Market_State) error { diff --git a/core/integration/steps/the_markets.go b/core/integration/steps/the_markets.go index 3fedb58a3e..a28fc9c95c 100644 --- a/core/integration/steps/the_markets.go +++ b/core/integration/steps/the_markets.go @@ -183,7 +183,9 @@ func enableVoteAsset(collateralEngine *collateral.Engine) error { err := collateralEngine.EnableAsset(context.Background(), voteAsset) if err != nil { - return fmt.Errorf("couldn't enable asset(%s): %v", voteAsset.ID, err) + if err != collateral.ErrAssetAlreadyEnabled { + return fmt.Errorf("couldn't enable asset(%s): %v", voteAsset.ID, err) + } } return nil } diff --git a/core/integration/steps/the_orders_should_have_the_following_states.go b/core/integration/steps/the_orders_should_have_the_following_states.go index 3e44b55ea9..15666423dd 100644 --- a/core/integration/steps/the_orders_should_have_the_following_states.go +++ b/core/integration/steps/the_orders_should_have_the_following_states.go @@ -19,6 +19,7 @@ import ( "fmt" "code.vegaprotocol.io/vega/core/integration/stubs" + types "code.vegaprotocol.io/vega/protos/vega" "github.com/cucumber/godog" ) @@ -36,15 +37,21 @@ func TheOrdersShouldHaveTheFollowingStates(broker *stubs.BrokerStub, table *godo status := row.MustOrderStatus("status") ref, hasRef := row.StrB("reference") + checkCancel := status == types.Order_STATUS_CANCELLED + match := false for i := len(orderEvents) - 1; i >= 0; i-- { e := orderEvents[i] o := e.Order() + cancelled := false + if checkCancel { + cancelled = broker.IsCancelledOrder(marketID, party, o.Id) + } if hasRef { if ref != o.Reference { continue } - if o.PartyId == party && o.Status == status && o.MarketId == marketID && o.Side == side { + if o.PartyId == party && (o.Status == status || cancelled) && o.MarketId == marketID && o.Side == side { if o.Size != size || stringToU64(o.Price) != price || o.Remaining != remaining { return formatDiff(fmt.Sprintf("the order didn't match the expectation for reference %q", ref), map[string]string{ @@ -61,7 +68,7 @@ func TheOrdersShouldHaveTheFollowingStates(broker *stubs.BrokerStub, table *godo } } } - if o.PartyId != party || o.Status != status || o.MarketId != marketID || o.Side != side || o.Size != size || stringToU64(o.Price) != price || o.Remaining != remaining { + if o.PartyId != party || (o.Status != status && !cancelled) || o.MarketId != marketID || o.Side != side || o.Size != size || stringToU64(o.Price) != price || o.Remaining != remaining { continue } match = true diff --git a/core/integration/steps/the_pegged_orders_should_have_the_following_states.go b/core/integration/steps/the_pegged_orders_should_have_the_following_states.go index 88644214f3..a83cbccfd2 100644 --- a/core/integration/steps/the_pegged_orders_should_have_the_following_states.go +++ b/core/integration/steps/the_pegged_orders_should_have_the_following_states.go @@ -37,10 +37,12 @@ func ThePeggedOrdersShouldHaveTheFollowingStates(broker *stubs.BrokerStub, table price := row.price() status := row.status() + checkCancel := status == proto.Order_STATUS_CANCELLED + match := false for _, e := range data { o := e.Order() - if o.PartyId != party || o.Status != status || o.MarketId != marketID || o.Side != side || o.Size != volume || stringToU64(o.Price) != price { + if o.PartyId != party || (o.Status != status && !checkCancel) || o.MarketId != marketID || o.Side != side || o.Size != volume || stringToU64(o.Price) != price { continue } if o.PeggedOrder == nil { @@ -49,6 +51,12 @@ func ThePeggedOrdersShouldHaveTheFollowingStates(broker *stubs.BrokerStub, table if o.PeggedOrder.Offset != offset.String() || o.PeggedOrder.Reference != reference { continue } + // all but status matches, check if the order is cancelled as expected + if checkCancel && o.Status != status { + if !broker.IsCancelledOrder(o.MarketId, o.PartyId, o.Id) { + continue + } + } match = true break } diff --git a/core/integration/steps/the_spot_markets.go b/core/integration/steps/the_spot_markets.go index 7055b101e3..50e53f88c8 100644 --- a/core/integration/steps/the_spot_markets.go +++ b/core/integration/steps/the_spot_markets.go @@ -71,12 +71,12 @@ func updateSpotMarkets(markets []*types.Market, updates []types.UpdateSpotMarket return nil } -func TheSpotMarkets(config *market.Config, executionEngine Execution, collateralEngine *collateral.Engine, netparams *netparams.Store, now time.Time, table *godog.Table) ([]types.Market, error) { +func TheSpotMarkets(config *market.Config, executionEngine Execution, collateralEngine *collateral.Engine, now time.Time, table *godog.Table) ([]types.Market, error) { rows := parseSpotMarketsTable(table) markets := make([]types.Market, 0, len(rows)) for _, row := range rows { - mkt := newSpotMarket(config, netparams, spotMarketRow{row: row}) + mkt := newSpotMarket(config, spotMarketRow{row: row}) markets = append(markets, mkt) } @@ -137,19 +137,7 @@ func (r spotMarketRow) liquidityMonitoring() string { return r.row.MustStr("liquidity monitoring") } -func setSpotLiquidityMonitoringNetParams(liqMon *types.LiquidityMonitoringParameters, netparams *netparams.Store) { - // the governance engine would fill in the liquidity monitor parameters from the network parameters (unless set explicitly) - // so we do this step here manually - if tw, err := netparams.GetDuration("market.stake.target.timeWindow"); err == nil { - liqMon.TargetStakeParameters.TimeWindow = int64(tw.Seconds()) - } - - if sf, err := netparams.GetDecimal("market.stake.target.scalingFactor"); err == nil { - liqMon.TargetStakeParameters.ScalingFactor = sf - } -} - -func newSpotMarket(config *market.Config, netparams *netparams.Store, row spotMarketRow) types.Market { +func newSpotMarket(config *market.Config, row spotMarketRow) types.Market { fees, err := config.FeesConfig.Get(row.fees()) if err != nil { panic(err) @@ -170,8 +158,6 @@ func newSpotMarket(config *market.Config, netparams *netparams.Store, row spotMa panic(err) } - setSpotLiquidityMonitoringNetParams(liqMon, netparams) - m := types.Market{ TradingMode: types.MarketTradingModeContinuous, State: types.MarketStateActive, @@ -251,6 +237,17 @@ func spotMarketUpdate(config *market.Config, existing *types.Market, row spotMar update.Changes.SLAParams = types.LiquiditySLAParamsFromProto(slaParams) } + update.Changes.LiquidityFeeSettings = existing.Fees.LiquidityFeeSettings + if liquidityFeeSettings, ok := row.tryLiquidityFeeSettings(); ok { + settings, err := config.FeesConfig.Get(liquidityFeeSettings) + if err != nil { + panic(err) + } + s := types.LiquidityFeeSettingsFromProto(settings.LiquidityFeeSettings) + existing.Fees.LiquidityFeeSettings = s + update.Changes.LiquidityFeeSettings = s + } + // risk model if rm, ok := row.riskModel(); ok { tip := existing.TradableInstrument.IntoProto() @@ -304,6 +301,7 @@ func parseSpotMarketsTable(table *godog.Table) []RowWrapper { "decimal places", "position decimal places", "tick size", + "liquidity monitoring", }) } @@ -407,6 +405,14 @@ func (r spotMarketUpdateRow) liquidityMonitoring() (string, bool) { return "", false } +func (r spotMarketUpdateRow) tryLiquidityFeeSettings() (string, bool) { + if r.row.HasColumn("liquidity fee settings") { + s := r.row.MustStr("liquidity fee settings") + return s, true + } + return "", false +} + func (r spotMarketUpdateRow) slaParams() (string, bool) { if r.row.HasColumn("sla params") { lm := r.row.MustStr("sla params") diff --git a/core/integration/steps/transfers.go b/core/integration/steps/transfers.go index 40e38978bf..909bf9051e 100644 --- a/core/integration/steps/transfers.go +++ b/core/integration/steps/transfers.go @@ -154,7 +154,7 @@ func PartiesSubmitRecurringTransfers( func parseRecurringTransferTable(table *godog.Table) []RowWrapper { return StrictParseTable(table, []string{ "id", "from", "from_account_type", "to", "to_account_type", "asset", "amount", "start_epoch", "end_epoch", "factor", - }, []string{"metric", "metric_asset", "markets", "lock_period", "window_length", "entity_scope", "individual_scope", "teams", "ntop", "staking_requirement", "notional_requirement", "distribution_strategy", "ranks", "error"}) + }, []string{"metric", "metric_asset", "markets", "lock_period", "window_length", "entity_scope", "individual_scope", "teams", "ntop", "staking_requirement", "notional_requirement", "distribution_strategy", "ranks", "cap_reward_fee_multiple", "transfer_interval", "error"}) } func rowToRecurringTransfer(r RowWrapper) *types.RecurringTransfer { @@ -192,6 +192,12 @@ func rowToRecurringTransfer(r RowWrapper) *types.RecurringTransfer { windowLength = r.U64("window_length") } + var transferInterval *int32 + if r.HasColumn("transfer_interval") { + interval := r.I32("transfer_interval") + transferInterval = &interval + } + distributionStrategy := proto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA var ranks []*proto.Rank if r.HasColumn("distribution_strategy") { @@ -250,12 +256,16 @@ func rowToRecurringTransfer(r RowWrapper) *types.RecurringTransfer { stakingRequirement := "" notionalRequirement := "" + capRewardFeeMultiple := "" if r.HasColumn("staking_requirement") { stakingRequirement = r.MustStr("staking_requirement") } if r.HasColumn("notional_requirement") { notionalRequirement = r.mustColumn("notional_requirement") } + if r.HasColumn("cap_reward_fee_multiple") { + capRewardFeeMultiple = r.MustStr("cap_reward_fee_multiple") + } dispatchStrategy = &proto.DispatchStrategy{ AssetForMetric: r.MustStr("metric_asset"), @@ -270,7 +280,11 @@ func rowToRecurringTransfer(r RowWrapper) *types.RecurringTransfer { NTopPerformers: ntop, StakingRequirement: stakingRequirement, NotionalTimeWeightedAveragePositionRequirement: notionalRequirement, - RankTable: ranks, + RankTable: ranks, + TransferInterval: transferInterval, + } + if capRewardFeeMultiple != "" { + dispatchStrategy.CapRewardFeeMultiple = &capRewardFeeMultiple } } diff --git a/core/integration/stubs/broker_stub.go b/core/integration/stubs/broker_stub.go index 4d556b9fcb..538a61d3c4 100644 --- a/core/integration/stubs/broker_stub.go +++ b/core/integration/stubs/broker_stub.go @@ -288,6 +288,7 @@ func (b *BrokerStub) GetBookDepth(market string) (sell map[string]uint64, buy ma if len(batch) == 0 { return nil, nil } + cancelled := b.GetImmBatch(events.CancelledOrdersEvent) expForMarket := map[string]struct{}{} for _, e := range exp { switch et := e.(type) { @@ -307,6 +308,26 @@ func (b *BrokerStub) GetBookDepth(market string) (sell map[string]uint64, buy ma } } } + // add cancelled orders to expired for market, we skip them for market depth, + // so no need to differentiate between cancelled/expired. + for _, c := range cancelled { + switch et := c.(type) { + case *events.CancelledOrders: + if !et.IsMarket(market) { + continue + } + for _, oid := range et.OrderIDs() { + expForMarket[oid] = struct{}{} + } + case events.CancelledOrders: + if !et.IsMarket(market) { + continue + } + for _, oid := range et.OrderIDs() { + expForMarket[oid] = struct{}{} + } + } + } // first get all active orders activeOrders := map[string]*vegapb.Order{} @@ -531,6 +552,40 @@ func (b *BrokerStub) GetOrderEvents() []events.Order { return ret } +func (b *BrokerStub) GetCancelledOrderEvents() []events.CancelledOrders { + batch := b.GetBatch(events.CancelledOrdersEvent) + if len(batch) == 0 { + return nil + } + ret := make([]events.CancelledOrders, 0, len(batch)) + for _, e := range batch { + switch et := e.(type) { + case events.CancelledOrders: + ret = append(ret, et) + case *events.CancelledOrders: + ret = append(ret, *et) + } + } + return ret +} + +func (b *BrokerStub) GetCancelledOrdersPerMarket() map[string]map[string]struct{} { + evts := b.GetCancelledOrderEvents() + ret := map[string]map[string]struct{}{} + for _, e := range evts { + mID := e.MarketID() + oIDs := map[string]struct{}{} + if data, ok := ret[mID]; ok { + oIDs = data + } + for _, oid := range e.OrderIDs() { + oIDs[oid] = struct{}{} + } + ret[mID] = oIDs + } + return ret +} + func (b *BrokerStub) GetLPEvents() []events.LiquidityProvision { batch := b.GetBatch(events.LiquidityProvisionEvent) if len(batch) == 0 { @@ -1147,11 +1202,44 @@ func (b *BrokerStub) GetByReference(party, ref string) (vegapb.Order, error) { } } if matched { + if b.IsCancelledOrder(last.MarketId, party, last.Id) { + last.Status = vegapb.Order_STATUS_CANCELLED + } return last, nil } return vegapb.Order{}, fmt.Errorf("no order for party %v and reference %v", party, ref) } +func (b *BrokerStub) IsCancelledOrder(mkt, party, id string) bool { + batch := b.GetImmBatch(events.CancelledOrdersEvent) + if len(batch) == 0 { + return false + } + for _, e := range batch { + switch et := e.(type) { + case *events.CancelledOrders: + if !et.IsMarket(mkt) || !et.IsParty(party) { + continue + } + for _, oid := range et.OrderIDs() { + if oid == id { + return true + } + } + case events.CancelledOrders: + if !et.IsMarket(mkt) || !et.IsParty(party) { + continue + } + for _, oid := range et.OrderIDs() { + if oid == id { + return true + } + } + } + } + return false +} + func (b *BrokerStub) GetStopByReference(party, ref string) (eventspb.StopOrderEvent, error) { data := b.GetStopOrderEvents() diff --git a/core/liquidity/target/spot/engine.go b/core/liquidity/target/spot/engine.go index 878264c931..568391bf74 100644 --- a/core/liquidity/target/spot/engine.go +++ b/core/liquidity/target/spot/engine.go @@ -105,7 +105,7 @@ func (e *Engine) GetTargetStake(now time.Time) *num.Uint { e.computeMaxTotalStake(minTime) } - value, _ := num.UintFromDecimal(num.DecimalFromInt64(int64(e.max.TotalStake)).Mul(e.sFactor).Div(e.positionFactor)) + value, _ := num.UintFromDecimal(num.DecimalFromInt64(int64(e.max.TotalStake)).Mul(e.sFactor)) return value } diff --git a/core/liquidity/v2/sla.go b/core/liquidity/v2/sla.go index 8ca46b332f..f2113771cd 100644 --- a/core/liquidity/v2/sla.go +++ b/core/liquidity/v2/sla.go @@ -46,6 +46,7 @@ func (e *Engine) ResetSLAEpoch( } for party, commitment := range e.slaPerformance { + commitment.start = time.Time{} if e.doesLPMeetsCommitment(party, markPrice, midPrice, positionFactor) { commitment.start = now } @@ -87,8 +88,7 @@ func (e *Engine) calculateCurrentTimeBookFraction(now, start time.Time, s time.D if lNano > 0 { timeBookFraction = num.DecimalFromInt64(s.Nanoseconds()).Div(num.DecimalFromInt64(lNano)) } - - return timeBookFraction + return num.MinD(num.DecimalOne(), timeBookFraction) } // CalculateSLAPenalties should be called at the and of epoch to calculate SLA penalties based on LP performance in the epoch. diff --git a/core/liquidity/v2/sla_test.go b/core/liquidity/v2/sla_test.go index 0083862eaa..b6fc06dd2f 100644 --- a/core/liquidity/v2/sla_test.go +++ b/core/liquidity/v2/sla_test.go @@ -555,3 +555,73 @@ func TestSLAPerformanceBondPenalty(t *testing.T) { }) } } + +func TestSLAParamChangePushesOutOfCommitment(t *testing.T) { + te := newTestEngine(t) + slaParams := te.defaultSLAParams.DeepClone() + te.engine.UpdateMarketConfig(te.riskModel, te.priceMonitor) + te.engine.UpdateSLAParameters(slaParams) + + idGen := &stubIDGen{} + ctx := context.Background() + party := "lp-party-1" + + te.broker.EXPECT().Send(gomock.Any()).AnyTimes() + te.auctionState.EXPECT().IsOpeningAuction().Return(false).AnyTimes() + + lps := &types.LiquidityProvisionSubmission{ + MarketID: te.marketID, + CommitmentAmount: num.NewUint(100), + Fee: num.NewDecimalFromFloat(0.5), + Reference: fmt.Sprintf("provision-by-%s", party), + } + + buyOrdersPerBlock := [][]uint64{{15, 15, 17, 18, 12, 12, 12}, {15, 15, 17, 18, 12, 12, 12}, {15, 15, 17, 18, 12, 12, 12}} + sellsOrdersPerBlock := [][]uint64{{15, 15, 17, 18, 12, 12, 12}, {15, 15, 17, 18, 12, 12, 12}, {15, 15, 17, 18, 12, 12, 12}} + + _, err := te.engine.SubmitLiquidityProvision(ctx, lps, party, idGen) + require.NoError(t, err) + + one := num.UintOne() + positionFactor := num.DecimalOne() + midPrice := num.NewUint(15) + + epochLength := time.Duration(100) * time.Second + epochStart := time.Now() + epochEnd := time.Now().Add(epochLength) + epochEndAgain := time.Now().Add(2 * epochLength) + + te.engine.ResetSLAEpoch(epochStart, one, midPrice, positionFactor) + + te.engine.ApplyPendingProvisions(ctx, epochStart) + + te.auctionState.EXPECT().InAuction().Return(false).AnyTimes() + + te.orderbook.EXPECT().GetLastTradedPrice().Return(num.NewUint(15)).AnyTimes() + te.orderbook.EXPECT().GetIndicativePrice().Return(num.NewUint(15)).AnyTimes() + + orders := []*types.Order{} + te.orderbook.EXPECT().GetOrdersPerParty(party).DoAndReturn(func(party string) []*types.Order { + return orders + }).AnyTimes() + + orders = generateOrders(*idGen, te.marketID, buyOrdersPerBlock[0], sellsOrdersPerBlock[0]) + + te.tsvc.SetTime(epochStart) + te.engine.EndBlock(one, midPrice, positionFactor) + + // LP meets commitment right up til the end of the epoch + te.tsvc.SetTime(epochEnd) + te.engine.EndBlock(one, midPrice, positionFactor) + te.engine.CalculateSLAPenalties(epochEnd) + stats := te.engine.LiquidityProviderSLAStats(epochEnd) + require.Equal(t, "1", stats[0].CurrentEpochFractionOfTimeOnBook) + + // now update the params so that the new update parameters mean they do not meet the commitment + te.engine.ResetSLAEpoch(epochEnd, one, num.NewUint(15000), positionFactor) + + // at the end of the next epoch the time on book should be 0 + te.engine.CalculateSLAPenalties(epochEndAgain) + stats = te.engine.LiquidityProviderSLAStats(epochEndAgain) + require.Equal(t, "0", stats[0].CurrentEpochFractionOfTimeOnBook) +} diff --git a/core/liquidity/v2/snapshot.go b/core/liquidity/v2/snapshot.go index 3557879b7a..18cc9efe8a 100644 --- a/core/liquidity/v2/snapshot.go +++ b/core/liquidity/v2/snapshot.go @@ -319,7 +319,7 @@ func (e *snapshotV2) serialiseScores() ([]byte, error) { } var lastFeeDistributionTime int64 - if e.lastFeeDistribution != (time.Time{}) { + if !e.lastFeeDistribution.IsZero() { lastFeeDistributionTime = e.lastFeeDistribution.UnixNano() } @@ -485,7 +485,11 @@ func (e *snapshotV2) loadScores(ls *snapshotpb.LiquidityV2Scores, p *types.Paylo var err error e.nAvg = int64(ls.RunningAverageCounter) - e.lastFeeDistribution = time.Unix(0, ls.LastFeeDistributionTime) + if ls.LastFeeDistributionTime == 0 { + e.lastFeeDistribution = time.Time{} + } else { + e.lastFeeDistribution = time.Unix(0, ls.LastFeeDistributionTime) + } if ls.FeeCalculationTimeStep != 0 { e.feeCalculationTimeStep = time.Duration(ls.FeeCalculationTimeStep) @@ -514,6 +518,10 @@ func (e *snapshotV2) loadParameters(ls *snapshotpb.LiquidityV2Parameters, p *typ // market SLA parameters e.slaParams = types.LiquiditySLAParamsFromProto(ls.MarketSlaParameters) + one := num.DecimalOne() + e.openPlusPriceRange = one.Add(e.slaParams.PriceRange) + e.openMinusPriceRange = one.Sub(e.slaParams.PriceRange) + // now network SLA parameters bondMax, _ := num.DecimalFromString(ls.BondPenaltyMax) bondSlope, _ := num.DecimalFromString(ls.BondPenaltySlope) @@ -523,7 +531,7 @@ func (e *snapshotV2) loadParameters(ls *snapshotpb.LiquidityV2Parameters, p *typ e.nonPerformanceBondPenaltySlope = bondSlope e.stakeToCcyVolume = stakeToVolume - e.serialisedScores, err = proto.Marshal(p.IntoProto()) + e.serialisedParemeters, err = proto.Marshal(p.IntoProto()) return err } diff --git a/core/matching/orderbook.go b/core/matching/orderbook.go index e0d4ad2c67..ee3a1a7248 100644 --- a/core/matching/orderbook.go +++ b/core/matching/orderbook.go @@ -599,6 +599,11 @@ func (b *OrderBook) GetOrdersPerParty(party string) []*types.Order { for oid := range orderIDs { orders = append(orders, b.ordersByID[oid]) } + + // sort before returning since callers will assume they are in a deterministic order + sort.Slice(orders, func(i, j int) bool { + return orders[i].ID < orders[j].ID + }) return orders } diff --git a/core/matching/snapshot.go b/core/matching/snapshot.go index 64b2a48a1c..6a69084467 100644 --- a/core/matching/snapshot.go +++ b/core/matching/snapshot.go @@ -139,12 +139,11 @@ func (b *OrderBook) LoadState(_ context.Context, payload *types.Payload) ([]type // RestoreWithMarketPriceFactor takes the given market price factor and updates all the OriginalPrices // in the orders accordingly. -func (b *OrderBook) RestoreWithMarketPriceFactor(priceFactor *num.Uint) { +func (b *OrderBook) RestoreWithMarketPriceFactor(priceFactor num.Decimal) { for _, o := range b.ordersByID { if o.Price.IsZero() { continue } - o.OriginalPrice = o.Price.Clone() - o.OriginalPrice.Div(o.Price, priceFactor) + o.OriginalPrice, _ = num.UintFromDecimal(o.Price.ToDecimal().Div(priceFactor)) } } diff --git a/core/matching/snapshot_test.go b/core/matching/snapshot_test.go index 2342169180..bd514b1c47 100644 --- a/core/matching/snapshot_test.go +++ b/core/matching/snapshot_test.go @@ -239,8 +239,7 @@ func TestSaveAndLoadSnapshot(t *testing.T) { assert.Nil(t, o2.OriginalPrice) } - pf, _ := num.UintFromDecimal(priceFactor) - ob2.ob.OrderBook.RestoreWithMarketPriceFactor(pf) + ob2.ob.OrderBook.RestoreWithMarketPriceFactor(priceFactor) // now the orders should be equal for _, order := range orders { diff --git a/core/monitor/price/pricemonitoring.go b/core/monitor/price/pricemonitoring.go index eebdf94f34..7bd1d9b682 100644 --- a/core/monitor/price/pricemonitoring.go +++ b/core/monitor/price/pricemonitoring.go @@ -96,13 +96,8 @@ type priceRange struct { } type pastPrice struct { - Time time.Time - VolumeWeightedPrice num.Decimal -} - -type currentPrice struct { - Price *num.Uint - Volume uint64 + Time time.Time + AveragePrice num.Decimal } // RangeProvider provides the minimum and maximum future price corresponding to the current price level, horizon expressed as year fraction (e.g. 0.5 for 6 months) and probability level (e.g. 0.95 for 95%). @@ -128,12 +123,12 @@ type Engine struct { fpHorizons map[int64]num.Decimal now time.Time update time.Time - pricesNow []currentPrice + pricesNow []*num.Uint pricesPast []pastPrice bounds []*bound priceRangeCacheTime time.Time - priceRangesCache map[*bound]priceRange + priceRangesCache map[int]priceRange refPriceCacheTime time.Time refPriceCache map[int64]num.Decimal @@ -152,7 +147,7 @@ func (e *Engine) UpdateSettings(riskModel risk.Model, settings *types.PriceMonit e.fpHorizons, e.bounds = computeBoundsAndHorizons(settings) e.initialised = false e.boundFactorsInitialised = false - e.priceRangesCache = make(map[*bound]priceRange, len(e.bounds)) // clear the cache + e.priceRangesCache = make(map[int]priceRange, len(e.bounds)) // clear the cache // reset reference cache e.refPriceCacheTime = time.Time{} e.refPriceCache = map[int64]num.Decimal{} @@ -232,7 +227,8 @@ func (e *Engine) GetValidPriceRange() (num.WrappedDecimal, num.WrappedDecimal) { func (e *Engine) GetCurrentBounds() []*types.PriceMonitoringBounds { priceRanges := e.getCurrentPriceRanges(false) ret := make([]*types.PriceMonitoringBounds, 0, len(priceRanges)) - for b, pr := range priceRanges { + for ind, pr := range priceRanges { + b := e.bounds[ind] if b.Active { ret = append(ret, &types.PriceMonitoringBounds{ @@ -261,27 +257,14 @@ func (e *Engine) OnTimeUpdate(now time.Time) { // CheckPrice checks how current price, volume and time should impact the auction state and modifies it accordingly: start auction, end auction, extend ongoing auction, // "true" gets returned if non-persistent order should be rejected. -func (e *Engine) CheckPrice(ctx context.Context, as AuctionState, trades []*types.Trade, persistent bool, recordPriceHistory bool) bool { - // initialise with the first price & time provided, otherwise there won't be any bounds - wasInitialised := e.initialised - if !wasInitialised { - // Volume of 0, do nothing - if len(trades) == 0 { - return false - } - // only reset history if there isn't any (we need to initialise the engine) or we're still in opening auction as in that case it's based on previous indicative prices which are no longer relevant - if (recordPriceHistory && e.noHistory()) || as.IsOpeningAuction() { - e.resetPriceHistory(trades) - } - e.initialised = true - } +func (e *Engine) CheckPrice(ctx context.Context, as AuctionState, price *num.Uint, persistent bool, recordPriceHistory bool) bool { // market is not in auction, or in batch auction if fba := as.IsFBA(); !as.InAuction() || fba { - bounds := e.checkBounds(trades) + bounds := e.checkBounds(price) // no bounds violations - update price, and we're done (unless we initialised as part of this call, then price has alrady been updated) if len(bounds) == 0 { - if wasInitialised && recordPriceHistory { - e.recordPriceChanges(trades) + if recordPriceHistory { + e.recordPriceChange(price) } return false } @@ -307,33 +290,19 @@ func (e *Engine) CheckPrice(ctx context.Context, as AuctionState, trades []*type as.StartPriceAuction(e.now, &duration) return false } - // market is in auction - // opening auction -> ignore - if as.IsOpeningAuction() { - if recordPriceHistory { - e.resetPriceHistory(trades) - } - return false - } - bounds := e.checkBounds(trades) + bounds := e.checkBounds(price) if len(bounds) == 0 { - // current auction is price monitoring - // check for end of auction, reset monitoring, and end auction - if as.IsPriceAuction() || as.IsPriceExtension() { - end := as.ExpiresAt() - if !e.now.After(*end) { - return false - } - // auction can be terminated - as.SetReadyToLeave() - // reset the engine - e.resetPriceHistory(trades) + end := as.ExpiresAt() + if !e.now.After(*end) { return false } - // liquidity auction, and it was safe to end -> book is OK, price was OK, reset the engine - if as.CanLeave() { - e.reactivateBounds() + // auction can be terminated + as.SetReadyToLeave() + if recordPriceHistory { + e.ResetPriceHistory(price) + } else { + e.ResetPriceHistory(nil) } return false } @@ -351,15 +320,11 @@ func (e *Engine) CheckPrice(ctx context.Context, as AuctionState, trades []*type return false } -// resetPriceHistory deletes existing price history and starts it afresh with the supplied value. -func (e *Engine) resetPriceHistory(trades []*types.Trade) { +// ResetPriceHistory deletes existing price history and starts it afresh with the supplied value. +func (e *Engine) ResetPriceHistory(price *num.Uint) { e.update = e.now - if len(trades) > 0 { - pricesNow := make([]currentPrice, 0, len(trades)) - for _, t := range trades { - pricesNow = append(pricesNow, currentPrice{Price: t.Price, Volume: t.Size}) - } - e.pricesNow = pricesNow + if price != nil && !price.IsZero() { + e.pricesNow = []*num.Uint{price.Clone()} e.pricesPast = []pastPrice{} } else { // If there's a price history than use the most recent @@ -376,6 +341,7 @@ func (e *Engine) resetPriceHistory(trades []*types.Trade) { // we're not reseetting the down/up factors - they will be updated as triggered by auction end/time e.reactivateBounds() e.stateChanged = true + e.initialised = true } // reactivateBounds reactivates all bounds. @@ -390,12 +356,10 @@ func (e *Engine) reactivateBounds() { } // recordPriceChange informs price monitoring module of a price change within the same instance as specified by the last call to UpdateTime. -func (e *Engine) recordPriceChanges(trades []*types.Trade) { - for _, t := range trades { - if t.Size > 0 { - e.pricesNow = append(e.pricesNow, currentPrice{Price: t.Price.Clone(), Volume: t.Size}) - e.stateChanged = true - } +func (e *Engine) recordPriceChange(price *num.Uint) { + if price != nil && !price.IsZero() { + e.pricesNow = append(e.pricesNow, price.Clone()) + e.stateChanged = true } } @@ -410,16 +374,15 @@ func (e *Engine) recordTimeChange(now time.Time) { } if len(e.pricesNow) > 0 { - totalWeightedPrice, totalVol := num.UintZero(), num.UintZero() - for _, x := range e.pricesNow { - v := num.NewUint(x.Volume) - totalVol.AddSum(v) - totalWeightedPrice.AddSum(v.Mul(v, x.Price)) + priceSum, numObs := num.UintZero(), num.UintZero() + for _, p := range e.pricesNow { + numObs.AddSum(num.UintOne()) + priceSum.AddSum(p) } e.pricesPast = append(e.pricesPast, pastPrice{ - Time: e.now, - VolumeWeightedPrice: totalWeightedPrice.ToDecimal().Div(totalVol.ToDecimal()), + Time: e.now, + AveragePrice: priceSum.ToDecimal().Div(numObs.ToDecimal()), }) } e.pricesNow = e.pricesNow[:0] @@ -429,62 +392,44 @@ func (e *Engine) recordTimeChange(now time.Time) { } // checkBounds checks if the price is within price range for each of the bound and return trigger for each bound that it's not. -func (e *Engine) checkBounds(trades []*types.Trade) []*types.PriceMonitoringTrigger { +func (e *Engine) checkBounds(price *num.Uint) []*types.PriceMonitoringTrigger { ret := []*types.PriceMonitoringTrigger{} // returned price projections, empty if all good - if len(trades) == 0 { - return ret // volume 0 so no bounds violated + if price == nil || price.IsZero() { + return ret } priceRanges := e.getCurrentPriceRanges(false) - for _, t := range trades { - if t.Size == 0 { + if len(priceRanges) == 0 { + return ret + } + for i, b := range e.bounds { + if !b.Active { continue } - for _, b := range e.bounds { - if !b.Active { - continue - } - p := t.Price - priceRange := priceRanges[b] - if p.LT(priceRange.MinPrice.Representation()) || p.GT(priceRange.MaxPrice.Representation()) { - ret = append(ret, b.Trigger) - // deactivate the bound that just got violated so it doesn't prevent auction from terminating - b.Active = false - // only allow breaking one bound at a time - return ret - } + priceRange := priceRanges[i] + if price.LT(priceRange.MinPrice.Representation()) || price.GT(priceRange.MaxPrice.Representation()) { + ret = append(ret, b.Trigger) + // deactivate the bound that just got violated so it doesn't prevent auction from terminating + b.Active = false + // only allow breaking one bound at a time + return ret } } return ret } // getCurrentPriceRanges calculates price ranges from current reference prices and bound down/up factors. -func (e *Engine) getCurrentPriceRanges(force bool) map[*bound]priceRange { +func (e *Engine) getCurrentPriceRanges(force bool) map[int]priceRange { if !force && e.priceRangeCacheTime == e.now && len(e.priceRangesCache) > 0 { return e.priceRangesCache } - ranges := make(map[*bound]priceRange, len(e.priceRangesCache)) + ranges := make(map[int]priceRange, len(e.priceRangesCache)) if e.noHistory() { return ranges } - for _, b := range e.bounds { + for i, b := range e.bounds { if !b.Active { continue } - if e.monitoringAuction() && len(e.pricesPast)+len(e.pricesNow) > 0 { - triggerLookback := e.auctionState.Start().Add(time.Duration(-b.Trigger.Horizon) * time.Second) - // check if trigger's not stale (newest reference price older than horizon lookback time) - var mostRecentObservation time.Time - if len(e.pricesNow) > 0 { - mostRecentObservation = e.now - } else { - x := e.pricesPast[len(e.pricesPast)-1] - mostRecentObservation = x.Time - } - if mostRecentObservation.Before(triggerLookback) { - b.Active = false - continue - } - } ref := e.getRefPrice(b.Trigger.Horizon, force) var min, max num.Decimal @@ -496,7 +441,7 @@ func (e *Engine) getCurrentPriceRanges(force bool) map[*bound]priceRange { max = ref.Mul(defaultUpFactor) } - ranges[b] = priceRange{ + ranges[i] = priceRange{ MinPrice: wrapPriceRange(min, true), MaxPrice: wrapPriceRange(max, false), ReferencePrice: ref, @@ -508,10 +453,6 @@ func (e *Engine) getCurrentPriceRanges(force bool) map[*bound]priceRange { return e.priceRangesCache } -func (e *Engine) monitoringAuction() bool { - return e.auctionState.IsPriceAuction() -} - // clearStalePrices updates the pricesPast slice to hold only as many prices as implied by the horizon. func (e *Engine) clearStalePrices() { if e.now.Before(e.update) || len(e.bounds) == 0 || len(e.pricesPast) == 0 { @@ -568,14 +509,14 @@ func (e *Engine) getRefPriceNoUpdate(horizon int64) num.Decimal { func (e *Engine) calculateRefPrice(horizon int64) num.Decimal { t := e.now.Add(time.Duration(-horizon) * time.Second) if len(e.pricesPast) < 1 { - return e.pricesNow[0].Price.ToDecimal() + return e.pricesNow[0].ToDecimal() } - ref := e.pricesPast[0].VolumeWeightedPrice + ref := e.pricesPast[0].AveragePrice for _, p := range e.pricesPast { if p.Time.After(t) { break } - ref = p.VolumeWeightedPrice + ref = p.AveragePrice } return ref } diff --git a/core/monitor/price/pricemonitoring_test.go b/core/monitor/price/pricemonitoring_test.go index 6dbc6294ea..4086aa600b 100644 --- a/core/monitor/price/pricemonitoring_test.go +++ b/core/monitor/price/pricemonitoring_test.go @@ -36,7 +36,7 @@ func TestEmptyParametersList(t *testing.T) { defer ctrl.Finish() riskModel := mocks.NewMockRangeProvider(ctrl) auctionStateMock := mocks.NewMockAuctionState(ctrl) - currentPrice := []*types.Trade{{Price: num.NewUint(123), Size: 1}} + currentPrice := num.NewUint(123) now := time.Date(1993, 2, 2, 6, 0, 0, 1, time.UTC) @@ -122,8 +122,7 @@ func TestRecordPriceChange(t *testing.T) { defer ctrl.Finish() riskModel := mocks.NewMockRangeProvider(ctrl) auctionStateMock := mocks.NewMockAuctionState(ctrl) - currentPrice := num.NewUint(123) - cp := []*types.Trade{{Price: currentPrice, Size: 1}} + cp := num.NewUint(123) now := time.Date(1993, 2, 2, 6, 0, 0, 1, time.UTC) t1 := proto.PriceMonitoringTrigger{Horizon: 7200, Probability: "0.95", AuctionExtension: 300} t2 := proto.PriceMonitoringTrigger{Horizon: 3600, Probability: "0.99", AuctionExtension: 60} @@ -137,7 +136,6 @@ 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(2) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) @@ -149,8 +147,8 @@ func TestRecordPriceChange(t *testing.T) { b := pm.CheckPrice(context.TODO(), auctionStateMock, cp, true, true) require.False(t, b) one := num.NewUint(1) - cp1 := []*types.Trade{{Price: num.Sum(currentPrice, one), Size: 1}} // plus 1 - cp2 := []*types.Trade{{Price: num.Sum(currentPrice, one, one), Size: 1}} // plus 2 + cp1 := num.Sum(cp, one) // plus 1 + cp2 := num.Sum(cp, one, one) // plus 2 b = pm.CheckPrice(context.TODO(), auctionStateMock, cp2, true, true) require.False(t, b) b = pm.CheckPrice(context.TODO(), auctionStateMock, cp1, true, true) @@ -164,8 +162,7 @@ func TestCheckBoundViolationsWithinCurrentTimeWith2HorizonProbabilityPairs(t *te defer ctrl.Finish() riskModel := mocks.NewMockRangeProvider(ctrl) auctionStateMock := mocks.NewMockAuctionState(ctrl) - currentPrice := num.NewUint(123) - cp := []*types.Trade{{Price: currentPrice, Size: 1}} + cp := num.NewUint(123) now := time.Date(1993, 2, 2, 6, 0, 0, 1, time.UTC) t1Time, t2Time := int64(60), int64(300) t1 := proto.PriceMonitoringTrigger{Horizon: 3600, Probability: "0.99", AuctionExtension: t1Time} @@ -179,7 +176,7 @@ func TestCheckBoundViolationsWithinCurrentTimeWith2HorizonProbabilityPairs(t *te maxDown1, maxUp1, maxDown2, maxUp2 := num.NewUint(1), num.NewUint(2), num.NewUint(3), num.NewUint(4) - cpDec := num.DecimalFromUint(currentPrice) + cpDec := num.DecimalFromUint(cp) // get the price bounds pMin1 := cpDec.Sub(num.DecimalFromUint(maxDown1)) pMin2 := cpDec.Sub(num.DecimalFromUint(maxDown2)) @@ -192,10 +189,8 @@ func TestCheckBoundViolationsWithinCurrentTimeWith2HorizonProbabilityPairs(t *te downFactors := []num.Decimal{pMin1.Div(cpDec), pMin2.Div(cpDec)} upFactors := []num.Decimal{pMax1.Div(cpDec), pMax2.Div(cpDec)} - auctionStateMock.EXPECT().IsFBA().Return(false).Times(19) + auctionStateMock.EXPECT().IsFBA().Return(false).AnyTimes() auctionStateMock.EXPECT().InAuction().Return(false).Times(14) - auctionStateMock.EXPECT().IsPriceAuction().Return(false).Times(10) - auctionStateMock.EXPECT().Start().Return(now).Times(1) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() @@ -208,24 +203,21 @@ func TestCheckBoundViolationsWithinCurrentTimeWith2HorizonProbabilityPairs(t *te b := pm.CheckPrice(context.TODO(), auctionStateMock, cp, true, true) require.False(t, b) - cPrice := num.Sum(currentPrice, maxUp1) + cPrice := num.Sum(cp, maxUp1) cPrice = cPrice.Sub(cPrice, one) - cp1 := []*types.Trade{{Price: cPrice, Size: 1}} - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp1, true, true) + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) require.False(t, b) - cPrice = num.Sum(currentPrice, one) + cPrice = num.Sum(cp, one) cPrice = cPrice.Sub(cPrice, maxDown1) - cp2 := []*types.Trade{{Price: cPrice, Size: 1}} - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp2, true, true) + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) require.False(t, b) - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp2, true, true) + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) require.False(t, b) - cPrice = num.Sum(one, cPrice.Sub(currentPrice, maxDown1)) // add one bc price bounds are now using Ceil for min price - cp3 := []*types.Trade{{Price: cPrice, Size: 1}} - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp3, true, true) + cPrice = num.Sum(one, cPrice.Sub(cp, maxDown1)) // add one bc price bounds are now using Ceil for min price + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) require.False(t, b) // set the min duration to equal auction extension 1 @@ -234,9 +226,8 @@ func TestCheckBoundViolationsWithinCurrentTimeWith2HorizonProbabilityPairs(t *te auctionStateMock.EXPECT().StartPriceAuction(now, &end).Times(1) delta := num.Sum(maxUp1, maxUp2) - cPrice = num.Sum(currentPrice, delta.Div(delta, num.Sum(one, one))) - cp4 := []*types.Trade{{Price: cPrice, Size: 1}} - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp4, true, true) + cPrice = num.Sum(cp, delta.Div(delta, num.Sum(one, one))) + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) require.False(t, b) // Reinstantiate price monitoring after auction to reset internal state @@ -251,9 +242,8 @@ func TestCheckBoundViolationsWithinCurrentTimeWith2HorizonProbabilityPairs(t *te auctionStateMock.EXPECT().StartPriceAuction(now, &end).Times(1) delta = num.Sum(maxDown1, maxDown2) - cPrice = cPrice.Sub(currentPrice, delta.Div(delta, num.Sum(one, one))) - cp5 := []*types.Trade{{Price: cPrice, Size: 1}} - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp5, true, true) + cPrice = cPrice.Sub(cp, delta.Div(delta, num.Sum(one, one))) + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) require.False(t, b) // Reinstantiate price monitoring after auction to reset internal state @@ -267,9 +257,8 @@ func TestCheckBoundViolationsWithinCurrentTimeWith2HorizonProbabilityPairs(t *te require.False(t, b) auctionStateMock.EXPECT().StartPriceAuction(now, &end).Times(1) - cPrice = num.Sum(currentPrice, num.UintZero().Sub(maxUp2, one)) // max price bound is now floored, so sub 1 to stay below second price bound - cp6 := []*types.Trade{{Price: cPrice, Size: 1}} - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp6, true, true) + cPrice = num.Sum(cp, num.UintZero().Sub(maxUp2, one)) // max price bound is now floored, so sub 1 to stay below second price bound + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) require.False(t, b) // Reinstantiate price monitoring after auction to reset internal state @@ -283,9 +272,8 @@ func TestCheckBoundViolationsWithinCurrentTimeWith2HorizonProbabilityPairs(t *te require.False(t, b) auctionStateMock.EXPECT().StartPriceAuction(now, &end).Times(1) - cPrice = num.Sum(cPrice.Sub(currentPrice, maxDown2), one) // add 1 back, avoid breaching both down limits - cp7 := []*types.Trade{{Price: cPrice, Size: 1}} - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp7, true, true) + cPrice = num.Sum(cPrice.Sub(cp, maxDown2), one) // add 1 back, avoid breaching both down limits + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) require.False(t, b) // Reinstantiate price monitoring after auction to reset internal state @@ -299,276 +287,45 @@ func TestCheckBoundViolationsWithinCurrentTimeWith2HorizonProbabilityPairs(t *te end = types.AuctionDuration{Duration: t1.AuctionExtension} auctionStateMock.EXPECT().StartPriceAuction(now, &end).Times(1) - cPrice = num.Sum(currentPrice, maxUp2, maxUp2) - cp8 := []*types.Trade{{Price: cPrice, Size: 1}} - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp8, true, true) + cPrice = num.Sum(cp, maxUp2, maxUp2) + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) require.False(t, b) // recheck with same price, 2nd trigger should get breached now end2 := types.AuctionDuration{Duration: t2.AuctionExtension} auctionStateMock.EXPECT().InAuction().Return(true).Times(1) - auctionStateMock.EXPECT().IsPriceAuction().Return(true).Times(1) - auctionStateMock.EXPECT().IsOpeningAuction().Return(false).Times(1) auctionStateMock.EXPECT().ExtendAuctionPrice(end2).Times(1) auctionEnd := now.Add(time.Duration(end.Duration) * time.Second) now = auctionEnd.Add(time.Second) pm.OnTimeUpdate(now) - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp8, true, true) + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) require.False(t, b) // recheck with same price, auction should end now auctionStateMock.EXPECT().InAuction().Return(true).Times(1) - auctionStateMock.EXPECT().IsPriceAuction().Return(true).Times(1) - auctionStateMock.EXPECT().IsOpeningAuction().Return(false).Times(1) auctionStateMock.EXPECT().SetReadyToLeave().Times(1) auctionEnd = auctionEnd.Add(time.Duration(end2.Duration) * time.Second) auctionStateMock.EXPECT().ExpiresAt().Return(&auctionEnd) now = auctionEnd.Add(time.Second) pm.OnTimeUpdate(now) - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp8, true, true) + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) require.False(t, b) // Check with same price again after exiting, should not start auction now auctionStateMock.EXPECT().InAuction().Return(false).Times(3) - auctionStateMock.EXPECT().IsPriceAuction().Return(false).Times(4) - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp8, true, true) + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) require.False(t, b) // Update factors and check again, should still be fine pm.UpdateTestFactors(downFactors, upFactors) pm.OnTimeUpdate(now) - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp8, true, true) + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) require.False(t, b) auctionStateMock.EXPECT().StartPriceAuction(now, &end).Times(1) delta = num.Sum(maxDown2, maxDown2) - cPrice = cPrice.Sub(currentPrice, delta) - cp9 := []*types.Trade{{Price: cPrice, Size: 1}} - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp9, true, true) - require.False(t, b) -} - -func TestCheckBoundViolationsAcrossTimeWith1HorizonProbabilityPair(t *testing.T) { - ctx := context.Background() - ctrl := gomock.NewController(t) - defer ctrl.Finish() - riskModel := mocks.NewMockRangeProvider(ctrl) - auctionStateMock := mocks.NewMockAuctionState(ctrl) - statevar := mocks.NewMockStateVarEngine(ctrl) - statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - price1 := num.NewUint(123) - initialTime := time.Date(1993, 2, 2, 6, 0, 0, 1, time.UTC) - now := initialTime - t1Time := int64(60) - t1 := types.PriceMonitoringTrigger{Horizon: 600, Probability: num.DecimalFromFloat(0.99), AuctionExtension: t1Time} - boundUpdateFrequency := int64(120) - settings := &types.PriceMonitoringSettings{ - Parameters: &types.PriceMonitoringParameters{ - Triggers: []*types.PriceMonitoringTrigger{&t1}, - }, - } - maxDown1, maxUp1 := num.NewUint(1), num.NewUint(2) - p1Dec := num.DecimalFromUint(price1) - h1 := horizonToYearFraction(t1.Horizon) - min1 := p1Dec.Sub(num.DecimalFromUint(maxDown1)) - max1 := p1Dec.Add(num.DecimalFromUint(maxUp1)) - - riskModel.EXPECT().PriceRange(p1Dec, h1, t1.Probability).Return(min1, max1).Times(0) - // auctionStateMock.EXPECT().IsFBA().Return(false).Times(25) - // auctionStateMock.EXPECT().InAuction().Return(false).Times(25) - auctionStateMock.EXPECT().IsFBA().Return(false).AnyTimes() - auctionStateMock.EXPECT().InAuction().Return(false).AnyTimes() - auctionStateMock.EXPECT().IsPriceAuction().Return(true).AnyTimes() - auctionStateMock.EXPECT().Start().Return(now).Times(1) - - pm, err := price.NewMonitor("asset", "market", riskModel, auctionStateMock, settings, statevar, logging.NewTestLogger()) - require.NoError(t, err) - require.NotNil(t, pm) - refPrice := p1Dec - cPrice, _ := num.UintFromDecimal(refPrice) - priceHistorySum := num.Sum(cPrice) - n := 1 - b := pm.CheckPrice(ctx, auctionStateMock, []*types.Trade{{Price: cPrice, Size: 1}}, true, true) - require.False(t, b) - - cPrice = cPrice.Add(cPrice, maxUp1) - priceHistorySum = num.Sum(priceHistorySum, cPrice) - n++ - b = pm.CheckPrice(ctx, auctionStateMock, []*types.Trade{{Price: cPrice, Size: 1}}, true, true) - require.False(t, b) - - cPrice, _ = num.UintFromDecimal(refPrice) // this is silly, but the original test did this... - cPrice = cPrice.Sub(cPrice, maxDown1) - priceHistorySum = num.Sum(priceHistorySum, cPrice) - n++ - b = pm.CheckPrice(ctx, auctionStateMock, []*types.Trade{{Price: cPrice, Size: 1}}, true, true) - require.False(t, b) - - end := types.AuctionDuration{Duration: t1.AuctionExtension} - pm.SetMinDuration(time.Duration(t1.AuctionExtension) * time.Second) - auctionStateMock.EXPECT().StartPriceAuction(now, &end).Times(0) - cPrice, _ = num.UintFromDecimal(refPrice) - cPrice = num.Sum(cPrice, maxUp1, maxUp1) - b = pm.CheckPrice(ctx, auctionStateMock, []*types.Trade{{Price: cPrice, Size: 1}}, true, true) - require.False(t, b) - - // Still before update (no price change) - updateTime := now.Add(time.Duration(boundUpdateFrequency) * time.Second) - now = updateTime.Add(-time.Second) - pm.OnTimeUpdate(now) - avgPrice1 := priceHistorySum.ToDecimal().Div(num.DecimalFromFloat(float64(n))) - refPrice = avgPrice1 - cPrice, _ = num.UintFromDecimal(refPrice) - priceHistorySum = priceHistorySum.Set(cPrice) - n = 1 - b = pm.CheckPrice(ctx, auctionStateMock, []*types.Trade{{Price: cPrice, Size: 1}}, true, true) - require.False(t, b) - - // Execting same behaviour as above (per reference price) - cPrice, _ = num.UintFromDecimal(refPrice.Floor()) - cPrice.Add(cPrice, maxUp1) - priceHistorySum.Add(priceHistorySum, cPrice) - n++ - b = pm.CheckPrice(ctx, auctionStateMock, []*types.Trade{{Price: cPrice, Size: 1}}, true, true) - require.False(t, b) - - cPrice, _ = num.UintFromDecimal(refPrice.Ceil()) - cPrice.Sub(cPrice, maxDown1) - priceHistorySum.Add(priceHistorySum, cPrice) - n++ - b = pm.CheckPrice(ctx, auctionStateMock, []*types.Trade{{Price: cPrice, Size: 1}}, true, true) - require.False(t, b) - - end = types.AuctionDuration{Duration: t1.AuctionExtension} - cPrice, _ = num.UintFromDecimal(refPrice) - cPrice.Sub(cPrice, num.Sum(maxDown1, maxDown1)) - b = pm.CheckPrice(ctx, auctionStateMock, []*types.Trade{{Price: cPrice, Size: 1}}, true, true) - require.False(t, b) - - // Right at update time (after the auction has concluded) - now = initialTime.Add(time.Duration(2*boundUpdateFrequency) * time.Second) - pm.OnTimeUpdate(now) - // multiply by 4 - maxDown2 := num.Sum(maxDown1, maxDown1, maxDown1, maxDown1) - maxUp2 := num.Sum(maxUp1, maxUp1, maxUp1, maxUp1) - avgPrice2 := priceHistorySum.ToDecimal().Div(num.DecimalFromFloat(float64(n))) - refPrice = avgPrice2 - cPrice, _ = num.UintFromDecimal(refPrice) - priceHistorySum = priceHistorySum.Set(cPrice) - n = 1 - b = pm.CheckPrice(ctx, auctionStateMock, []*types.Trade{{Price: cPrice, Size: 1}}, true, true) - require.False(t, b) - - cPrice, _ = num.UintFromDecimal(refPrice.Floor()) - cPrice.Add(cPrice, maxUp2) - priceHistorySum.Add(priceHistorySum, cPrice) - n++ - b = pm.CheckPrice(ctx, auctionStateMock, []*types.Trade{{Price: cPrice, Size: 1}}, true, true) - require.False(t, b) - - cPrice, _ = num.UintFromDecimal(refPrice.Ceil()) - cPrice.Sub(cPrice, maxDown2) - volume := uint64(2) - priceHistorySum = num.Sum(priceHistorySum, cPrice, cPrice) // multiplied by volume of 2 - n += int(volume) - b = pm.CheckPrice(ctx, auctionStateMock, []*types.Trade{{Price: cPrice, Size: volume}}, true, true) - require.False(t, b) - - end = types.AuctionDuration{Duration: t1.AuctionExtension} - cPrice, _ = num.UintFromDecimal(refPrice) - cPrice = num.Sum(cPrice, maxUp2, maxUp2) - b = pm.CheckPrice(ctx, auctionStateMock, []*types.Trade{{Price: cPrice, Size: 1}}, true, true) - require.False(t, b) - - // Right before update time (horizon away from averagePrice3) - updateTime = now.Add(time.Duration(t1.Horizon) * time.Second) - now = updateTime.Add(-time.Second) - pm.OnTimeUpdate(now) - averagePrice3 := num.DecimalFromFloat(priceHistorySum.Float64() / float64(n)) - referencePrice := avgPrice2 - maxDown3 := num.UintZero().Mul(maxDown1, num.NewUint(6)) - maxUp3 := num.UintZero().Mul(maxUp1, num.NewUint(6)) - - validPrice, _ := num.UintFromDecimal(referencePrice) - priceHistorySum = validPrice - b = pm.CheckPrice(context.TODO(), auctionStateMock, []*types.Trade{{Price: validPrice, Size: 1}}, true, true) - require.False(t, b) - - validPrice, _ = num.UintFromDecimal(referencePrice.Floor()) - validPrice.Add(validPrice, maxUp3) - priceHistorySum.Add(priceHistorySum, validPrice) - b = pm.CheckPrice(context.TODO(), auctionStateMock, []*types.Trade{{Price: validPrice, Size: 1}}, true, true) - require.False(t, b) - - validPrice, _ = num.UintFromDecimal(referencePrice.Ceil()) - validPrice.Sub(validPrice, maxDown3) - priceHistorySum.Add(priceHistorySum, validPrice) - b = pm.CheckPrice(context.TODO(), auctionStateMock, []*types.Trade{{Price: validPrice, Size: 1}}, true, true) - require.False(t, b) - - end = types.AuctionDuration{Duration: t1.AuctionExtension} - - invalidPrice, _ := num.UintFromDecimal(referencePrice.Floor()) - invalidPrice.Add(invalidPrice, num.UintZero().Mul(maxUp3, num.NewUint(2))) - - b = pm.CheckPrice(context.TODO(), auctionStateMock, []*types.Trade{{Price: invalidPrice, Size: 1}}, true, true) - require.False(t, b) - - invalidPrice, _ = num.UintFromDecimal(referencePrice.Ceil()) - invalidPrice.Sub(invalidPrice, num.UintZero().Mul(maxDown3, num.NewUint(2))) - b = pm.CheckPrice(context.TODO(), auctionStateMock, []*types.Trade{{Price: invalidPrice, Size: 1}}, true, true) - require.False(t, b) - - // Right at update time (horizon away from price3Average) - now = updateTime - referencePrice = averagePrice3 - - validPrice, _ = num.UintFromDecimal(referencePrice) - priceHistorySum = validPrice - b = pm.CheckPrice(context.TODO(), auctionStateMock, []*types.Trade{{Price: validPrice, Size: 1}}, true, true) - require.False(t, b) - - validPrice, _ = num.UintFromDecimal(referencePrice.Floor()) - validPrice.Add(validPrice, maxUp3) - priceHistorySum.Add(priceHistorySum, validPrice) - b = pm.CheckPrice(context.TODO(), auctionStateMock, []*types.Trade{{Price: validPrice, Size: 1}}, true, true) - require.False(t, b) - - validPrice, _ = num.UintFromDecimal(referencePrice.Ceil()) - validPrice.Sub(validPrice, maxDown3) - priceHistorySum.Add(priceHistorySum, validPrice) - b = pm.CheckPrice(context.TODO(), auctionStateMock, []*types.Trade{{Price: validPrice, Size: 1}}, true, true) - require.False(t, b) - - end = types.AuctionDuration{Duration: t1.AuctionExtension} - invalidPrice, _ = num.UintFromDecimal(referencePrice.Ceil()) - invalidPrice.Sub(invalidPrice, num.UintZero().Mul(maxDown3, num.NewUint(2))) - b = pm.CheckPrice(context.TODO(), auctionStateMock, []*types.Trade{{Price: invalidPrice, Size: 1}}, true, true) - require.False(t, b) - - // Reset price, the resetting value should become the new reference - now = now.Add(time.Hour) - pm.OnTimeUpdate(now) - var resetPrice uint64 = 20 - var maxMoveDown4 uint64 = 5 - var maxMoveUp4 uint64 = 120 - validPrice = num.NewUint(resetPrice) - - // Assume in auction now - b = pm.CheckPrice(context.TODO(), auctionStateMock, []*types.Trade{{Price: validPrice, Size: 1}}, true, true) - require.False(t, b) - - validPrice = num.NewUint(resetPrice + maxMoveUp4) - b = pm.CheckPrice(context.TODO(), auctionStateMock, []*types.Trade{{Price: validPrice, Size: 1}}, true, true) - require.False(t, b) - - validPrice = num.NewUint(resetPrice - maxMoveDown4) - b = pm.CheckPrice(context.TODO(), auctionStateMock, []*types.Trade{{Price: validPrice, Size: 1}}, true, true) - require.False(t, b) - - end = types.AuctionDuration{Duration: t1.AuctionExtension} - invalidPrice = num.NewUint(resetPrice + 2*maxMoveUp4) - b = pm.CheckPrice(context.TODO(), auctionStateMock, []*types.Trade{{Price: invalidPrice, Size: 1}}, true, true) + cPrice = cPrice.Sub(cp, delta) + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) require.False(t, b) } @@ -578,7 +335,6 @@ func TestAuctionStartedAndEndendBy1Trigger(t *testing.T) { riskModel := mocks.NewMockRangeProvider(ctrl) auctionStateMock := mocks.NewMockAuctionState(ctrl) price1 := num.NewUint(123) - cp := []*types.Trade{{Price: price1, Size: 1}} ctx := context.Background() now := time.Date(1993, 2, 2, 6, 0, 0, 1, time.UTC) t1 := proto.PriceMonitoringTrigger{Horizon: 600, Probability: "0.95", AuctionExtension: 60} @@ -601,9 +357,8 @@ func TestAuctionStartedAndEndendBy1Trigger(t *testing.T) { downFactorsP1 := []num.Decimal{p1Min1.Div(decPrice), p1Min2.Div(decPrice)} upFactorsP1 := []num.Decimal{p1Max1.Div(decPrice), p1Max2.Div(decPrice)} - auctionStateMock.EXPECT().IsFBA().Return(false).Times(2) + auctionStateMock.EXPECT().IsFBA().Return(false).AnyTimes() auctionStateMock.EXPECT().InAuction().Return(false).Times(2) - auctionStateMock.EXPECT().IsPriceAuction().Return(false).Times(3) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) @@ -612,7 +367,7 @@ func TestAuctionStartedAndEndendBy1Trigger(t *testing.T) { require.NotNil(t, pm) pm.UpdateTestFactors(downFactorsP1, upFactorsP1) pm.OnTimeUpdate(now) - b := pm.CheckPrice(ctx, auctionStateMock, cp, true, true) + b := pm.CheckPrice(ctx, auctionStateMock, price1, true, true) require.False(t, b) end := types.AuctionDuration{Duration: t1.AuctionExtension} @@ -621,24 +376,19 @@ func TestAuctionStartedAndEndendBy1Trigger(t *testing.T) { delta := num.Sum().Sub(maxUp2, maxUp1) cPrice := num.Sum(price1, delta) - cp1 := []*types.Trade{{Price: cPrice, Size: 1}} pm.OnTimeUpdate(now) - b = pm.CheckPrice(context.TODO(), auctionStateMock, cp1, true, true) // t1 violated only + b = pm.CheckPrice(context.TODO(), auctionStateMock, cPrice, true, true) // t1 violated only require.False(t, b) initialAuctionEnd := now.Add(time.Duration(t1.AuctionExtension) * time.Second) - auctionStateMock.EXPECT().IsFBA().Return(false).Times(1) auctionStateMock.EXPECT().InAuction().Return(true).Times(1) - auctionStateMock.EXPECT().IsPriceAuction().Return(true).Times(1) - auctionStateMock.EXPECT().IsOpeningAuction().Return(false).Times(1) - // auctionStateMock.EXPECT().IsPriceAuction().Return(true).Times(1) auctionStateMock.EXPECT().ExpiresAt().Return(&initialAuctionEnd).Times(1) auctionStateMock.EXPECT().SetReadyToLeave().Times(1) afterInitialAuction := initialAuctionEnd.Add(time.Nanosecond) pm.OnTimeUpdate(afterInitialAuction) - b = pm.CheckPrice(ctx, auctionStateMock, cp1, true, true) // price should be accepted now + b = pm.CheckPrice(ctx, auctionStateMock, cPrice, true, true) // price should be accepted now require.False(t, b) } @@ -647,7 +397,6 @@ func TestAuctionStartedAndEndendBy2Triggers(t *testing.T) { riskModel := mocks.NewMockRangeProvider(ctrl) auctionStateMock := mocks.NewMockAuctionState(ctrl) price1 := num.NewUint(123) - cp1 := []*types.Trade{{Price: price1, Size: 1}} ctx := context.Background() now := time.Date(1993, 2, 2, 6, 0, 0, 1, time.UTC) t1 := proto.PriceMonitoringTrigger{Horizon: 600, Probability: "0.95", AuctionExtension: 60} @@ -664,7 +413,6 @@ 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(4) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) @@ -673,7 +421,7 @@ func TestAuctionStartedAndEndendBy2Triggers(t *testing.T) { require.NotNil(t, pm) pm.OnTimeUpdate(now) - b := pm.CheckPrice(ctx, auctionStateMock, cp1, true, true) + b := pm.CheckPrice(ctx, auctionStateMock, price1, true, true) require.False(t, b) end := types.AuctionDuration{Duration: t1.AuctionExtension + t2.AuctionExtension} @@ -681,25 +429,19 @@ func TestAuctionStartedAndEndendBy2Triggers(t *testing.T) { // auctionStateMock.EXPECT().StartPriceAuction(now, &end).Times(1) cPrice := num.Sum(price1, maxUp2, maxUp1) - cp2 := []*types.Trade{{Price: cPrice, Size: 1}} - // decPrice, pMin1, pMax1, _, _ := getPriceBounds(cPrice, 1, 2) - // _, pMin2, pMax2, _, _ = getPriceBounds(cPrice, 1*4, 2*4) - - b = pm.CheckPrice(ctx, auctionStateMock, cp2, true, true) // t1 violated only + b = pm.CheckPrice(ctx, auctionStateMock, cPrice, true, true) // t1 violated only require.False(t, b) initialAuctionEnd := now.Add(time.Duration(t1.AuctionExtension+t2.AuctionExtension) * time.Second) auctionStateMock.EXPECT().IsFBA().Return(false).Times(1) auctionStateMock.EXPECT().InAuction().Return(true).Times(1) - auctionStateMock.EXPECT().IsOpeningAuction().Return(false).Times(1) - auctionStateMock.EXPECT().IsPriceAuction().Return(true).Times(1) auctionStateMock.EXPECT().ExpiresAt().Return(&initialAuctionEnd).Times(1) auctionStateMock.EXPECT().SetReadyToLeave().Times(1) afterInitialAuction := initialAuctionEnd.Add(time.Nanosecond) pm.OnTimeUpdate(afterInitialAuction) - b = pm.CheckPrice(ctx, auctionStateMock, cp2, true, true) // price should be accepted now + b = pm.CheckPrice(ctx, auctionStateMock, cPrice, true, true) // price should be accepted now require.False(t, b) } @@ -710,7 +452,6 @@ func TestAuctionStartedAndEndendBy1TriggerAndExtendedBy2nd(t *testing.T) { riskModel := mocks.NewMockRangeProvider(ctrl) auctionStateMock := mocks.NewMockAuctionState(ctrl) price1 := num.NewUint(123) - cp1 := []*types.Trade{{Price: price1, Size: 1}} now := time.Date(1993, 2, 2, 6, 0, 0, 1, time.UTC) t1 := proto.PriceMonitoringTrigger{Horizon: 600, Probability: "0.95", AuctionExtension: 60} t2 := proto.PriceMonitoringTrigger{Horizon: 600, Probability: "0.99", AuctionExtension: 120} @@ -735,8 +476,6 @@ func TestAuctionStartedAndEndendBy1TriggerAndExtendedBy2nd(t *testing.T) { auctionStateMock.EXPECT().IsFBA().Return(false).Times(2) auctionStateMock.EXPECT().InAuction().Return(false).Times(2) - auctionStateMock.EXPECT().IsPriceAuction().Return(false).Times(2) - auctionStateMock.EXPECT().Start().Return(now).Times(1) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) @@ -749,7 +488,7 @@ func TestAuctionStartedAndEndendBy1TriggerAndExtendedBy2nd(t *testing.T) { require.NotNil(t, pm) pm.OnTimeUpdate(now) - b := pm.CheckPrice(ctx, auctionStateMock, cp1, true, true) + b := pm.CheckPrice(ctx, auctionStateMock, price1, true, true) require.False(t, b) bounds := pm.GetCurrentBounds() @@ -769,7 +508,7 @@ func TestAuctionStartedAndEndendBy1TriggerAndExtendedBy2nd(t *testing.T) { cPrice := num.Sum(price1, maxUp2) cPrice.Sub(cPrice, maxUp1) - cp2 := []*types.Trade{{Price: cPrice, Size: 1}} + cp2 := cPrice b = pm.CheckPrice(ctx, auctionStateMock, cp2, true, true) // t1 violated only require.False(t, b) @@ -777,8 +516,6 @@ func TestAuctionStartedAndEndendBy1TriggerAndExtendedBy2nd(t *testing.T) { auctionStateMock.EXPECT().IsFBA().Return(false).Times(1) auctionStateMock.EXPECT().InAuction().Return(true).Times(1) - auctionStateMock.EXPECT().IsOpeningAuction().Return(false).Times(1) - auctionStateMock.EXPECT().IsPriceAuction().Return(true).AnyTimes() auctionStateMock.EXPECT().ExpiresAt().Return(&initialAuctionEnd).Times(1) bounds = pm.GetCurrentBounds() @@ -795,7 +532,7 @@ func TestAuctionStartedAndEndendBy1TriggerAndExtendedBy2nd(t *testing.T) { end2 := types.AuctionDuration{Duration: t2.AuctionExtension} auctionStateMock.EXPECT().ExtendAuctionPrice(end2).Times(1) pm.OnTimeUpdate(afterInitialAuction) - cp3 := []*types.Trade{{Price: cPrice, Size: 1}} + cp3 := cPrice b = pm.CheckPrice(ctx, auctionStateMock, cp3, true, true) // price should violated 2nd trigger and result in auction extension require.False(t, b) @@ -819,7 +556,6 @@ func TestAuctionStartedAndEndendBy1TriggerAndExtendedBy2nd(t *testing.T) { auctionStateMock.EXPECT().IsFBA().Return(false).Times(1) auctionStateMock.EXPECT().InAuction().Return(true).Times(1) - auctionStateMock.EXPECT().IsOpeningAuction().Return(false).Times(1) auctionStateMock.EXPECT().SetReadyToLeave().Times(1) afterExtendedAuction := extendedAuctionEnd.Add(time.Nanosecond) @@ -835,7 +571,6 @@ func TestAuctionStartedBy1TriggerAndNotExtendedBy2ndStaleTrigger(t *testing.T) { riskModel := mocks.NewMockRangeProvider(ctrl) auctionStateMock := mocks.NewMockAuctionState(ctrl) price1 := num.NewUint(123) - cp1 := []*types.Trade{{Price: price1, Size: 1}} now := time.Date(1993, 2, 2, 6, 0, 0, 1, time.UTC) t1 := proto.PriceMonitoringTrigger{Horizon: 6, Probability: "0.95", AuctionExtension: 60} t2 := proto.PriceMonitoringTrigger{Horizon: 6, Probability: "0.99", AuctionExtension: 120} @@ -860,7 +595,6 @@ func TestAuctionStartedBy1TriggerAndNotExtendedBy2ndStaleTrigger(t *testing.T) { auctionStateMock.EXPECT().IsFBA().Return(false).Times(2) auctionStateMock.EXPECT().InAuction().Return(false).Times(2) - auctionStateMock.EXPECT().IsPriceAuction().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()) @@ -873,7 +607,7 @@ func TestAuctionStartedBy1TriggerAndNotExtendedBy2ndStaleTrigger(t *testing.T) { require.NotNil(t, pm) pm.OnTimeUpdate(now) - b := pm.CheckPrice(ctx, auctionStateMock, cp1, true, true) + b := pm.CheckPrice(ctx, auctionStateMock, price1, true, true) require.False(t, b) bounds := pm.GetCurrentBounds() @@ -893,7 +627,7 @@ func TestAuctionStartedBy1TriggerAndNotExtendedBy2ndStaleTrigger(t *testing.T) { cPrice := num.Sum(price1, maxUp2) cPrice.Sub(cPrice, maxUp1) - cp2 := []*types.Trade{{Price: cPrice, Size: 1}} + cp2 := cPrice b = pm.CheckPrice(ctx, auctionStateMock, cp2, true, true) // t1 violated only require.False(t, b) @@ -901,9 +635,6 @@ func TestAuctionStartedBy1TriggerAndNotExtendedBy2ndStaleTrigger(t *testing.T) { auctionStateMock.EXPECT().IsFBA().Return(false).Times(1) auctionStateMock.EXPECT().InAuction().Return(true).Times(1) - auctionStateMock.EXPECT().IsOpeningAuction().Return(false).Times(1) - auctionStateMock.EXPECT().IsPriceAuction().Return(true).AnyTimes() - auctionStateMock.EXPECT().Start().Return(now).Times(1) bounds = pm.GetCurrentBounds() require.Len(t, bounds, 1) @@ -919,7 +650,7 @@ func TestAuctionStartedBy1TriggerAndNotExtendedBy2ndStaleTrigger(t *testing.T) { cPrice = num.Sum(price1, maxUp2, maxUp1) pm.OnTimeUpdate(afterInitialAuction) - cp3 := []*types.Trade{{Price: cPrice, Size: 1}} + cp3 := cPrice b = pm.CheckPrice(ctx, auctionStateMock, cp3, true, true) // price should violated 2nd trigger and result in auction extension require.False(t, b) } @@ -930,7 +661,6 @@ func TestMarketInOpeningAuction(t *testing.T) { riskModel := mocks.NewMockRangeProvider(ctrl) auctionStateMock := mocks.NewMockAuctionState(ctrl) currentPrice := num.NewUint(123) - cp := []*types.Trade{{Price: currentPrice, Size: 1}} t1 := proto.PriceMonitoringTrigger{Horizon: 7200, Probability: "0.95", AuctionExtension: 300} now := time.Date(1993, 2, 2, 6, 0, 0, 1, time.UTC) pSet := &proto.PriceMonitoringSettings{ @@ -944,7 +674,8 @@ func TestMarketInOpeningAuction(t *testing.T) { auctionStateMock.EXPECT().IsFBA().Return(false).Times(1) auctionStateMock.EXPECT().InAuction().Return(true).Times(1) - auctionStateMock.EXPECT().IsOpeningAuction().Return(true).Times(1) + end := now.Add(time.Second) + auctionStateMock.EXPECT().ExpiresAt().Return(&end).Times(1) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) @@ -953,7 +684,7 @@ func TestMarketInOpeningAuction(t *testing.T) { require.NotNil(t, pm) pm.OnTimeUpdate(now) - b := pm.CheckPrice(ctx, auctionStateMock, cp, true, true) + b := pm.CheckPrice(ctx, auctionStateMock, currentPrice, true, true) require.False(t, b) } @@ -963,7 +694,6 @@ func TestMarketInGenericAuction(t *testing.T) { riskModel := mocks.NewMockRangeProvider(ctrl) auctionStateMock := mocks.NewMockAuctionState(ctrl) currentPrice := num.NewUint(123) - cp1 := []*types.Trade{{Price: currentPrice, Size: 1}} t1 := proto.PriceMonitoringTrigger{Horizon: 7200, Probability: "0.95", AuctionExtension: 300} now := time.Date(1993, 2, 2, 6, 0, 0, 1, time.UTC) @@ -979,44 +709,40 @@ func TestMarketInGenericAuction(t *testing.T) { ctx := context.Background() // price monitoring starts with auction, not initialised, so there's no fixed price level it'll check - auctionStateMock.EXPECT().IsFBA().Return(false).Times(5) - auctionStateMock.EXPECT().InAuction().Return(true).Times(5) - auctionStateMock.EXPECT().IsOpeningAuction().Return(false).Times(5) - auctionStateMock.EXPECT().IsPriceAuction().Return(false).AnyTimes() - auctionStateMock.EXPECT().IsPriceExtension().Return(false).AnyTimes() + auctionStateMock.EXPECT().IsFBA().Return(false).AnyTimes() + auctionStateMock.EXPECT().InAuction().Return(true).Times(4) 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()) - + end := now.Add(time.Second) + auctionStateMock.EXPECT().ExpiresAt().Return(&end).AnyTimes() pm, err := price.NewMonitor("asset", "market", riskModel, auctionStateMock, settings, statevar, logging.NewTestLogger()) require.NoError(t, err) require.NotNil(t, pm) pm.OnTimeUpdate(now) - b := pm.CheckPrice(ctx, auctionStateMock, cp1, true, true) - require.False(t, b) + pm.ResetPriceHistory(currentPrice) + cPrice := num.Sum(currentPrice, maxUp) cPrice.Sub(cPrice, one) - cp2 := []*types.Trade{{Price: cPrice, Size: 1}} - b = pm.CheckPrice(ctx, auctionStateMock, cp2, true, true) + b := pm.CheckPrice(ctx, auctionStateMock, cPrice, true, true) require.False(t, b) cPrice.Sub(num.Sum(currentPrice, one), maxDown) - cp3 := []*types.Trade{{Price: cPrice, Size: 1}} + cp3 := cPrice b = pm.CheckPrice(ctx, auctionStateMock, cp3, true, true) require.False(t, b) extension := types.AuctionDuration{Duration: t1.AuctionExtension} - auctionStateMock.EXPECT().ExtendAuctionPrice(extension).MinTimes(1).MaxTimes(1) - + auctionStateMock.EXPECT().ExtendAuctionPrice(extension).Times(1) cPrice = num.Sum(currentPrice, maxUp, maxUp) - cp4 := []*types.Trade{{Price: cPrice, Size: 1}} + cp4 := cPrice b = pm.CheckPrice(ctx, auctionStateMock, cp4, true, true) require.False(t, b) cPrice = num.Sum(maxDown, maxDown) cPrice.Sub(currentPrice, cPrice) - cp5 := []*types.Trade{{Price: cPrice, Size: 1}} + cp5 := cPrice b = pm.CheckPrice(ctx, auctionStateMock, cp5, true, true) require.False(t, b) } @@ -1027,7 +753,6 @@ func TestGetValidPriceRange_NoTriggers(t *testing.T) { riskModel := mocks.NewMockRangeProvider(ctrl) auctionStateMock := mocks.NewMockAuctionState(ctrl) currentPrice := num.NewUint(123) - cp := []*types.Trade{{Price: currentPrice, Size: 1}} now := time.Date(1993, 2, 2, 6, 0, 0, 1, time.UTC) ctx := context.Background() @@ -1052,7 +777,7 @@ func TestGetValidPriceRange_NoTriggers(t *testing.T) { require.Equal(t, expMax.String(), max.Representation().String()) pm.OnTimeUpdate(now) - b := pm.CheckPrice(ctx, auctionStateMock, cp, true, true) + b := pm.CheckPrice(ctx, auctionStateMock, currentPrice, true, true) require.False(t, b) min, max = pm.GetValidPriceRange() @@ -1066,7 +791,6 @@ func TestGetValidPriceRange_2triggers(t *testing.T) { riskModel := mocks.NewMockRangeProvider(ctrl) auctionStateMock := mocks.NewMockAuctionState(ctrl) currentPrice := num.NewUint(123) - cp := []*types.Trade{{Price: currentPrice, Size: 1}} now := time.Date(1993, 2, 2, 6, 0, 0, 1, time.UTC) var t1Time int64 = 60 var t2Time int64 = 300 @@ -1086,7 +810,6 @@ 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(11) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) @@ -1099,81 +822,72 @@ func TestGetValidPriceRange_2triggers(t *testing.T) { pm.UpdateTestFactors(downFactors, upFactors) pm.OnTimeUpdate(now) - b := pm.CheckPrice(ctx, auctionStateMock, cp, true, true) + b := pm.CheckPrice(ctx, auctionStateMock, currentPrice, true, true) require.False(t, b) _, _ = pm.GetValidPriceRange() now = now.Add(time.Second) cPrice := num.Sum(currentPrice, maxUp1) cPrice.Sub(cPrice, one) - cp2 := []*types.Trade{{Price: cPrice, Size: 1}} pm.OnTimeUpdate(now) - b = pm.CheckPrice(ctx, auctionStateMock, cp2, true, true) + b = pm.CheckPrice(ctx, auctionStateMock, cPrice, true, true) require.False(t, b) _, _ = pm.GetValidPriceRange() now = now.Add(time.Minute) cPrice = num.Sum(currentPrice, one) cPrice.Sub(cPrice, maxDown1) - cp3 := []*types.Trade{{Price: cPrice, Size: 1}} pm.OnTimeUpdate(now) - b = pm.CheckPrice(ctx, auctionStateMock, cp3, true, true) + b = pm.CheckPrice(ctx, auctionStateMock, cPrice, true, true) require.False(t, b) _, _ = pm.GetValidPriceRange() now = now.Add(time.Hour) cPrice = num.Sum(currentPrice, maxUp1) cPrice.Sub(cPrice, one) - cp4 := []*types.Trade{{Price: cPrice, Size: 1}} pm.OnTimeUpdate(now) - b = pm.CheckPrice(ctx, auctionStateMock, cp4, true, true) + b = pm.CheckPrice(ctx, auctionStateMock, cPrice, true, true) require.False(t, b) _, _ = pm.GetValidPriceRange() now = now.Add(time.Minute) cPrice.Sub(currentPrice, maxDown1) cPrice.AddSum(one) - cp5 := []*types.Trade{{Price: cPrice, Size: 1}} pm.OnTimeUpdate(now) - b = pm.CheckPrice(ctx, auctionStateMock, cp5, true, true) + b = pm.CheckPrice(ctx, auctionStateMock, cPrice, true, true) require.False(t, b) min, max := pm.GetValidPriceRange() - cp6 := []*types.Trade{{Price: min.Representation(), Size: 1}} - b = pm.CheckPrice(ctx, auctionStateMock, cp6, true, true) + b = pm.CheckPrice(ctx, auctionStateMock, min.Representation(), true, true) require.False(t, b) - cp7 := []*types.Trade{{Price: max.Representation(), Size: 1}} - b = pm.CheckPrice(ctx, auctionStateMock, cp7, true, true) + b = pm.CheckPrice(ctx, auctionStateMock, max.Representation(), true, true) require.False(t, b) // Should trigger an auction auctionStateMock.EXPECT().StartPriceAuction(now, gomock.Any()).Times(1) cPrice.Sub(min.Representation(), one) - cp8 := []*types.Trade{{Price: cPrice, Size: 1}} - b = pm.CheckPrice(ctx, auctionStateMock, cp8, true, true) + b = pm.CheckPrice(ctx, auctionStateMock, cPrice, true, true) require.False(t, b) now = now.Add(time.Second) pm.OnTimeUpdate(now) - b = pm.CheckPrice(ctx, auctionStateMock, cp, true, true) + b = pm.CheckPrice(ctx, auctionStateMock, currentPrice, true, true) require.False(t, b) min, max = pm.GetValidPriceRange() - cp9 := []*types.Trade{{Price: min.Representation(), Size: 1}} - b = pm.CheckPrice(ctx, auctionStateMock, cp9, true, true) + b = pm.CheckPrice(ctx, auctionStateMock, min.Representation(), true, true) require.False(t, b) - cp10 := []*types.Trade{{Price: max.Representation(), Size: 1}} - b = pm.CheckPrice(ctx, auctionStateMock, cp10, true, true) + b = pm.CheckPrice(ctx, auctionStateMock, max.Representation(), true, true) require.False(t, b) // Should trigger an auction auctionStateMock.EXPECT().StartPriceAuction(now, gomock.Any()).Times(1) cPrice.Add(max.Representation(), one) - cp11 := []*types.Trade{{Price: cPrice, Size: 1}} + cp11 := cPrice b = pm.CheckPrice(ctx, auctionStateMock, cp11, true, true) require.False(t, b) } diff --git a/core/monitor/price/snapshot.go b/core/monitor/price/snapshot.go index 4d871d842b..fb5d5198e2 100644 --- a/core/monitor/price/snapshot.go +++ b/core/monitor/price/snapshot.go @@ -41,6 +41,8 @@ func NewMonitorFromSnapshot( return nil, ErrNilPriceMonitoringSettings } + priceRangesCache, needRecalc := newPriceRangeCacheFromSlice(pm.PriceRangeCache) + e := &Engine{ market: marketID, log: log, @@ -54,7 +56,7 @@ func NewMonitorFromSnapshot( refPriceCache: keyDecimalPairToMap(pm.RefPriceCache), refPriceCacheTime: pm.RefPriceCacheTime, bounds: priceBoundsToBounds(pm.Bounds), - priceRangesCache: newPriceRangeCacheFromSlice(pm.PriceRangeCache), + priceRangesCache: priceRangesCache, pricesNow: pricesNowToInternal(pm.PricesNow), pricesPast: pricesPastToInternal(pm.PricesPast), stateChanged: true, @@ -62,16 +64,17 @@ func NewMonitorFromSnapshot( } e.boundFactorsInitialised = pm.PriceBoundsConsensusReached stateVarEngine.RegisterStateVariable(asset, marketID, "bound-factors", boundFactorsConverter{}, e.startCalcPriceRanges, []statevar.EventType{statevar.EventTypeTimeTrigger, statevar.EventTypeAuctionEnded, statevar.EventTypeOpeningAuctionFirstUncrossingPrice}, e.updatePriceBounds) + + if needRecalc { + e.getCurrentPriceRanges(true) + } return e, nil } -func pricesNowToInternal(cps []*types.CurrentPrice) []currentPrice { - cpsi := make([]currentPrice, 0, len(cps)) +func pricesNowToInternal(cps []*types.CurrentPrice) []*num.Uint { + cpsi := make([]*num.Uint, 0, len(cps)) for _, cp := range cps { - cpsi = append(cpsi, currentPrice{ - Price: cp.Price.Clone(), - Volume: cp.Volume, - }) + cpsi = append(cpsi, cp.Price.Clone()) } return cpsi } @@ -80,8 +83,8 @@ func pricesPastToInternal(pps []*types.PastPrice) []pastPrice { ppsi := make([]pastPrice, 0, len(pps)) for _, pp := range pps { ppsi = append(ppsi, pastPrice{ - Time: pp.Time, - VolumeWeightedPrice: pp.VolumeWeightedPrice, + Time: pp.Time, + AveragePrice: pp.VolumeWeightedPrice, }) } return ppsi @@ -149,23 +152,29 @@ func (e *Engine) serialiseBounds() []*types.PriceBound { return bounds } -func newPriceRangeCacheFromSlice(prs []*types.PriceRangeCache) map[*bound]priceRange { - priceRangesCache := map[*bound]priceRange{} +func newPriceRangeCacheFromSlice(prs []*types.PriceRangeCache) (map[int]priceRange, bool) { + priceRangesCache := map[int]priceRange{} + needsRecalc := false for _, pr := range prs { - priceRangesCache[priceBoundTypeToInternal(pr.Bound)] = priceRange{ + if pr.BoundIndex < 0 { + needsRecalc = true + break + } + priceRangesCache[pr.BoundIndex] = priceRange{ MinPrice: wrapPriceRange(pr.Range.Min, true), MaxPrice: wrapPriceRange(pr.Range.Max, false), ReferencePrice: pr.Range.Ref, } } - return priceRangesCache + + return priceRangesCache, needsRecalc } func (e *Engine) serialisePriceRanges() []*types.PriceRangeCache { prc := make([]*types.PriceRangeCache, 0, len(e.priceRangesCache)) - for bound, priceRange := range e.priceRangesCache { + for ind, priceRange := range e.priceRangesCache { prc = append(prc, &types.PriceRangeCache{ - Bound: internalBoundToPriceBoundType(bound), + BoundIndex: ind, Range: &types.PriceRange{ Min: priceRange.MinPrice.Original(), Max: priceRange.MaxPrice.Original(), @@ -174,17 +183,7 @@ func (e *Engine) serialisePriceRanges() []*types.PriceRangeCache { }) } - sort.Slice(prc, func(i, j int) bool { - if prc[i].Bound.UpFactor.Equal(prc[j].Bound.UpFactor) { - if prc[i].Bound.DownFactor.Equal(prc[j].Bound.DownFactor) { - return prc[i].Bound.Trigger.Horizon < prc[j].Bound.Trigger.Horizon - } - return prc[j].Bound.DownFactor.LessThan(prc[i].Bound.DownFactor) - } - - return prc[j].Bound.UpFactor.GreaterThan(prc[i].Bound.UpFactor) - }) - + sort.Slice(prc, func(i, j int) bool { return prc[i].BoundIndex < prc[j].BoundIndex }) return prc } @@ -196,8 +195,8 @@ func (e *Engine) serialisePricesNow() []*types.CurrentPrice { psn := make([]*types.CurrentPrice, 0, len(e.pricesNow)) for _, pn := range e.pricesNow { psn = append(psn, &types.CurrentPrice{ - Price: pn.Price.Clone(), - Volume: pn.Volume, + Price: pn.Clone(), + Volume: 1, }) } @@ -217,7 +216,7 @@ func (e *Engine) serialisePricesPast() []*types.PastPrice { for _, pp := range e.pricesPast { pps = append(pps, &types.PastPrice{ Time: pp.Time, - VolumeWeightedPrice: pp.VolumeWeightedPrice, + VolumeWeightedPrice: pp.AveragePrice, }) } diff --git a/core/monitor/price/snapshot_test.go b/core/monitor/price/snapshot_test.go index 9fd9c9f0ee..9c085b80f1 100644 --- a/core/monitor/price/snapshot_test.go +++ b/core/monitor/price/snapshot_test.go @@ -117,7 +117,7 @@ func TestChangedState(t *testing.T) { for i := 0; i < 10; i++ { pm1.OnTimeUpdate(now) - p := []*types.Trade{{Price: num.NewUint(uint64(100 + i)), Size: uint64(100 + i)}} + p := num.NewUint(uint64(100 + i)) b := pm1.CheckPrice(context.Background(), as, p, true, true) now = now.Add(time.Minute * 1) require.False(t, b) @@ -193,7 +193,7 @@ func TestRestorePriceBoundRepresentation(t *testing.T) { pm.UpdateTestFactors(downFactors, upFactors) pm.OnTimeUpdate(now) - b := pm.CheckPrice(context.Background(), auctionStateMock, []*types.Trade{{Price: currentPrice, Size: 1}}, true, true) + b := pm.CheckPrice(context.Background(), auctionStateMock, currentPrice, true, true) require.False(t, b) state := pm.GetState() diff --git a/core/netparams/bridge_mapping.go b/core/netparams/bridge_mapping.go new file mode 100644 index 0000000000..d7b7c99f10 --- /dev/null +++ b/core/netparams/bridge_mapping.go @@ -0,0 +1,62 @@ +// 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/defaults.go b/core/netparams/defaults.go index 8669b4efba..cef5923ac0 100644 --- a/core/netparams/defaults.go +++ b/core/netparams/defaults.go @@ -68,7 +68,7 @@ var ( func defaultNetParams() map[string]value { m := map[string]value{ // spots - SpotMarketTradingEnabled: NewInt(gteI0, lteI1).Mutable(true).MustUpdate("0"), + SpotMarketTradingEnabled: NewInt(gteI0, lteI1).Mutable(true).MustUpdate("1"), // perps PerpsMarketTradingEnabled: NewInt(gteI0, lteI1).Mutable(true).MustUpdate("0"), @@ -197,9 +197,8 @@ func defaultNetParams() map[string]value { DelegationMinAmount: NewDecimal(gtD0).Mutable(true).MustUpdate("1"), // staking and delegation - StakingAndDelegationRewardPayoutFraction: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("1.0"), - StakingAndDelegationRewardPayoutDelay: NewDuration(DurationGTE(0 * time.Second)).Mutable(true).MustUpdate("24h0m0s"), - + StakingAndDelegationRewardPayoutFraction: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("1.0"), + StakingAndDelegationRewardPayoutDelay: NewDuration(DurationGTE(0 * time.Second)).Mutable(true).MustUpdate("24h0m0s"), StakingAndDelegationRewardMaxPayoutPerParticipant: NewDecimal(gteD0).Mutable(true).MustUpdate("0"), StakingAndDelegationRewardDelegatorShare: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.883"), StakingAndDelegationRewardMinimumValidatorStake: NewDecimal(gteD0).Mutable(true).MustUpdate("0"), @@ -209,7 +208,7 @@ func defaultNetParams() map[string]value { StakingAndDelegationRewardOptimalStakeMultiplier: NewDecimal(gteD1).Mutable(true).MustUpdate("3.0"), // team rewards - //TODO review the constraint and defaults - MinEpochsInTeamForMetricRewardEligibility: NewInt(gteI1, lteI500).Mutable(true).MustUpdate("5"), + MinEpochsInTeamForMetricRewardEligibility: NewInt(gteI0, lteI500).Mutable(true).MustUpdate("5"), // spam protection policies SpamProtectionMaxVotes: NewInt(gteI1).Mutable(true).MustUpdate("3"), @@ -220,6 +219,7 @@ func defaultNetParams() map[string]value { SpamProtectionMinTokensForDelegation: NewDecimal(gteD1).Mutable(true).MustUpdate("1000000000000000000"), SpamProtectionMinimumWithdrawalQuantumMultiple: NewDecimal(gtD0, DecimalLT(num.MustDecimalFromString("1e6"))).Mutable(true).MustUpdate("10"), SpamProtectionMinMultisigUpdates: NewDecimal(gteD1).Mutable(true).MustUpdate("100000000000000000000"), + SpamProtectionMaxMultisigUpdates: NewInt(gteI0).Mutable(true).MustUpdate("4"), SpamProtectionMaxCreateReferralSet: NewInt(gteI0).Mutable(true).MustUpdate("3"), SpamProtectionMaxUpdateReferralSet: NewInt(gteI0).Mutable(true).MustUpdate("3"), SpamProtectionMaxApplyReferralCode: NewInt(gteI0).Mutable(true).MustUpdate("5"), @@ -235,12 +235,12 @@ func defaultNetParams() map[string]value { // e.g: assets and collateral when setting up a new ID. RewardAsset: NewString().Mutable(true).MustUpdate("VOTE"), - BlockchainsEthereumConfig: NewJSON(&proto.EthereumConfig{}, types.CheckUntypedEthereumConfig).Mutable(true). - MustUpdate("{\"network_id\": \"XXX\", \"chain_id\": \"XXX\", \"collateral_bridge_contract\": { \"address\": \"0xXXX\" }, \"confirmations\": 3, \"staking_bridge_contract\": { \"address\": \"0xXXX\", \"deployment_block_height\": 0}, \"token_vesting_contract\": { \"address\": \"0xXXX\", \"deployment_block_height\": 0 }, \"multisig_control_contract\": { \"address\": \"0xXXX\", \"deployment_block_height\": 0 }}"), BlockchainsEthereumL2Configs: NewJSON(&proto.EthereumL2Configs{}, types.CheckUntypedEthereumL2Configs).Mutable(true). - MustUpdate( - `{"configs":[{"network_id":"100","chain_id":"100","confirmations":3,"name":"Gnosis Chain", "block_interval": 3}, {"network_id":"42161","chain_id":"42161","confirmations":3,"name":"Arbitrum One", "block_interval": 50}]}`, - ), + MustUpdate(`{"configs":[{"network_id":"100","chain_id":"100","confirmations":3,"name":"Gnosis Chain", "block_interval": 3}, {"network_id":"42161","chain_id":"42161","confirmations":3,"name":"Arbitrum One", "block_interval": 50}]}`), + BlockchainsPrimaryEthereumConfig: NewJSON(&proto.EthereumConfig{}, types.CheckUntypedEthereumConfig).Mutable(true). + MustUpdate(`{"network_id": "XXX", "chain_id": "XXX", "collateral_bridge_contract": { "address": "0xXXX" }, "confirmations": 3, "staking_bridge_contract": { "address": "0xXXX", "deployment_block_height": 0}, "token_vesting_contract": { "address": "0xXXX", "deployment_block_height": 0 }, "multisig_control_contract": { "address": "0xXXX", "deployment_block_height": 0 }}`), + BlockchainsEVMBridgeConfigs: NewJSON(&proto.EVMBridgeConfigs{}, types.CheckUntypedEVMChainConfig).Mutable(true). + MustUpdate(`{"configs": [{"network_id": "XXX", "chain_id": "XXX", "collateral_bridge_contract": { "address": "0xXXX" }, "confirmations": 3, "multisig_control_contract": {"address": "0xXXX", "deployment_block_height": 0}}]}`), ValidatorsEpochLength: NewDuration(gte1s, lte255h).Mutable(true).MustUpdate("24h0m0s"), diff --git a/core/netparams/keys.go b/core/netparams/keys.go index 240658c56e..46a3ccbcc5 100644 --- a/core/netparams/keys.go +++ b/core/netparams/keys.go @@ -166,6 +166,7 @@ const ( SpamProtectionMaxBatchSize = "spam.protection.max.batchSize" SpamProtectionMinimumWithdrawalQuantumMultiple = "spam.protection.minimumWithdrawalQuantumMultiple" SpamProtectionMinMultisigUpdates = "spam.protection.minMultisigUpdates" + SpamProtectionMaxMultisigUpdates = "spam.protection.maxMultisigUpdates" SpamProtectionMaxStopOrdersPerMarket = "spam.protection.max.stopOrdersPerMarket" SpamProtectionMaxCreateReferralSet = "spam.protection.max.createReferralSet" @@ -179,8 +180,9 @@ const ( SpamProtectionUpdateProfileMinFunds = "spam.protection.updatePartyProfile.min.funds" // blockchain specifics? - BlockchainsEthereumConfig = "blockchains.ethereumConfig" - BlockchainsEthereumL2Configs = "blockchains.ethereumRpcAndEvmCompatDataSourcesConfig" + BlockchainsPrimaryEthereumConfig = "blockchains.ethereumConfig" + BlockchainsEVMBridgeConfigs = "blockchains.evmBridgeConfigs" + BlockchainsEthereumL2Configs = "blockchains.ethereumRpcAndEvmCompatDataSourcesConfig" // length of epoch in seconds. ValidatorsEpochLength = "validators.epoch.length" @@ -373,7 +375,8 @@ var AllKeys = map[string]struct{}{ GovernanceProposalReferralProgramRequiredMajority: {}, GovernanceProposalReferralProgramMinProposerBalance: {}, GovernanceProposalReferralProgramMinVoterBalance: {}, - BlockchainsEthereumConfig: {}, + BlockchainsPrimaryEthereumConfig: {}, + BlockchainsEVMBridgeConfigs: {}, MarketLiquidityProvisionShapesMaxSize: {}, MarketProbabilityOfTradingTauScaling: {}, MarketMinProbabilityOfTradingForLPOrders: {}, @@ -432,6 +435,7 @@ var AllKeys = map[string]struct{}{ ValidatorPerformanceScalingFactor: {}, SpamProtectionMinimumWithdrawalQuantumMultiple: {}, SpamProtectionMinMultisigUpdates: {}, + SpamProtectionMaxMultisigUpdates: {}, MarketSuccessorLaunchWindow: {}, SpamProtectionMaxStopOrdersPerMarket: {}, ReferralProgramMaxReferralTiers: {}, diff --git a/core/netparams/netparams.go b/core/netparams/netparams.go index b3c00ac6d1..2ab73df1af 100644 --- a/core/netparams/netparams.go +++ b/core/netparams/netparams.go @@ -40,7 +40,8 @@ var ( } // a list of network parameter which cannot be updated. updateDisallowed = []string{ - BlockchainsEthereumConfig, + BlockchainsPrimaryEthereumConfig, + BlockchainsEVMBridgeConfigs, } ) @@ -95,7 +96,7 @@ type Store struct { state *snapState - protocolUpgradeNewParameters []string + isProtocolUpgradeRunning bool } func New(log *logging.Logger, cfg Config, broker Broker) *Store { @@ -237,10 +238,10 @@ func (s *Store) OnTick(ctx context.Context, _ time.Time) { // This is useful only when a protocol upgrade // is running. we will dispatch all new parameter // on the first time update here. - // we propagate all parameters update to paliate + // we propagate all parameters update to compensate // for previous release where parameters didn't // get propagated. - if len(s.protocolUpgradeNewParameters) > 0 { + if s.isProtocolUpgradeRunning { keys := maps.Keys(s.store) sort.Strings(keys) @@ -248,7 +249,7 @@ func (s *Store) OnTick(ctx context.Context, _ time.Time) { s.broker.Send(events.NewNetworkParameterEvent(ctx, k, s.store[k].String())) } - s.protocolUpgradeNewParameters = nil + s.isProtocolUpgradeRunning = false } if len(s.paramUpdates) <= 0 { diff --git a/core/netparams/snapshot.go b/core/netparams/snapshot.go index 56224a1ffa..984a912d71 100644 --- a/core/netparams/snapshot.go +++ b/core/netparams/snapshot.go @@ -21,7 +21,10 @@ 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" + vegapb "code.vegaprotocol.io/vega/protos/vega" ) type snapState struct { @@ -127,30 +130,51 @@ func (s *Store) LoadState(ctx context.Context, pl *types.Payload) ([]types.State if pl.Namespace() != s.state.Namespace() { return nil, types.ErrInvalidSnapshotNamespace } + + s.isProtocolUpgradeRunning = vgcontext.InProgressUpgrade(ctx) + np, ok := pl.Data.(*types.PayloadNetParams) if !ok { return nil, types.ErrInconsistentNamespaceKeys // it's the only possible key/namespace combo here } - fromSnapshot := map[string]struct{}{} for _, kv := range np.NetParams.Params { if err := s.UpdateOptionalValidation(ctx, kv.Key, kv.Value, false, false); err != nil { return nil, err } + } + + // 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" + } - fromSnapshot[kv.Key] = struct{}{} + // 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) + if err != nil { + panic(fmt.Errorf("no vega chain ID found in context: %w", 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, 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 for k := range s.store { - // is this a new parameter? if yes, we are likely doing a protocol - // upgrade, and should be sending that to the datanode please. - if _, ok := fromSnapshot[k]; !ok { - s.protocolUpgradeNewParameters = append( - s.protocolUpgradeNewParameters, k, - ) - } - if err := s.dispatchUpdate(ctx, k); err != nil { return nil, fmt.Errorf("could not propagate netparams update to listener, %v: %v", k, err) } diff --git a/core/processor/abci.go b/core/processor/abci.go index acc794172c..a18547adf7 100644 --- a/core/processor/abci.go +++ b/core/processor/abci.go @@ -131,6 +131,9 @@ type SnapshotEngine interface { ReceiveSnapshotChunk(context.Context, *types.RawChunk, string) tmtypes.ResponseApplySnapshotChunk RetrieveSnapshotChunk(uint64, uint32, uint32) (*types.RawChunk, error) HasRestoredStateAlready() bool + + // debug snapshot issues/hash mismatch problems + SnapshotDump(ctx context.Context, path string) ([]byte, error) } type StateVarEngine interface { @@ -152,7 +155,7 @@ type PartiesEngine interface { type ReferralProgram interface { UpdateProgram(program *types.ReferralProgram) - SetExists(types.ReferralSetID) bool + PartyOwnsReferralSet(types.PartyID, types.ReferralSetID) error CreateReferralSet(context.Context, types.PartyID, types.ReferralSetID) error ApplyReferralCode(context.Context, types.PartyID, types.ReferralSetID) error CheckSufficientBalanceForApplyReferralCode(types.PartyID, *num.Uint) error @@ -210,49 +213,50 @@ type App struct { rates *ratelimit.Rates // service injection - assets Assets - banking Banking - broker Broker - witness Witness - evtfwd EvtForwarder - exec ExecutionEngine - ghandler *genesis.Handler - gov GovernanceEngine - notary Notary - stats Stats - time TimeService - top ValidatorTopology - netp NetworkParameters - oracles *Oracle - delegation DelegationEngine - limits Limits - stake StakeVerifier - stakingAccounts StakingAccounts - checkpoint Checkpoint - spam SpamEngine - pow PoWEngine - epoch EpochService - snapshotEngine SnapshotEngine - stateVar StateVarEngine - teamsEngine TeamsEngine - partiesEngine PartiesEngine - referralProgram ReferralProgram - volumeDiscountProgram VolumeDiscountProgram - protocolUpgradeService ProtocolUpgradeService - erc20MultiSigTopology ERC20MultiSigTopology - gastimator *Gastimator - ethCallEngine EthCallEngine - balanceChecker BalanceChecker + assets Assets + banking Banking + broker Broker + witness Witness + evtForwarder EvtForwarder + primaryChainID uint64 + secondaryChainID uint64 + exec ExecutionEngine + ghandler *genesis.Handler + gov GovernanceEngine + notary Notary + stats Stats + time TimeService + top ValidatorTopology + netp NetworkParameters + oracles *Oracle + delegation DelegationEngine + limits Limits + stake StakeVerifier + stakingAccounts StakingAccounts + checkpoint Checkpoint + spam SpamEngine + pow PoWEngine + epoch EpochService + snapshotEngine SnapshotEngine + stateVar StateVarEngine + teamsEngine TeamsEngine + partiesEngine PartiesEngine + referralProgram ReferralProgram + volumeDiscountProgram VolumeDiscountProgram + protocolUpgradeService ProtocolUpgradeService + primaryErc20MultiSigTopology ERC20MultiSigTopology + secondaryErc20MultiSigTopology ERC20MultiSigTopology + gastimator *Gastimator + ethCallEngine EthCallEngine + balanceChecker BalanceChecker nilPow bool nilSpam bool - maxBatchSize atomic.Uint64 - defaultChainID uint64 + maxBatchSize atomic.Uint64 } -func NewApp( - log *logging.Logger, +func NewApp(log *logging.Logger, vegaPaths paths.Paths, config Config, cancelFn func(), @@ -261,7 +265,7 @@ func NewApp( banking Banking, broker Broker, witness Witness, - evtfwd EvtForwarder, + evtForwarder EvtForwarder, exec ExecutionEngine, ghandler *genesis.Handler, gov GovernanceEngine, @@ -285,8 +289,9 @@ func NewApp( referralProgram ReferralProgram, volumeDiscountProgram VolumeDiscountProgram, blockchainClient BlockchainClient, - erc20MultiSigTopology ERC20MultiSigTopology, - version string, // we need the version for snapshot reload + primaryMultisig ERC20MultiSigTopology, + secondaryMultisig ERC20MultiSigTopology, + version string, protocolUpgradeService ProtocolUpgradeService, codec abci.Codec, gastimator *Gastimator, @@ -309,41 +314,42 @@ func NewApp( config.Ratelimit.Requests, config.Ratelimit.PerNBlocks, ), - assets: assets, - banking: banking, - broker: broker, - witness: witness, - evtfwd: evtfwd, - exec: exec, - ghandler: ghandler, - gov: gov, - notary: notary, - stats: stats, - time: time, - top: top, - netp: netp, - oracles: oracles, - delegation: delegation, - limits: limits, - stake: stake, - checkpoint: checkpoint, - spam: spam, - pow: pow, - stakingAccounts: stakingAccounts, - epoch: epoch, - snapshotEngine: snapshot, - stateVar: stateVarEngine, - teamsEngine: teamsEngine, - referralProgram: referralProgram, - volumeDiscountProgram: volumeDiscountProgram, - version: version, - blockchainClient: blockchainClient, - erc20MultiSigTopology: erc20MultiSigTopology, - protocolUpgradeService: protocolUpgradeService, - gastimator: gastimator, - ethCallEngine: ethCallEngine, - balanceChecker: balanceChecker, - partiesEngine: partiesEngine, + assets: assets, + banking: banking, + broker: broker, + witness: witness, + evtForwarder: evtForwarder, + exec: exec, + ghandler: ghandler, + gov: gov, + notary: notary, + stats: stats, + time: time, + top: top, + netp: netp, + oracles: oracles, + delegation: delegation, + limits: limits, + stake: stake, + checkpoint: checkpoint, + spam: spam, + pow: pow, + stakingAccounts: stakingAccounts, + epoch: epoch, + snapshotEngine: snapshot, + stateVar: stateVarEngine, + teamsEngine: teamsEngine, + referralProgram: referralProgram, + volumeDiscountProgram: volumeDiscountProgram, + version: version, + blockchainClient: blockchainClient, + primaryErc20MultiSigTopology: primaryMultisig, + secondaryErc20MultiSigTopology: secondaryMultisig, + protocolUpgradeService: protocolUpgradeService, + gastimator: gastimator, + ethCallEngine: ethCallEngine, + balanceChecker: balanceChecker, + partiesEngine: partiesEngine, } // setup handlers @@ -627,17 +633,29 @@ func (app *App) ensureConfig() { if app.cfg.KeepCheckpointsMax < 1 { app.cfg.KeepCheckpointsMax = 1 } + v := &proto.EthereumConfig{} - if err := app.netp.GetJSONStruct(netparams.BlockchainsEthereumConfig, v); err != nil { + if err := app.netp.GetJSONStruct(netparams.BlockchainsPrimaryEthereumConfig, v); err != nil { + return + } + primaryChainID, err := strconv.ParseUint(v.ChainId, 10, 64) + if err != nil { + return + } + app.primaryChainID = primaryChainID + _ = app.gov.OnChainIDUpdate(primaryChainID) + _ = app.exec.OnChainIDUpdate(primaryChainID) + + bridgeConfigs := &proto.EVMBridgeConfigs{} + if err := app.netp.GetJSONStruct(netparams.BlockchainsEVMBridgeConfigs, bridgeConfigs); err != nil { return } - cID, err := strconv.ParseUint(v.ChainId, 10, 64) + + secondaryChainID, err := strconv.ParseUint(bridgeConfigs.Configs[0].ChainId, 10, 64) if err != nil { return } - app.defaultChainID = cID - app.gov.OnChainIDUpdate(cID) - app.exec.OnChainIDUpdate(cID) + app.secondaryChainID = secondaryChainID } // ReloadConf updates the internal configuration. @@ -1100,6 +1118,15 @@ func (app *App) Finalize() []byte { if err == nil { app.protocolUpgradeService.SetCoreReadyForUpgrade() } + } else if app.cfg.SnapshotDebug.DevEnabled { + if height, _ := vgcontext.BlockHeightFromContext(app.blockCtx); height == app.cfg.SnapshotDebug.CrashAtHeight { + hash, err := app.snapshotEngine.SnapshotDump(app.blockCtx, app.cfg.SnapshotDebug.DebugCrashFile) + if err != nil { + app.log.Panic("Failed to dump snapshot file", logging.Error(err), logging.String("snapshot-hash", string(hash))) + } else { + app.log.Panic("Dumped snapshot file successfully", logging.String("snapshot-hash", string(hash)), logging.String("dump-file", app.cfg.SnapshotDebug.DebugCrashFile)) + } + } } else { snapHash, _, err = app.snapshotEngine.Snapshot(app.blockCtx) } @@ -1540,7 +1567,8 @@ func (app *App) DeliverIssueSignatures(ctx context.Context, tx abci.Tx) error { if err := tx.Unmarshal(is); err != nil { return err } - return app.top.IssueSignatures(ctx, vgcrypto.EthereumChecksumAddress(is.Submitter), is.ValidatorNodeId, is.Kind) + + return app.top.IssueSignatures(ctx, vgcrypto.EthereumChecksumAddress(is.Submitter), is.ValidatorNodeId, is.ChainId, is.Kind) } func (app *App) DeliverProtocolUpgradeCommand(ctx context.Context, tx abci.Tx) error { @@ -1779,9 +1807,7 @@ func (app *App) DeliverAmendOrder( return nil } -func (app *App) DeliverWithdraw( - ctx context.Context, tx abci.Tx, id string, -) error { +func (app *App) DeliverWithdraw(ctx context.Context, tx abci.Tx, id string) error { w := &commandspb.WithdrawSubmission{} if err := tx.Unmarshal(w); err != nil { return err @@ -2609,8 +2635,8 @@ func (app *App) UpdateReferralSet(ctx context.Context, tx abci.Tx) error { return fmt.Errorf("could not deserialize UpdateReferralSet command: %w", err) } - if !app.referralProgram.SetExists(types.ReferralSetID(params.Id)) { - return fmt.Errorf("no referral set for ID %q", params.Id) + if err := app.referralProgram.PartyOwnsReferralSet(types.PartyID(tx.Party()), types.ReferralSetID(params.Id)); err != nil { + return fmt.Errorf("cannot update referral set: %w", err) } if params.IsTeam { @@ -2693,7 +2719,7 @@ func (app *App) UpdatePartyProfile(ctx context.Context, tx abci.Tx) error { return nil } -func (app *App) OnBlockchainEthereumConfigUpdate(ctx context.Context, conf any) error { +func (app *App) OnBlockchainPrimaryEthereumConfigUpdate(_ context.Context, conf any) error { cfg, err := types.EthereumConfigFromUntypedProto(conf) if err != nil { return err @@ -2702,7 +2728,20 @@ func (app *App) OnBlockchainEthereumConfigUpdate(ctx context.Context, conf any) if err != nil { return err } - app.defaultChainID = cID - app.exec.OnChainIDUpdate(cID) + app.primaryChainID = cID + _ = app.exec.OnChainIDUpdate(cID) return app.gov.OnChainIDUpdate(cID) } + +func (app *App) OnBlockchainEVMChainConfigUpdate(_ context.Context, conf any) error { + cfg, err := types.EVMChainConfigFromUntypedProto(conf) + if err != nil { + return err + } + cID, err := strconv.ParseUint(cfg.Configs[0].ChainID(), 10, 64) + if err != nil { + return err + } + app.secondaryChainID = cID + return nil +} diff --git a/core/processor/config.go b/core/processor/config.go index 83f80265ea..093025c86e 100644 --- a/core/processor/config.go +++ b/core/processor/config.go @@ -25,6 +25,12 @@ const ( namedLogger = "processor" ) +type Snapshot struct { + DevEnabled encoding.Bool + CrashAtHeight uint64 `long:"crash-with-snapshot-at"` + DebugCrashFile string `long:"snapshot-dump-path"` +} + // Config represent the configuration of the processor package. type Config struct { Level encoding.LogLevel `long:"log-level"` @@ -33,6 +39,7 @@ type Config struct { 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"` } // NewDefaultConfig creates an instance of the package specific configuration, given a @@ -43,5 +50,10 @@ func NewDefaultConfig() Config { LogOrderSubmitDebug: true, Ratelimit: ratelimit.NewDefaultConfig(), KeepCheckpointsMax: 20, + SnapshotDebug: Snapshot{ + DevEnabled: false, + CrashAtHeight: 0, + DebugCrashFile: "/tmp/snapshot.json", + }, } } diff --git a/core/processor/mocks/mocks.go b/core/processor/mocks/mocks.go index 42cd191e0a..8a4428eb4e 100644 --- a/core/processor/mocks/mocks.go +++ b/core/processor/mocks/mocks.go @@ -1350,17 +1350,17 @@ func (mr *MockValidatorTopologyMockRecorder) IsValidatorVegaPubKey(arg0 interfac } // IssueSignatures mocks base method. -func (m *MockValidatorTopology) IssueSignatures(arg0 context.Context, arg1, arg2 string, arg3 v1.NodeSignatureKind) error { +func (m *MockValidatorTopology) IssueSignatures(arg0 context.Context, arg1, arg2, arg3 string, arg4 v1.NodeSignatureKind) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "IssueSignatures", arg0, arg1, arg2, arg3) + ret := m.ctrl.Call(m, "IssueSignatures", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(error) return ret0 } // IssueSignatures indicates an expected call of IssueSignatures. -func (mr *MockValidatorTopologyMockRecorder) IssueSignatures(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { +func (mr *MockValidatorTopologyMockRecorder) IssueSignatures(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IssueSignatures", reflect.TypeOf((*MockValidatorTopology)(nil).IssueSignatures), arg0, arg1, arg2, arg3) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IssueSignatures", reflect.TypeOf((*MockValidatorTopology)(nil).IssueSignatures), arg0, arg1, arg2, arg3, arg4) } // Len mocks base method. @@ -1581,31 +1581,31 @@ func (m *MockBanking) EXPECT() *MockBankingMockRecorder { } // BridgeResumed mocks base method. -func (m *MockBanking) BridgeResumed(arg0 context.Context, arg1 bool, arg2 string, arg3, arg4 uint64, arg5 string) error { +func (m *MockBanking) BridgeResumed(arg0 context.Context, arg1 bool, arg2 string, arg3, arg4 uint64, arg5, arg6 string) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "BridgeResumed", arg0, arg1, arg2, arg3, arg4, arg5) + ret := m.ctrl.Call(m, "BridgeResumed", arg0, arg1, arg2, arg3, arg4, arg5, arg6) ret0, _ := ret[0].(error) return ret0 } // BridgeResumed indicates an expected call of BridgeResumed. -func (mr *MockBankingMockRecorder) BridgeResumed(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { +func (mr *MockBankingMockRecorder) BridgeResumed(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BridgeResumed", reflect.TypeOf((*MockBanking)(nil).BridgeResumed), arg0, arg1, arg2, arg3, arg4, arg5) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BridgeResumed", reflect.TypeOf((*MockBanking)(nil).BridgeResumed), arg0, arg1, arg2, arg3, arg4, arg5, arg6) } // BridgeStopped mocks base method. -func (m *MockBanking) BridgeStopped(arg0 context.Context, arg1 bool, arg2 string, arg3, arg4 uint64, arg5 string) error { +func (m *MockBanking) BridgeStopped(arg0 context.Context, arg1 bool, arg2 string, arg3, arg4 uint64, arg5, arg6 string) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "BridgeStopped", arg0, arg1, arg2, arg3, arg4, arg5) + ret := m.ctrl.Call(m, "BridgeStopped", arg0, arg1, arg2, arg3, arg4, arg5, arg6) ret0, _ := ret[0].(error) return ret0 } // BridgeStopped indicates an expected call of BridgeStopped. -func (mr *MockBankingMockRecorder) BridgeStopped(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { +func (mr *MockBankingMockRecorder) BridgeStopped(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BridgeStopped", reflect.TypeOf((*MockBanking)(nil).BridgeStopped), arg0, arg1, arg2, arg3, arg4, arg5) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BridgeStopped", reflect.TypeOf((*MockBanking)(nil).BridgeStopped), arg0, arg1, arg2, arg3, arg4, arg5, arg6) } // CancelGovTransfer mocks base method. @@ -1665,21 +1665,21 @@ func (mr *MockBankingMockRecorder) DepositBuiltinAsset(arg0, arg1, arg2, arg3 in } // DepositERC20 mocks base method. -func (m *MockBanking) DepositERC20(arg0 context.Context, arg1 *types.ERC20Deposit, arg2 string, arg3, arg4 uint64, arg5 string) error { +func (m *MockBanking) DepositERC20(arg0 context.Context, arg1 *types.ERC20Deposit, arg2 string, arg3, arg4 uint64, arg5, arg6 string) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DepositERC20", arg0, arg1, arg2, arg3, arg4, arg5) + ret := m.ctrl.Call(m, "DepositERC20", arg0, arg1, arg2, arg3, arg4, arg5, arg6) ret0, _ := ret[0].(error) return ret0 } // DepositERC20 indicates an expected call of DepositERC20. -func (mr *MockBankingMockRecorder) DepositERC20(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { +func (mr *MockBankingMockRecorder) DepositERC20(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DepositERC20", reflect.TypeOf((*MockBanking)(nil).DepositERC20), arg0, arg1, arg2, arg3, arg4, arg5) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DepositERC20", reflect.TypeOf((*MockBanking)(nil).DepositERC20), arg0, arg1, arg2, arg3, arg4, arg5, arg6) } // ERC20WithdrawalEvent mocks base method. -func (m *MockBanking) ERC20WithdrawalEvent(arg0 context.Context, arg1 *types.ERC20Withdrawal, arg2, arg3 uint64, arg4 string) error { +func (m *MockBanking) ERC20WithdrawalEvent(arg0 context.Context, arg1 *types.ERC20Withdrawal, arg2 uint64, arg3, arg4 string) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ERC20WithdrawalEvent", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(error) @@ -1707,17 +1707,17 @@ func (mr *MockBankingMockRecorder) EnableBuiltinAsset(arg0, arg1 interface{}) *g } // EnableERC20 mocks base method. -func (m *MockBanking) EnableERC20(arg0 context.Context, arg1 *types.ERC20AssetList, arg2 string, arg3, arg4 uint64, arg5 string) error { +func (m *MockBanking) EnableERC20(arg0 context.Context, arg1 *types.ERC20AssetList, arg2 string, arg3, arg4 uint64, arg5, arg6 string) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "EnableERC20", arg0, arg1, arg2, arg3, arg4, arg5) + ret := m.ctrl.Call(m, "EnableERC20", arg0, arg1, arg2, arg3, arg4, arg5, arg6) ret0, _ := ret[0].(error) return ret0 } // EnableERC20 indicates an expected call of EnableERC20. -func (mr *MockBankingMockRecorder) EnableERC20(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { +func (mr *MockBankingMockRecorder) EnableERC20(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EnableERC20", reflect.TypeOf((*MockBanking)(nil).EnableERC20), arg0, arg1, arg2, arg3, arg4, arg5) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EnableERC20", reflect.TypeOf((*MockBanking)(nil).EnableERC20), arg0, arg1, arg2, arg3, arg4, arg5, arg6) } // NewGovernanceTransfer mocks base method. @@ -1749,17 +1749,17 @@ func (mr *MockBankingMockRecorder) TransferFunds(arg0, arg1 interface{}) *gomock } // UpdateERC20 mocks base method. -func (m *MockBanking) UpdateERC20(arg0 context.Context, arg1 *types.ERC20AssetLimitsUpdated, arg2 string, arg3, arg4 uint64, arg5 string) error { +func (m *MockBanking) UpdateERC20(arg0 context.Context, arg1 *types.ERC20AssetLimitsUpdated, arg2 string, arg3, arg4 uint64, arg5, arg6 string) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateERC20", arg0, arg1, arg2, arg3, arg4, arg5) + ret := m.ctrl.Call(m, "UpdateERC20", arg0, arg1, arg2, arg3, arg4, arg5, arg6) ret0, _ := ret[0].(error) return ret0 } // UpdateERC20 indicates an expected call of UpdateERC20. -func (mr *MockBankingMockRecorder) UpdateERC20(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { +func (mr *MockBankingMockRecorder) UpdateERC20(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateERC20", reflect.TypeOf((*MockBanking)(nil).UpdateERC20), arg0, arg1, arg2, arg3, arg4, arg5) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateERC20", reflect.TypeOf((*MockBanking)(nil).UpdateERC20), arg0, arg1, arg2, arg3, arg4, arg5, arg6) } // VerifyCancelGovernanceTransfer mocks base method. diff --git a/core/processor/process_chain_event.go b/core/processor/process_chain_event.go index 91b6711134..0de76e9992 100644 --- a/core/processor/process_chain_event.go +++ b/core/processor/process_chain_event.go @@ -18,6 +18,7 @@ package processor import ( "context" "errors" + "strconv" "strings" "code.vegaprotocol.io/vega/core/datasource/external/ethcall" @@ -32,6 +33,7 @@ var ( ErrNotABuiltinAssetEvent = errors.New("not an builtin asset event") ErrUnsupportedEventAction = errors.New("unsupported event action") ErrChainEventAssetListERC20WithoutEnoughSignature = errors.New("chain event for erc20 asset list received with missing node signatures") + ErrNotBridgeChainID = errors.New("not the chainID of any bridge") ) func (app *App) processChainEvent( @@ -55,9 +57,7 @@ func (app *App) processChainEvent( // let the topology know who was the validator that forwarded the event app.top.AddForwarder(pubkey) - - // ack the new event then - if !app.evtfwd.Ack(ce) { + if !app.evtForwarder.Ack(ce) { // there was an error, or this was already acked // but that's not a big issue we just going to ignore that. return nil @@ -108,33 +108,7 @@ func (app *App) processChainEvent( } return app.processChainEventERC20(ctx, ceErc, id, ce.TxId) case *commandspb.ChainEvent_Erc20Multisig: - blockNumber := c.Erc20Multisig.Block - logIndex := c.Erc20Multisig.Index - switch pevt := c.Erc20Multisig.Action.(type) { - case *vgproto.ERC20MultiSigEvent_SignerAdded: - evt, err := types.SignerEventFromSignerAddedProto( - pevt.SignerAdded, blockNumber, logIndex, ce.TxId, id) - if err != nil { - return err - } - return app.erc20MultiSigTopology.ProcessSignerEvent(evt) - case *vgproto.ERC20MultiSigEvent_SignerRemoved: - evt, err := types.SignerEventFromSignerRemovedProto( - pevt.SignerRemoved, blockNumber, logIndex, ce.TxId, id) - if err != nil { - return err - } - return app.erc20MultiSigTopology.ProcessSignerEvent(evt) - case *vgproto.ERC20MultiSigEvent_ThresholdSet: - evt, err := types.SignerThresholdSetEventFromProto( - pevt.ThresholdSet, blockNumber, logIndex, ce.TxId, id) - if err != nil { - return err - } - return app.erc20MultiSigTopology.ProcessThresholdEvent(evt) - default: - return errors.New("unsupported erc20 multisig event") - } + return app.processChainEventMultisig(c, id, ce.TxId) case *commandspb.ChainEvent_ContractCall: callResult, err := ethcall.EthereumContractCallResultFromProto(c.ContractCall) if err != nil { @@ -142,12 +116,12 @@ func (app *App) processChainEvent( return err } - chainID := app.defaultChainID + chainID := app.primaryChainID if callResult.SourceChainID != nil { chainID = *callResult.SourceChainID } - if chainID == app.defaultChainID { + if chainID == app.primaryChainID { return app.oracles.EthereumOraclesVerifier.ProcessEthereumContractCallResult(callResult) } @@ -181,6 +155,58 @@ func (app *App) processChainEventBuiltinAsset(ctx context.Context, ce *types.Cha } } +func (app *App) processChainEventMultisig( + c *commandspb.ChainEvent_Erc20Multisig, id, txID string, +) error { + if c.Erc20Multisig == nil { + return ErrNotAnERC20Event + } + + cid, err := strconv.ParseUint(c.Erc20Multisig.ChainId, 10, 64) + if err != nil { + return err + } + + var multisig ERC20MultiSigTopology + switch cid { + case app.primaryChainID: + multisig = app.primaryErc20MultiSigTopology + case app.secondaryChainID: + multisig = app.secondaryErc20MultiSigTopology + default: + return ErrNotBridgeChainID + } + + blockNumber := c.Erc20Multisig.Block + logIndex := c.Erc20Multisig.Index + switch pevt := c.Erc20Multisig.Action.(type) { + case *vgproto.ERC20MultiSigEvent_SignerAdded: + evt, err := types.SignerEventFromSignerAddedProto( + pevt.SignerAdded, blockNumber, logIndex, txID, id, c.Erc20Multisig.ChainId) + if err != nil { + return err + } + + return multisig.ProcessSignerEvent(evt) + case *vgproto.ERC20MultiSigEvent_SignerRemoved: + evt, err := types.SignerEventFromSignerRemovedProto( + pevt.SignerRemoved, blockNumber, logIndex, txID, id, c.Erc20Multisig.ChainId) + if err != nil { + return err + } + return multisig.ProcessSignerEvent(evt) + case *vgproto.ERC20MultiSigEvent_ThresholdSet: + evt, err := types.SignerThresholdSetEventFromProto( + pevt.ThresholdSet, blockNumber, logIndex, txID, id, c.Erc20Multisig.ChainId) + if err != nil { + return err + } + return multisig.ProcessThresholdEvent(evt) + default: + return errors.New("unsupported erc20 multisig event") + } +} + func (app *App) processChainEventERC20( ctx context.Context, ce *types.ChainEventERC20, id, txID string, ) error { @@ -203,7 +229,7 @@ func (app *App) processChainEventERC20( if !ok { return ErrChainEventAssetListERC20WithoutEnoughSignature } - return app.banking.EnableERC20(ctx, act.AssetList, id, evt.Block, evt.Index, txID) + return app.banking.EnableERC20(ctx, act.AssetList, id, evt.Block, evt.Index, txID, evt.ChainID) case *types.ERC20EventAssetDelist: return errors.New("ERC20.AssetDelist not implemented") case *types.ERC20EventDeposit: @@ -211,25 +237,23 @@ func (app *App) processChainEventERC20( if err := app.checkVegaAssetID(act.Deposit, "ERC20.AssetDeposit"); err != nil { return err } - return app.banking.DepositERC20(ctx, act.Deposit, id, evt.Block, evt.Index, txID) + return app.banking.DepositERC20(ctx, act.Deposit, id, evt.Block, evt.Index, txID, evt.ChainID) case *types.ERC20EventWithdrawal: act.Withdrawal.VegaAssetID = strings.TrimPrefix(act.Withdrawal.VegaAssetID, "0x") if err := app.checkVegaAssetID(act.Withdrawal, "ERC20.AssetWithdrawal"); err != nil { return err } - return app.banking.ERC20WithdrawalEvent(ctx, act.Withdrawal, evt.Block, evt.Index, txID) + return app.banking.ERC20WithdrawalEvent(ctx, act.Withdrawal, evt.Block, txID, evt.ChainID) case *types.ERC20EventAssetLimitsUpdated: act.AssetLimitsUpdated.VegaAssetID = strings.TrimPrefix(act.AssetLimitsUpdated.VegaAssetID, "0x") if err := app.checkVegaAssetID(act.AssetLimitsUpdated, "ERC20.AssetLimitsUpdated"); err != nil { return err } - return app.banking.UpdateERC20(ctx, act.AssetLimitsUpdated, id, evt.Block, evt.Index, txID) + return app.banking.UpdateERC20(ctx, act.AssetLimitsUpdated, id, evt.Block, evt.Index, txID, evt.ChainID) case *types.ERC20EventBridgeStopped: - return app.banking.BridgeStopped( - ctx, act.BridgeStopped, id, evt.Block, evt.Index, txID) + return app.banking.BridgeStopped(ctx, act.BridgeStopped, id, evt.Block, evt.Index, txID, evt.ChainID) case *types.ERC20EventBridgeResumed: - return app.banking.BridgeResumed( - ctx, act.BridgeResumed, id, evt.Block, evt.Index, txID) + return app.banking.BridgeResumed(ctx, act.BridgeResumed, id, evt.Block, evt.Index, txID, evt.ChainID) default: return ErrUnsupportedEventAction } diff --git a/core/processor/processor.go b/core/processor/processor.go index 612abda007..7a02ff2271 100644 --- a/core/processor/processor.go +++ b/core/processor/processor.go @@ -40,7 +40,6 @@ import ( //go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/core/processor TimeService,EpochService,DelegationEngine,ExecutionEngine,GovernanceEngine,Stats,Assets,ValidatorTopology,Notary,EvtForwarder,Witness,Banking,NetworkParameters,OraclesEngine,OracleAdaptors,Limits,StakeVerifier,StakingAccounts,ERC20MultiSigTopology,Checkpoint var ( - ErrInvalidSignature = errors.New("invalid signature") ErrChainEventFromNonValidator = errors.New("chain event emitted from a non-validator node") ErrUnsupportedChainEvent = errors.New("unsupported chain event") ErrNodeSignatureFromNonValidator = errors.New("node signature not sent by validator") @@ -181,7 +180,7 @@ type ValidatorTopology interface { ProcessAnnounceNode(ctx context.Context, nr *commandspb.AnnounceNode) error ProcessValidatorHeartbeat(context.Context, *commandspb.ValidatorHeartbeat, func(message, signature, pubkey []byte) error, func(message, signature []byte, hexAddress string) error) error AddForwarder(ID string) - IssueSignatures(ctx context.Context, submitter, nodeID string, kind types.NodeSignatureKind) error + IssueSignatures(ctx context.Context, submitter, nodeID, chainID string, kind types.NodeSignatureKind) error } // Broker - the event bus. @@ -216,15 +215,15 @@ type Banking interface { EnableBuiltinAsset(context.Context, string) error DepositBuiltinAsset(context.Context, *types.BuiltinAssetDeposit, string, uint64) error WithdrawBuiltinAsset(context.Context, string, string, string, *num.Uint) error - EnableERC20(context.Context, *types.ERC20AssetList, string, uint64, uint64, string) error - UpdateERC20(context.Context, *types.ERC20AssetLimitsUpdated, string, uint64, uint64, string) error - DepositERC20(context.Context, *types.ERC20Deposit, string, uint64, uint64, string) error + EnableERC20(context.Context, *types.ERC20AssetList, string, uint64, uint64, string, string) error + UpdateERC20(context.Context, *types.ERC20AssetLimitsUpdated, string, uint64, uint64, string, string) error + DepositERC20(context.Context, *types.ERC20Deposit, string, uint64, uint64, string, string) error WithdrawERC20(context.Context, string, string, string, *num.Uint, *types.Erc20WithdrawExt) error - ERC20WithdrawalEvent(context.Context, *types.ERC20Withdrawal, uint64, uint64, string) error + ERC20WithdrawalEvent(context.Context, *types.ERC20Withdrawal, uint64, string, string) error TransferFunds(context.Context, *types.TransferFunds) error CancelTransferFunds(context.Context, *types.CancelTransferFunds) error - BridgeStopped(context.Context, bool, string, uint64, uint64, string) error - BridgeResumed(context.Context, bool, string, uint64, uint64, string) error + BridgeStopped(context.Context, bool, string, uint64, uint64, string, string) error + BridgeResumed(context.Context, bool, string, uint64, uint64, string, string) error CheckTransfer(t *types.TransferBase) error NewGovernanceTransfer(ctx context.Context, ID, reference string, transferConfig *types.NewTransferConfiguration) error VerifyGovernanceTransfer(transfer *types.NewTransferConfiguration) error diff --git a/core/protocol/all_services.go b/core/protocol/all_services.go index b3a57b753a..1df9a5639c 100644 --- a/core/protocol/all_services.go +++ b/core/protocol/all_services.go @@ -40,6 +40,7 @@ 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/genesis" @@ -85,7 +86,7 @@ type EthCallEngine interface { GetInitialTriggerTime(id string) (uint64, error) OnSpecActivated(ctx context.Context, spec datasource.Spec) error OnSpecDeactivated(ctx context.Context, spec datasource.Spec) - EnsureChainID(chainID string, blockInterval uint64, confirmWithClient bool) + EnsureChainID(ctx context.Context, chainID string, blockInterval uint64, confirmWithClient bool) } type allServices struct { @@ -131,8 +132,6 @@ type allServices struct { assets *assets.Service topology *validators.Topology notary *notary.SnapshotNotary - eventForwarder *evtforward.Forwarder - eventForwarderEngine EventForwarderEngine ethCallEngine EthCallEngine witness *validators.Witness banking *banking.Engine @@ -142,15 +141,23 @@ type allServices struct { teamsEngine *teams.SnapshottedEngine referralProgram *referral.SnapshottedEngine - // staking - ethClient *ethclient.Client - ethConfirmations *ethclient.EthereumConfirmations - stakingAccounts *staking.Accounting - stakeVerifier *staking.StakeVerifier - stakeCheckpoint *staking.Checkpoint - erc20MultiSigTopology *erc20multisig.Topology + primaryEventForwarder *evtforward.Forwarder + primaryEventForwarderEngine EventForwarderEngine + primaryEthConfirmations *ethclient.EthereumConfirmations + primaryEthClient *ethclient.PrimaryClient + primaryBridgeView *bridges.ERC20LogicView + primaryMultisig *erc20multisig.Topology + + secondaryEventForwarderEngine EventForwarderEngine + secondaryEthConfirmations *ethclient.EthereumConfirmations + secondaryEthClient *ethclient.SecondaryClient + secondaryBridgeView *bridges.ERC20LogicView + secondaryMultisig *erc20multisig.Topology - erc20BridgeView *bridges.ERC20LogicView + // staking + stakingAccounts *staking.Accounting + stakeVerifier *staking.StakeVerifier + stakeCheckpoint *staking.Checkpoint commander *nodewallets.Commander gastimator *processor.Gastimator @@ -170,27 +177,29 @@ func newServices( ctx context.Context, log *logging.Logger, conf *config.Watcher, - // this is a parameter as not reloaded as part of the protocol nodeWallets *nodewallets.NodeWallets, - ethClient *ethclient.Client, - ethConfirmations *ethclient.EthereumConfirmations, + primaryEthClient *ethclient.PrimaryClient, + secondaryEthClient *ethclient.SecondaryClient, + primaryEthConfirmations *ethclient.EthereumConfirmations, + secondaryEthConfirmations *ethclient.EthereumConfirmations, blockchainClient *blockchain.Client, vegaPaths paths.Paths, stats *stats.Stats, - l2Clients *ethclient.L2Clients, ) (_ *allServices, err error) { svcs := &allServices{ - ctx: ctx, - log: log, - confWatcher: conf, - conf: conf.Get(), - ethClient: ethClient, - l2Clients: l2Clients, - ethConfirmations: ethConfirmations, - blockchainClient: blockchainClient, - stats: stats, - vegaPaths: vegaPaths, + ctx: ctx, + log: log, + confWatcher: conf, + conf: conf.Get(), + primaryEthClient: primaryEthClient, + secondaryEthClient: secondaryEthClient, + l2Clients: l2Clients, + primaryEthConfirmations: primaryEthConfirmations, + secondaryEthConfirmations: secondaryEthConfirmations, + blockchainClient: blockchainClient, + stats: stats, + vegaPaths: vegaPaths, } svcs.broker, err = broker.New(svcs.ctx, svcs.log, svcs.conf.Broker, stats.Blockchain) @@ -199,9 +208,6 @@ func newServices( return nil, err } - // this will be needed very soon, instantiate straight away - svcs.erc20BridgeView = bridges.NewERC20LogicView(ethClient, ethConfirmations) - svcs.timeService = vegatime.New(svcs.conf.Time, svcs.broker) svcs.epochService = epochtime.NewService(svcs.log, svcs.conf.Epoch, svcs.broker) @@ -225,37 +231,41 @@ func newServices( svcs.netParams = netparams.New(svcs.log, svcs.conf.NetworkParameters, svcs.broker) - svcs.erc20MultiSigTopology = erc20multisig.NewERC20MultisigTopology( - svcs.conf.ERC20MultiSig, svcs.log, nil, svcs.broker, svcs.ethClient, svcs.ethConfirmations, svcs.netParams, - ) + svcs.primaryMultisig = erc20multisig.NewERC20MultisigTopology(svcs.conf.ERC20MultiSig, svcs.log, nil, svcs.broker, svcs.primaryEthClient, svcs.primaryEthConfirmations, svcs.netParams, "primary") + svcs.secondaryMultisig = erc20multisig.NewERC20MultisigTopology(svcs.conf.ERC20MultiSig, svcs.log, nil, svcs.broker, svcs.secondaryEthClient, svcs.secondaryEthConfirmations, svcs.netParams, "secondary") if svcs.conf.IsValidator() { - svcs.topology = validators.NewTopology(svcs.log, svcs.conf.Validators, validators.WrapNodeWallets(nodeWallets), svcs.broker, svcs.conf.IsValidator(), svcs.commander, svcs.erc20MultiSigTopology, svcs.timeService) + svcs.topology = validators.NewTopology(svcs.log, svcs.conf.Validators, validators.WrapNodeWallets(nodeWallets), svcs.broker, svcs.conf.IsValidator(), svcs.commander, svcs.primaryMultisig, svcs.secondaryMultisig, svcs.timeService) } else { - svcs.topology = validators.NewTopology(svcs.log, svcs.conf.Validators, nil, svcs.broker, svcs.conf.IsValidator(), nil, svcs.erc20MultiSigTopology, svcs.timeService) + svcs.topology = validators.NewTopology(svcs.log, svcs.conf.Validators, nil, svcs.broker, svcs.conf.IsValidator(), nil, svcs.primaryMultisig, svcs.secondaryMultisig, svcs.timeService) } svcs.protocolUpgradeEngine = protocolupgrade.New(svcs.log, svcs.conf.ProtocolUpgrade, svcs.broker, svcs.topology, version.Get()) svcs.witness = validators.NewWitness(svcs.ctx, svcs.log, svcs.conf.Validators, svcs.topology, svcs.commander, svcs.timeService) // this is done to go around circular deps... - svcs.erc20MultiSigTopology.SetWitness(svcs.witness) - svcs.eventForwarder = evtforward.New(svcs.log, svcs.conf.EvtForward, svcs.commander, svcs.timeService, svcs.topology) + 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) if svcs.conf.HaveEthClient() { - svcs.eventForwarderEngine = evtforward.NewEngine(svcs.log, svcs.conf.EvtForward) + svcs.primaryBridgeView = bridges.NewERC20LogicView(primaryEthClient, primaryEthConfirmations) + svcs.secondaryBridgeView = bridges.NewERC20LogicView(secondaryEthClient, secondaryEthConfirmations) + svcs.primaryEventForwarderEngine = evtforward.NewEngine(svcs.log, svcs.conf.EvtForward.Ethereum) + svcs.secondaryEventForwarderEngine = evtforward.NewEngine(svcs.log, svcs.conf.EvtForward.EVMBridges[0]) } else { - svcs.eventForwarderEngine = evtforward.NewNoopEngine(svcs.log, svcs.conf.EvtForward) + svcs.primaryEventForwarderEngine = evtforward.NewNoopEngine(svcs.log, svcs.conf.EvtForward.Ethereum) + svcs.secondaryEventForwarderEngine = evtforward.NewNoopEngine(svcs.log, ethereum.NewDefaultConfig()) } svcs.oracle = spec.NewEngine(svcs.log, svcs.conf.Oracles, svcs.timeService, svcs.broker) - svcs.ethCallEngine = ethcall.NewEngine(svcs.log, svcs.conf.EvtForward.EthCall, svcs.conf.IsValidator(), svcs.ethClient, svcs.eventForwarder) + svcs.ethCallEngine = ethcall.NewEngine(svcs.log, svcs.conf.EvtForward.EthCall, svcs.conf.IsValidator(), svcs.primaryEthClient, svcs.primaryEventForwarder) - svcs.l2CallEngines = NewL2EthCallEngines(svcs.log, svcs.conf.EvtForward.EthCall, svcs.conf.IsValidator(), svcs.l2Clients, svcs.eventForwarder, svcs.oracle.AddSpecActivationListener) + svcs.l2CallEngines = NewL2EthCallEngines(svcs.log, svcs.conf.EvtForward.EthCall, svcs.conf.IsValidator(), svcs.l2Clients, svcs.primaryEventForwarder, svcs.oracle.AddSpecActivationListener) svcs.ethereumOraclesVerifier = ethverifier.New(svcs.log, svcs.witness, svcs.timeService, svcs.broker, - svcs.oracle, svcs.ethCallEngine, svcs.ethConfirmations, svcs.conf.HaveEthClient()) + svcs.oracle, svcs.ethCallEngine, svcs.primaryEthConfirmations, svcs.conf.HaveEthClient()) svcs.l2Verifiers = ethverifier.NewL2Verifiers(svcs.log, svcs.witness, svcs.timeService, svcs.broker, svcs.oracle, svcs.l2Clients, svcs.l2CallEngines, svcs.conf.IsValidator()) @@ -267,10 +277,11 @@ func newServices( svcs.oracleAdaptors = oracleAdaptors.New() // this is done to go around circular deps again..s - svcs.erc20MultiSigTopology.SetEthereumEventSource(svcs.eventForwarderEngine) + svcs.primaryMultisig.SetEthereumEventSource(svcs.primaryEventForwarderEngine) + svcs.secondaryMultisig.SetEthereumEventSource(svcs.secondaryEventForwarderEngine) svcs.stakingAccounts, svcs.stakeVerifier, svcs.stakeCheckpoint = staking.New( - svcs.log, svcs.conf.Staking, svcs.timeService, svcs.broker, svcs.witness, svcs.ethClient, svcs.netParams, svcs.eventForwarder, svcs.conf.HaveEthClient(), svcs.ethConfirmations, svcs.eventForwarderEngine, + 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.epochService.NotifyOnEpoch(svcs.topology.OnEpochEvent, svcs.topology.OnEpochRestore) svcs.epochService.NotifyOnEpoch(stats.OnEpochEvent, stats.OnEpochRestore) @@ -285,9 +296,15 @@ func newServices( svcs.notary = notary.NewWithSnapshot(svcs.log, svcs.conf.Notary, svcs.topology, svcs.broker, svcs.commander) if svcs.conf.IsValidator() { - svcs.assets = assets.New(svcs.log, svcs.conf.Assets, nodeWallets.Ethereum, svcs.ethClient, svcs.broker, svcs.erc20BridgeView, svcs.notary, svcs.conf.HaveEthClient()) + svcs.assets, err = assets.New(ctx, svcs.log, svcs.conf.Assets, nodeWallets.Ethereum, svcs.primaryEthClient, svcs.secondaryEthClient, svcs.broker, svcs.primaryBridgeView, svcs.secondaryBridgeView, svcs.notary, svcs.conf.HaveEthClient()) + if err != nil { + return nil, fmt.Errorf("could not initialize assets engine: %w", err) + } } else { - svcs.assets = assets.New(svcs.log, svcs.conf.Assets, nil, svcs.ethClient, svcs.broker, svcs.erc20BridgeView, svcs.notary, svcs.conf.HaveEthClient()) + svcs.assets, err = assets.New(ctx, svcs.log, svcs.conf.Assets, nil, nil, nil, svcs.broker, nil, nil, svcs.notary, svcs.conf.HaveEthClient()) + if err != nil { + return nil, fmt.Errorf("could not initialize assets engine: %w", err) + } } // TODO(): this is not pretty @@ -309,7 +326,7 @@ 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.erc20BridgeView, svcs.eventForwarderEngine) + 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) // instantiate the execution engine svcs.executionEngine = execution.NewEngine( @@ -369,7 +386,7 @@ func newServices( svcs.registerTimeServiceCallbacks() // checkpoint engine - svcs.checkpoint, err = checkpoint.New(svcs.log, svcs.conf.Checkpoint, svcs.assets, svcs.collateral, svcs.governance, svcs.netParams, svcs.delegation, svcs.epochService, svcs.topology, svcs.banking, svcs.stakeCheckpoint, svcs.erc20MultiSigTopology, svcs.marketActivityTracker, svcs.executionEngine) + svcs.checkpoint, err = checkpoint.New(svcs.log, svcs.conf.Checkpoint, svcs.assets, svcs.collateral, svcs.governance, svcs.netParams, svcs.delegation, svcs.epochService, svcs.topology, svcs.banking, svcs.stakeCheckpoint, svcs.primaryMultisig, svcs.marketActivityTracker, svcs.executionEngine) if err != nil { return nil, err } @@ -406,10 +423,36 @@ func newServices( // notify delegation, rewards, and accounting on changes in the validator pub key svcs.topology.NotifyOnKeyChange(svcs.governance.ValidatorKeyChanged) - svcs.snapshotEngine.AddProviders(svcs.checkpoint, svcs.collateral, svcs.governance, svcs.delegation, svcs.netParams, svcs.epochService, svcs.assets, svcs.banking, svcs.witness, - svcs.notary, svcs.stakingAccounts, svcs.stakeVerifier, svcs.limits, svcs.topology, svcs.eventForwarder, svcs.executionEngine, svcs.marketActivityTracker, svcs.statevar, - svcs.erc20MultiSigTopology, svcs.protocolUpgradeEngine, svcs.ethereumOraclesVerifier, svcs.vesting, svcs.activityStreak, svcs.referralProgram, svcs.volumeDiscount, - svcs.teamsEngine, svcs.spam, svcs.l2Verifiers) + svcs.snapshotEngine.AddProviders( + svcs.checkpoint, + svcs.collateral, + svcs.governance, + svcs.delegation, + svcs.netParams, + svcs.epochService, + svcs.assets, + svcs.banking, + svcs.witness, + svcs.notary, + svcs.stakingAccounts, + svcs.stakeVerifier, + svcs.limits, + svcs.topology, + svcs.primaryEventForwarder, + svcs.executionEngine, + svcs.marketActivityTracker, + svcs.statevar, + svcs.primaryMultisig, + erc20multisig.NewEVMTopologies(svcs.secondaryMultisig), + svcs.protocolUpgradeEngine, + svcs.ethereumOraclesVerifier, + svcs.vesting, + svcs.activityStreak, + svcs.referralProgram, + svcs.volumeDiscount, + svcs.teamsEngine, + svcs.spam, + svcs.l2Verifiers) pow := pow.New(svcs.log, svcs.conf.PoW) @@ -467,10 +510,11 @@ func (svcs *allServices) registerTimeServiceCallbacks() { svcs.epochService.OnTick, svcs.builtinOracle.OnTick, svcs.netParams.OnTick, - svcs.erc20MultiSigTopology.OnTick, + svcs.primaryMultisig.OnTick, + svcs.secondaryMultisig.OnTick, svcs.witness.OnTick, - svcs.eventForwarder.OnTick, + svcs.primaryEventForwarder.OnTick, svcs.stakeVerifier.OnTick, svcs.statevar.OnTick, svcs.executionEngine.OnTick, @@ -487,7 +531,8 @@ func (svcs *allServices) registerTimeServiceCallbacks() { func (svcs *allServices) Stop() { svcs.confWatcher.Unregister(svcs.confListenerIDs) - svcs.eventForwarderEngine.Stop() + svcs.primaryEventForwarderEngine.Stop() + svcs.secondaryEventForwarderEngine.Stop() svcs.snapshotEngine.Close() svcs.ethCallEngine.Stop() } @@ -496,8 +541,13 @@ func (svcs *allServices) registerConfigWatchers() { svcs.confListenerIDs = svcs.confWatcher.OnConfigUpdateWithID( func(cfg config.Config) { svcs.executionEngine.ReloadConf(cfg.Execution) }, func(cfg config.Config) { svcs.notary.ReloadConf(cfg.Notary) }, - func(cfg config.Config) { svcs.eventForwarderEngine.ReloadConf(cfg.EvtForward) }, - func(cfg config.Config) { svcs.eventForwarder.ReloadConf(cfg.EvtForward) }, + func(cfg config.Config) { svcs.primaryEventForwarderEngine.ReloadConf(cfg.EvtForward.Ethereum) }, + func(cfg config.Config) { svcs.primaryEventForwarder.ReloadConf(cfg.EvtForward) }, + func(cfg config.Config) { + if len(cfg.EvtForward.EVMBridges) > 0 { + svcs.secondaryEventForwarderEngine.ReloadConf(cfg.EvtForward.EVMBridges[0]) + } + }, func(cfg config.Config) { svcs.topology.ReloadConf(cfg.Validators) }, func(cfg config.Config) { svcs.witness.ReloadConf(cfg.Validators) }, func(cfg config.Config) { svcs.assets.ReloadConf(cfg.Assets) }, @@ -568,6 +618,10 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) Param: netparams.SpamProtectionMinMultisigUpdates, Watcher: svcs.spam.OnMinTokensForMultisigUpdatesChanged, }, + { + Param: netparams.SpamProtectionMaxMultisigUpdates, + Watcher: svcs.spam.OnMaxMultisigUpdatesChanged, + }, { Param: netparams.ReferralProgramMinStakedVegaTokens, Watcher: svcs.spam.OnMinTokensForReferral, @@ -673,18 +727,42 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) Watcher: svcs.executionEngine.OnMarketValueWindowLengthUpdate, }, { - Param: netparams.BlockchainsEthereumConfig, + Param: netparams.BlockchainsPrimaryEthereumConfig, Watcher: func(ctx context.Context, cfg interface{}) error { ethCfg, err := types.EthereumConfigFromUntypedProto(cfg) if err != nil { - return fmt.Errorf("invalid Ethereum configuration: %w", err) + return fmt.Errorf("invalid primary ethereum configuration: %w", err) + } + + if err := svcs.primaryEthClient.UpdateEthereumConfig(ctx, ethCfg); err != nil { + return err + } + + svcs.assets.SetBridgeChainID(ethCfg.ChainID(), true) + return svcs.primaryEventForwarderEngine.SetupEthereumEngine(svcs.primaryEthClient, svcs.primaryEventForwarder, svcs.conf.EvtForward.Ethereum, ethCfg, svcs.assets) + }, + }, + { + Param: netparams.BlockchainsEVMBridgeConfigs, + Watcher: func(ctx context.Context, cfg interface{}) error { + cfgs, err := types.EVMChainConfigFromUntypedProto(cfg) + if err != nil { + return fmt.Errorf("invalid secondary ethereum configuration: %w", err) } - if err := svcs.ethClient.UpdateEthereumConfig(ethCfg); err != nil { + ethCfg := cfgs.Configs[0] + + if err := svcs.secondaryEthClient.UpdateEthereumConfig(ctx, ethCfg); err != nil { return err } - return svcs.eventForwarderEngine.SetupEthereumEngine(svcs.ethClient, svcs.eventForwarder, svcs.conf.EvtForward.Ethereum, ethCfg, svcs.assets) + svcs.assets.SetBridgeChainID(ethCfg.ChainID(), false) + + var bridgeCfg ethereum.Config + if svcs.conf.HaveEthClient() { + bridgeCfg = svcs.conf.EvtForward.EVMBridges[0] + } + return svcs.secondaryEventForwarderEngine.SetupSecondaryEthereumEngine(svcs.secondaryEthClient, svcs.primaryEventForwarder, bridgeCfg, ethCfg, svcs.assets) }, }, { @@ -842,7 +920,7 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) Watcher: svcs.banking.OnMinWithdrawQuantumMultiple, }, { - Param: netparams.BlockchainsEthereumConfig, + Param: netparams.BlockchainsPrimaryEthereumConfig, Watcher: func(_ context.Context, cfg interface{}) error { // nothing to do if not a validator if !svcs.conf.HaveEthClient() { @@ -850,30 +928,72 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) } ethCfg, err := types.EthereumConfigFromUntypedProto(cfg) if err != nil { - return fmt.Errorf("invalid ethereum configuration: %w", err) + return fmt.Errorf("invalid primary ethereum configuration: %w", err) } - svcs.ethConfirmations.UpdateConfirmations(ethCfg.Confirmations()) + svcs.primaryEthConfirmations.UpdateConfirmations(ethCfg.Confirmations()) return nil }, }, { - Param: netparams.BlockchainsEthereumConfig, + Param: netparams.BlockchainsEVMBridgeConfigs, Watcher: func(_ context.Context, cfg interface{}) error { + // nothing to do if not a validator + if !svcs.conf.HaveEthClient() { + return nil + } + ethCfg, err := types.EVMChainConfigFromUntypedProto(cfg) + if err != nil { + return fmt.Errorf("invalid secondary ethereum configuration: %w", err) + } + + svcs.secondaryEthConfirmations.UpdateConfirmations(ethCfg.Configs[0].Confirmations()) + return nil + }, + }, + { + Param: netparams.BlockchainsPrimaryEthereumConfig, + Watcher: func(ctx context.Context, cfg interface{}) error { ethCfg, err := types.EthereumConfigFromUntypedProto(cfg) if err != nil { - return fmt.Errorf("invalid ethereum configuration: %w", err) + return fmt.Errorf("invalid primary ethereum configuration: %w", err) } // every 1 block for the main ethereum chain is acceptable - svcs.ethCallEngine.EnsureChainID(ethCfg.ChainID(), 1, svcs.conf.HaveEthClient()) + svcs.ethCallEngine.EnsureChainID(ctx, ethCfg.ChainID(), 1, svcs.conf.HaveEthClient()) // nothing to do if not a validator if !svcs.conf.HaveEthClient() { return nil } - svcs.witness.SetDefaultConfirmations(ethCfg.Confirmations()) + svcs.witness.SetPrimaryDefaultConfirmations(ethCfg.ChainID(), ethCfg.Confirmations()) + return nil + }, + }, + { + Param: netparams.BlockchainsPrimaryEthereumConfig, + Watcher: func(_ context.Context, cfg interface{}) error { + ethCfg, err := types.EthereumConfigFromUntypedProto(cfg) + if err != nil { + return fmt.Errorf("invalid primary ethereum configuration: %w", err) + } + + svcs.banking.OnPrimaryEthChainIDUpdated(ethCfg.ChainID()) + return nil + }, + }, + { + Param: netparams.BlockchainsEVMBridgeConfigs, + Watcher: func(_ context.Context, cfgs interface{}) error { + ethCfgs, err := types.EVMChainConfigFromUntypedProto(cfgs) + if err != nil { + return fmt.Errorf("invalid secondary ethereum configuration: %w", err) + } + + ethCfg := ethCfgs.Configs[0] + svcs.banking.OnSecondaryEthChainIDUpdated(ethCfg.ChainID()) + svcs.witness.SetSecondaryDefaultConfirmations(ethCfg.ChainID(), ethCfg.Confirmations(), ethCfg.BlockTime()) return nil }, }, @@ -890,10 +1010,8 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) } // non-validators still need to create these engine's for consensus reasons - svcs.l2CallEngines.OnEthereumL2ConfigsUpdated( - ctx, ethCfg) - svcs.l2Verifiers.OnEthereumL2ConfigsUpdated( - ctx, ethCfg) + svcs.l2CallEngines.OnEthereumL2ConfigsUpdated(ctx, ethCfg) + svcs.l2Verifiers.OnEthereumL2ConfigsUpdated(ctx, ethCfg) return nil }, diff --git a/core/protocol/engines.go b/core/protocol/engines.go index bf5999ad18..1ea51cc318 100644 --- a/core/protocol/engines.go +++ b/core/protocol/engines.go @@ -16,14 +16,15 @@ package protocol import ( - "code.vegaprotocol.io/vega/core/evtforward" + "code.vegaprotocol.io/vega/core/evtforward/ethereum" evtfwdeth "code.vegaprotocol.io/vega/core/evtforward/ethereum" "code.vegaprotocol.io/vega/core/types" ) type EventForwarderEngine interface { - ReloadConf(evtforward.Config) + ReloadConf(ethereum.Config) SetupEthereumEngine(evtfwdeth.Client, evtfwdeth.Forwarder, evtfwdeth.Config, *types.EthereumConfig, evtfwdeth.Assets) error + SetupSecondaryEthereumEngine(evtfwdeth.Client, evtfwdeth.Forwarder, evtfwdeth.Config, *types.EVMChainConfig, evtfwdeth.Assets) error Start() Stop() diff --git a/core/protocol/l2_eth_call_engines.go b/core/protocol/l2_eth_call_engines.go index 09187c2265..c8a22bd992 100644 --- a/core/protocol/l2_eth_call_engines.go +++ b/core/protocol/l2_eth_call_engines.go @@ -72,7 +72,7 @@ func (v *L2EthCallEngines) OnEthereumL2ConfigsUpdated( // if already exists, do nothing if e, ok := v.engines[c.ChainID]; ok { // the blockInterval might have changed, so let just call that. - e.EnsureChainID(c.ChainID, c.BlockInterval, v.isValidator) + e.EnsureChainID(ctx, c.ChainID, c.BlockInterval, v.isValidator) continue } @@ -89,7 +89,7 @@ func (v *L2EthCallEngines) OnEthereumL2ConfigsUpdated( } e := ethcall.NewEngine(v.log, v.cfg, v.isValidator, clt, v.forwarder) - e.EnsureChainID(c.ChainID, c.BlockInterval, v.isValidator) + e.EnsureChainID(ctx, c.ChainID, c.BlockInterval, v.isValidator) v.engines[c.ChainID] = e // if we are restoring from a snapshot we want to delay starting the engine diff --git a/core/protocol/protocol.go b/core/protocol/protocol.go index bd94fd49a6..86383ab3b3 100644 --- a/core/protocol/protocol.go +++ b/core/protocol/protocol.go @@ -61,13 +61,15 @@ func New( cancel func(), stopBlockchain func() error, nodewallets *nodewallets.NodeWallets, - ethClient *ethclient.Client, - ethConfirmation *ethclient.EthereumConfirmations, + primaryEthClient *ethclient.PrimaryClient, + secondaryEthClient *ethclient.SecondaryClient, + primaryEthConfirmation *ethclient.EthereumConfirmations, + secondaryEthConfirmation *ethclient.EthereumConfirmations, blockchainClient *blockchain.Client, vegaPaths paths.Paths, stats *stats.Stats, l2Clients *ethclient.L2Clients, -) (p *Protocol, err error) { +) (proto *Protocol, err error) { log = log.Named(namedLogger) defer func() { @@ -76,20 +78,31 @@ func New( return } - ids := p.confWatcher.OnConfigUpdateWithID( - func(cfg config.Config) { p.ReloadConf(cfg.Processor) }, + ids := proto.confWatcher.OnConfigUpdateWithID( + func(cfg config.Config) { proto.ReloadConf(cfg.Processor) }, ) - p.confListenerIDs = ids + proto.confListenerIDs = ids }() svcs, err := newServices( - ctx, log, confWatcher, nodewallets, ethClient, ethConfirmation, blockchainClient, vegaPaths, stats, l2Clients, + ctx, + log, + confWatcher, + nodewallets, + primaryEthClient, + secondaryEthClient, + primaryEthConfirmation, + secondaryEthConfirmation, + blockchainClient, + vegaPaths, + stats, + l2Clients, ) if err != nil { return nil, err } - proto := &Protocol{ + proto = &Protocol{ App: processor.NewApp( log, svcs.vegaPaths, @@ -100,7 +113,7 @@ func New( svcs.banking, svcs.broker, svcs.witness, - svcs.eventForwarder, + svcs.primaryEventForwarder, svcs.executionEngine, svcs.genesisHandler, svcs.governance, @@ -129,7 +142,8 @@ func New( svcs.referralProgram, svcs.volumeDiscount, svcs.blockchainClient, - svcs.erc20MultiSigTopology, + svcs.primaryMultisig, + svcs.secondaryMultisig, stats.GetVersion(), svcs.protocolUpgradeEngine, svcs.codec, @@ -149,8 +163,12 @@ func New( Watcher: proto.App.OnSpamProtectionMaxBatchSizeUpdate, }, netparams.WatchParam{ - Param: netparams.BlockchainsEthereumConfig, - Watcher: proto.App.OnBlockchainEthereumConfigUpdate, + Param: netparams.BlockchainsPrimaryEthereumConfig, + Watcher: proto.App.OnBlockchainPrimaryEthereumConfigUpdate, + }, + netparams.WatchParam{ + Param: netparams.BlockchainsEVMBridgeConfigs, + Watcher: proto.App.OnBlockchainEVMChainConfigUpdate, }, ) @@ -180,7 +198,7 @@ func (n *Protocol) Protocol() semver.Version { } func (n *Protocol) GetEventForwarder() *evtforward.Forwarder { - return n.services.eventForwarder + return n.services.primaryEventForwarder } func (n *Protocol) GetTimeService() *vegatime.Svc { diff --git a/core/protocol/upon_genesis.go b/core/protocol/upon_genesis.go index ecaa7a8a9f..10f97ec0b6 100644 --- a/core/protocol/upon_genesis.go +++ b/core/protocol/upon_genesis.go @@ -17,7 +17,6 @@ package protocol import ( "context" - "errors" "fmt" "sort" @@ -30,11 +29,6 @@ import ( "golang.org/x/exp/maps" ) -var ( - ErrUnknownChainProvider = errors.New("unknown chain provider") - ErrERC20AssetWithNullChain = errors.New("cannot use ERC20 asset with nullchain") -) - // UponGenesis loads all asset from genesis state. func (svcs *allServices) UponGenesis(ctx context.Context, rawstate []byte) (err error) { svcs.log.Debug("Entering node.NodeCommand.UponGenesis") @@ -66,9 +60,7 @@ func (svcs *allServices) UponGenesis(ctx context.Context, rawstate []byte) (err return nil } -func (svcs *allServices) loadAsset( - ctx context.Context, id string, v *proto.AssetDetails, -) error { +func (svcs *allServices) loadAsset(ctx context.Context, id string, v *proto.AssetDetails) error { rawAsset, err := types.AssetDetailsFromProto(v) if err != nil { return err @@ -78,6 +70,10 @@ func (svcs *allServices) loadAsset( return fmt.Errorf("error instanciating asset %v", err) } + if !rawAsset.Quantum.IsPositive() { + svcs.log.Panic("invalid asset found - asset quantum must be positive", logging.String("quantum", rawAsset.Quantum.String())) + } + asset, err := svcs.assets.Get(aid) if err != nil { return fmt.Errorf("unable to get asset %v", err) diff --git a/core/protocolupgrade/engine.go b/core/protocolupgrade/engine.go index 63cf8d3801..23c1da23be 100644 --- a/core/protocolupgrade/engine.go +++ b/core/protocolupgrade/engine.go @@ -121,7 +121,7 @@ func (e *Engine) OnRequiredMajorityChanged(_ context.Context, requiredMajority n return nil } -func (e *Engine) IsValidProposal(ctx context.Context, pk string, upgradeBlockHeight uint64, vegaReleaseTag string) error { +func (e *Engine) IsValidProposal(_ context.Context, pk string, upgradeBlockHeight uint64, vegaReleaseTag string) error { if !e.topology.IsTendermintValidator(pk) { // not a tendermint validator, so we don't care about their intention return errors.New("only tendermint validator can propose a protocol upgrade") @@ -143,7 +143,7 @@ func (e *Engine) IsValidProposal(ctx context.Context, pk string, upgradeBlockHei } if semver.MustParse(TrimReleaseTag(e.currentVersion)).GT(newv) { - return errors.New("upgrade version is too old") + return fmt.Errorf("upgrade version is too old (%s > %s)", e.currentVersion, newv) } return nil diff --git a/core/protocolupgrade/engine_test.go b/core/protocolupgrade/engine_test.go index 5fd6999fee..fbbd8327ca 100644 --- a/core/protocolupgrade/engine_test.go +++ b/core/protocolupgrade/engine_test.go @@ -81,7 +81,7 @@ func testDowngradeVersionNotAllowed(t *testing.T) { evts = append(evts, event) }).AnyTimes() // validator1 proposed an upgrade to v1 at block height 100 - require.EqualError(t, e.UpgradeProposal(context.Background(), "pk1", 100, "0.53.0"), "upgrade version is too old") + require.EqualError(t, e.UpgradeProposal(context.Background(), "pk1", 100, "0.53.0"), "upgrade version is too old (0.54.0 > 0.53.0)") } func testRevertProposal(t *testing.T) { diff --git a/core/referral/engine.go b/core/referral/engine.go index 168a4a02e3..a5d1479742 100644 --- a/core/referral/engine.go +++ b/core/referral/engine.go @@ -55,6 +55,10 @@ var ( return fmt.Errorf("party %q is not part of a referral set", party) } + ErrPartyDoesNotOwnReferralSet = func(party types.PartyID) error { + return fmt.Errorf("party %q does not own the referral set", party) + } + ErrUnknownSetID = errors.New("unknown set ID") ) @@ -145,9 +149,16 @@ func (e *Engine) GetReferrer(referee types.PartyID) (types.PartyID, error) { return e.sets[setID].Referrer.PartyID, nil } -func (e *Engine) SetExists(setID types.ReferralSetID) bool { - _, ok := e.sets[setID] - return ok +func (e *Engine) PartyOwnsReferralSet(referer types.PartyID, setID types.ReferralSetID) error { + rf, ok := e.sets[setID] + if !ok { + return ErrUnknownSetID + } + + if referer != rf.Referrer.PartyID { + return ErrPartyDoesNotOwnReferralSet(referer) + } + return nil } func (e *Engine) CreateReferralSet(ctx context.Context, party types.PartyID, deterministicSetID types.ReferralSetID) error { diff --git a/core/referral/engine_test.go b/core/referral/engine_test.go index c1536bccb1..560a6ffe70 100644 --- a/core/referral/engine_test.go +++ b/core/referral/engine_test.go @@ -45,7 +45,7 @@ func TestReferralSet(t *testing.T) { require.NoError(t, te.engine.OnReferralProgramMinStakedVegaTokensUpdate(context.Background(), num.NewUint(100))) t.Run("querying for a non existing set return false", func(t *testing.T) { - require.False(t, te.engine.SetExists(setID)) + require.ErrorIs(t, referral.ErrUnknownSetID, te.engine.PartyOwnsReferralSet(referrer, setID)) }) t.Run("cannot join a non-existing set", func(t *testing.T) { @@ -59,6 +59,10 @@ func TestReferralSet(t *testing.T) { te.timeSvc.EXPECT().GetTimeNow().Times(1) assert.NoError(t, te.engine.CreateReferralSet(ctx, referrer, setID)) + + // check ownership query + require.NoError(t, te.engine.PartyOwnsReferralSet(referrer, setID)) + require.Error(t, referral.ErrPartyDoesNotOwnReferralSet(referrer2), te.engine.PartyOwnsReferralSet(referrer2, setID)) }) t.Run("cannot create a set multiple times", func(t *testing.T) { diff --git a/core/rewards/engine.go b/core/rewards/engine.go index 18d25e9ef9..2d06ea1c28 100644 --- a/core/rewards/engine.go +++ b/core/rewards/engine.go @@ -30,7 +30,7 @@ import ( var ( decimal1, _ = num.DecimalFromString("1") - rewardAccountTypes = []types.AccountType{types.AccountTypeGlobalReward, types.AccountTypeFeesInfrastructure, types.AccountTypeMakerReceivedFeeReward, types.AccountTypeMakerPaidFeeReward, types.AccountTypeLPFeeReward, types.AccountTypeMarketProposerReward, types.AccountTypeAveragePositionReward, types.AccountTypeRelativeReturnReward, types.AccountTypeReturnVolatilityReward, types.AccountTypeValidatorRankingReward} + rewardAccountTypes = []types.AccountType{types.AccountTypeGlobalReward, types.AccountTypeFeesInfrastructure, types.AccountTypeMakerReceivedFeeReward, types.AccountTypeMakerPaidFeeReward, types.AccountTypeLPFeeReward, types.AccountTypeMarketProposerReward, types.AccountTypeAveragePositionReward, types.AccountTypeRelativeReturnReward, types.AccountTypeReturnVolatilityReward, types.AccountTypeValidatorRankingReward, types.AccountTypeRealisedReturnReward} ) //go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/core/rewards MarketActivityTracker,Delegation,TimeService,Topology,Transfers,Teams,Vesting,ActivityStreak @@ -46,7 +46,7 @@ type MarketActivityTracker interface { GetProposer(market string) string CalculateMetricForIndividuals(ctx context.Context, ds *vega.DispatchStrategy) []*types.PartyContributionScore CalculateMetricForTeams(ctx context.Context, ds *vega.DispatchStrategy) ([]*types.PartyContributionScore, map[string][]*types.PartyContributionScore) - GetLastEpochTakeFees(asset string, market []string) map[string]*num.Uint + GetLastEpochTakeFees(asset string, market []string, epochs int32) map[string]*num.Uint } // EpochEngine notifies the reward engine at the end of an epoch. @@ -376,14 +376,18 @@ func (e *Engine) calculateRewardTypeForAsset(ctx context.Context, epochSeq, asse balance, _ := num.UintFromDecimal(account.Balance.ToDecimal().Mul(factor)) e.log.Info("reward balance", logging.String("epoch", epochSeq), logging.String("reward-type", rewardType.String()), logging.String("account-balance", account.Balance.String()), logging.String("factor", factor.String()), logging.String("effective-balance", balance.String())) return calculateRewardsByStake(epochSeq, account.Asset, account.ID, balance, validatorNormalisedScores, validatorData, e.global.delegatorShare, num.UintZero(), e.log) - case types.AccountTypeMakerReceivedFeeReward, types.AccountTypeMakerPaidFeeReward, types.AccountTypeLPFeeReward, types.AccountTypeAveragePositionReward, types.AccountTypeRelativeReturnReward, types.AccountTypeReturnVolatilityReward: + case types.AccountTypeMakerReceivedFeeReward, types.AccountTypeMakerPaidFeeReward, types.AccountTypeLPFeeReward, types.AccountTypeAveragePositionReward, types.AccountTypeRelativeReturnReward, types.AccountTypeReturnVolatilityReward, types.AccountTypeRealisedReturnReward: ds := e.transfers.GetDispatchStrategy(account.MarketID) if ds == nil { return nil } var takerFeesPaidInRewardAsset map[string]*num.Uint if ds.CapRewardFeeMultiple != nil { - takerFeesPaid := e.marketActivityTracker.GetLastEpochTakeFees(ds.AssetForMetric, ds.Markets) + epochs := int32(1) + if ds.TransferInterval != nil { + epochs = *ds.TransferInterval + } + takerFeesPaid := e.marketActivityTracker.GetLastEpochTakeFees(ds.AssetForMetric, ds.Markets, epochs) takerFeesPaidInRewardAsset = e.convertTakerFeesToRewardAsset(takerFeesPaid, ds.AssetForMetric, asset) } if ds.EntityScope == vega.EntityScope_ENTITY_SCOPE_INDIVIDUALS { diff --git a/core/rewards/mocks/mocks.go b/core/rewards/mocks/mocks.go index c5bbdc00dd..171e9bd3e4 100644 --- a/core/rewards/mocks/mocks.go +++ b/core/rewards/mocks/mocks.go @@ -83,17 +83,17 @@ func (mr *MockMarketActivityTrackerMockRecorder) GetAllMarketIDs() *gomock.Call } // GetLastEpochTakeFees mocks base method. -func (m *MockMarketActivityTracker) GetLastEpochTakeFees(arg0 string, arg1 []string) map[string]*num.Uint { +func (m *MockMarketActivityTracker) GetLastEpochTakeFees(arg0 string, arg1 []string, arg2 int32) map[string]*num.Uint { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetLastEpochTakeFees", arg0, arg1) + ret := m.ctrl.Call(m, "GetLastEpochTakeFees", arg0, arg1, arg2) ret0, _ := ret[0].(map[string]*num.Uint) return ret0 } // GetLastEpochTakeFees indicates an expected call of GetLastEpochTakeFees. -func (mr *MockMarketActivityTrackerMockRecorder) GetLastEpochTakeFees(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockMarketActivityTrackerMockRecorder) GetLastEpochTakeFees(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLastEpochTakeFees", reflect.TypeOf((*MockMarketActivityTracker)(nil).GetLastEpochTakeFees), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLastEpochTakeFees", reflect.TypeOf((*MockMarketActivityTracker)(nil).GetLastEpochTakeFees), arg0, arg1, arg2) } // GetProposer mocks base method. diff --git a/core/rewards/reward_distribution.go b/core/rewards/reward_distribution.go index 0a0ac9e635..e500bbd80b 100644 --- a/core/rewards/reward_distribution.go +++ b/core/rewards/reward_distribution.go @@ -16,6 +16,7 @@ package rewards import ( + "math" "sort" "code.vegaprotocol.io/vega/core/types" @@ -23,6 +24,34 @@ import ( "code.vegaprotocol.io/vega/protos/vega" ) +func adjustScoreForNegative(partyScores []*types.PartyContributionScore) []*types.PartyContributionScore { + if len(partyScores) == 0 { + return partyScores + } + minScore := num.DecimalFromInt64(math.MaxInt64) + adjustedPartyScores := make([]*types.PartyContributionScore, 0, len(partyScores)) + for _, ps := range partyScores { + if ps.Score.LessThan(minScore) { + minScore = ps.Score + } + } + + if !minScore.IsNegative() { + return partyScores + } + + minScore = minScore.Neg() + + for _, ps := range partyScores { + adjustedScore := ps.Score.Add(minScore) + if !adjustedScore.IsZero() { + adjustedPartyScores = append(adjustedPartyScores, &types.PartyContributionScore{Party: ps.Party, Score: adjustedScore}) + } + } + + return adjustedPartyScores +} + func findRank(rankingTable []*vega.Rank, ind int) uint32 { var lastSeen *vega.Rank for _, rank := range rankingTable { @@ -41,17 +70,19 @@ func findRank(rankingTable []*vega.Rank, ind int) uint32 { func rankingRewardCalculator(partyMetric []*types.PartyContributionScore, rankingTable []*vega.Rank, partyRewardFactor map[string]num.Decimal) []*types.PartyContributionScore { partyScores := []*types.PartyContributionScore{} - sort.Slice(partyMetric, func(i, j int) bool { - return partyMetric[i].Score.GreaterThan(partyMetric[j].Score) + adjustedPartyScores := adjustScoreForNegative(partyMetric) + + sort.Slice(adjustedPartyScores, func(i, j int) bool { + return adjustedPartyScores[i].Score.GreaterThan(adjustedPartyScores[j].Score) }) shareRatio := num.DecimalZero() totalScores := num.DecimalZero() - for i, ps := range partyMetric { + for i, ps := range adjustedPartyScores { rewardFactor, ok := partyRewardFactor[ps.Party] if !ok { rewardFactor = num.DecimalOne() } - if i == 0 || !ps.Score.Equal(partyMetric[i-1].Score) { + if i == 0 || !ps.Score.Equal(adjustedPartyScores[i-1].Score) { shareRatio = num.DecimalFromInt64(int64(findRank(rankingTable, i+1))) } score := shareRatio.Mul(rewardFactor) @@ -74,8 +105,9 @@ func rankingRewardCalculator(partyMetric []*types.PartyContributionScore, rankin func proRataRewardCalculator(partyContribution []*types.PartyContributionScore, partyRewardFactor map[string]num.Decimal) []*types.PartyContributionScore { total := num.DecimalZero() + adjustedPartyScores := adjustScoreForNegative(partyContribution) partiesWithScore := []*types.PartyContributionScore{} - for _, metric := range partyContribution { + for _, metric := range adjustedPartyScores { factor, ok := partyRewardFactor[metric.Party] if !ok { factor = num.DecimalOne() diff --git a/core/rewards/reward_distribution_test.go b/core/rewards/reward_distribution_test.go index 25fecdf743..d23f5ba58d 100644 --- a/core/rewards/reward_distribution_test.go +++ b/core/rewards/reward_distribution_test.go @@ -25,6 +25,69 @@ import ( "github.com/stretchr/testify/require" ) +func TestAdjustForNegatives(t *testing.T) { + adjustedNoNegatives := adjustScoreForNegative([]*types.PartyContributionScore{ + {Party: "p1", Score: num.DecimalFromFloat(1)}, + {Party: "p2", Score: num.DecimalFromFloat(2)}, + {Party: "p3", Score: num.DecimalFromFloat(3)}, + {Party: "p4", Score: num.DecimalFromFloat(4)}, + }) + require.Equal(t, 4, len(adjustedNoNegatives)) + require.Equal(t, "1", adjustedNoNegatives[0].Score.String()) + require.Equal(t, "2", adjustedNoNegatives[1].Score.String()) + require.Equal(t, "3", adjustedNoNegatives[2].Score.String()) + require.Equal(t, "4", adjustedNoNegatives[3].Score.String()) + + adjustedMinEqMax := adjustScoreForNegative([]*types.PartyContributionScore{ + {Party: "p1", Score: num.DecimalFromFloat(4)}, + {Party: "p2", Score: num.DecimalFromFloat(4)}, + {Party: "p3", Score: num.DecimalFromFloat(4)}, + {Party: "p4", Score: num.DecimalFromFloat(4)}, + }) + require.Equal(t, 4, len(adjustedMinEqMax)) + require.Equal(t, "4", adjustedMinEqMax[0].Score.String()) + require.Equal(t, "4", adjustedMinEqMax[1].Score.String()) + require.Equal(t, "4", adjustedMinEqMax[2].Score.String()) + require.Equal(t, "4", adjustedMinEqMax[3].Score.String()) + + adjustedAllNeg := adjustScoreForNegative([]*types.PartyContributionScore{ + {Party: "p1", Score: num.DecimalFromFloat(-4)}, + {Party: "p2", Score: num.DecimalFromFloat(-3)}, + {Party: "p3", Score: num.DecimalFromFloat(-2)}, + {Party: "p4", Score: num.DecimalFromFloat(-1)}, + }) + require.Equal(t, 3, len(adjustedAllNeg)) + require.Equal(t, "1", adjustedAllNeg[0].Score.String()) + require.Equal(t, "2", adjustedAllNeg[1].Score.String()) + require.Equal(t, "3", adjustedAllNeg[2].Score.String()) + + adjustedSomeNeg := adjustScoreForNegative([]*types.PartyContributionScore{ + {Party: "p1", Score: num.DecimalFromFloat(1)}, + {Party: "p2", Score: num.DecimalFromFloat(-1)}, + {Party: "p3", Score: num.DecimalFromFloat(2)}, + {Party: "p4", Score: num.DecimalFromFloat(-2)}, + {Party: "p5", Score: num.DecimalFromFloat(3)}, + {Party: "p6", Score: num.DecimalFromFloat(-3)}, + {Party: "p7", Score: num.DecimalFromFloat(4)}, + {Party: "p8", Score: num.DecimalFromFloat(-4)}, + }) + require.Equal(t, 7, len(adjustedSomeNeg)) + require.Equal(t, "5", adjustedSomeNeg[0].Score.String()) + require.Equal(t, "p1", adjustedSomeNeg[0].Party) + require.Equal(t, "3", adjustedSomeNeg[1].Score.String()) + require.Equal(t, "p2", adjustedSomeNeg[1].Party) + require.Equal(t, "6", adjustedSomeNeg[2].Score.String()) + require.Equal(t, "p3", adjustedSomeNeg[2].Party) + require.Equal(t, "2", adjustedSomeNeg[3].Score.String()) + require.Equal(t, "p4", adjustedSomeNeg[3].Party) + require.Equal(t, "7", adjustedSomeNeg[4].Score.String()) + require.Equal(t, "p5", adjustedSomeNeg[4].Party) + require.Equal(t, "1", adjustedSomeNeg[5].Score.String()) + require.Equal(t, "p6", adjustedSomeNeg[5].Party) + require.Equal(t, "8", adjustedSomeNeg[6].Score.String()) + require.Equal(t, "p7", adjustedSomeNeg[6].Party) +} + func TestFindRank(t *testing.T) { rankingTable := []*vega.Rank{ {StartRank: 1, ShareRatio: 10}, diff --git a/core/risk/engine.go b/core/risk/engine.go index d4b62b4baf..ac0bdba553 100644 --- a/core/risk/engine.go +++ b/core/risk/engine.go @@ -248,7 +248,7 @@ func (e *Engine) GetRiskFactors() *types.RiskFactor { return e.factors } -func (e *Engine) UpdateMarginAuction(ctx context.Context, evts []events.Margin, price *num.Uint, increment num.Decimal) ([]events.Risk, []events.Margin) { +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 } @@ -260,7 +260,7 @@ func (e *Engine) UpdateMarginAuction(ctx context.Context, evts []events.Margin, rFactors := *e.factors nowTS := e.timeSvc.GetTimeNow().UnixNano() for _, evt := range evts { - levels := e.calculateMargins(evt, price, rFactors, true, true, increment) + levels := e.calculateMargins(evt, price, rFactors, true, true, increment, auctionPrice) if levels == nil { continue } @@ -307,12 +307,12 @@ func (e *Engine) UpdateMarginAuction(ctx context.Context, evts []events.Margin, // UpdateMarginOnNewOrder calculate the new margin requirement for a single order // this is intended to be used when a new order is created in order to ensure the // party margin account is at least at the InitialMargin level before the order is added to the book. -func (e *Engine) UpdateMarginOnNewOrder(ctx context.Context, evt events.Margin, markPrice *num.Uint, increment num.Decimal) (events.Risk, events.Margin, error) { +func (e *Engine) UpdateMarginOnNewOrder(ctx context.Context, evt events.Margin, markPrice *num.Uint, increment num.Decimal, auctionPrice *num.Uint) (events.Risk, events.Margin, error) { if evt == nil { return nil, nil, nil } auction := e.as.InAuction() && !e.as.CanLeave() - margins := e.calculateMargins(evt, markPrice, *e.factors, true, auction, increment) + margins := e.calculateMargins(evt, markPrice, *e.factors, true, auction, increment, auctionPrice) // no margins updates, nothing to do then if margins == nil { @@ -387,7 +387,7 @@ func (e *Engine) UpdateMarginOnNewOrder(ctx context.Context, evt events.Margin, // In the case where the CurMargin is smaller to the MaintenanceLevel after trying to // move monies later, we'll need to close out the party but that cannot be figured out // now only in later when we try to move monies from the general account. -func (e *Engine) UpdateMarginsOnSettlement(ctx context.Context, evts []events.Margin, markPrice *num.Uint, increment num.Decimal) []events.Risk { +func (e *Engine) UpdateMarginsOnSettlement(ctx context.Context, evts []events.Margin, markPrice *num.Uint, increment num.Decimal, auctionPrice *num.Uint) []events.Risk { ret := make([]events.Risk, 0, len(evts)) now := e.timeSvc.GetTimeNow().UnixNano() @@ -431,7 +431,7 @@ func (e *Engine) UpdateMarginsOnSettlement(ctx context.Context, evts []events.Ma } // channel is closed, and we've got a nil interface auction := e.as.InAuction() && !e.as.CanLeave() - margins := e.calculateMargins(evt, markPrice, *e.factors, true, auction, increment) + margins := e.calculateMargins(evt, markPrice, *e.factors, true, auction, increment, auctionPrice) // no margins updates, nothing to do then if margins == nil { @@ -514,12 +514,12 @@ func (e *Engine) UpdateMarginsOnSettlement(ctx context.Context, evts []events.Ma // ExpectMargins is used in the case some parties are in a distressed positions // in this situation we will only check if the party margin is > to the maintenance margin. -func (e *Engine) ExpectMargins(evts []events.Margin, markPrice *num.Uint, increment num.Decimal) (okMargins []events.Margin, distressedPositions []events.Margin) { +func (e *Engine) ExpectMargins(evts []events.Margin, markPrice *num.Uint, increment num.Decimal, auctionPrice *num.Uint) (okMargins []events.Margin, distressedPositions []events.Margin) { okMargins = make([]events.Margin, 0, len(evts)/2) distressedPositions = make([]events.Margin, 0, len(evts)/2) auction := e.as.InAuction() && !e.as.CanLeave() for _, evt := range evts { - margins := e.calculateMargins(evt, markPrice, *e.factors, false, auction, increment) + margins := e.calculateMargins(evt, markPrice, *e.factors, false, auction, increment, auctionPrice) // no margins updates, nothing to do then if margins == nil { okMargins = append(okMargins, evt) diff --git a/core/risk/engine_test.go b/core/risk/engine_test.go index 852f084133..f178e988b3 100644 --- a/core/risk/engine_test.go +++ b/core/risk/engine_test.go @@ -130,7 +130,7 @@ func testMarginLevelsTS(t *testing.T) { }) evts := []events.Margin{evt} - resp := eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, num.DecimalZero()) + resp := eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, num.DecimalZero(), nil) assert.Equal(t, 1, len(resp)) // ensure we get the correct transfer request back, correct amount etc... trans := resp[0].Transfer() @@ -169,7 +169,7 @@ func TestNegativeMargin(t *testing.T) { // increment is negative inc := num.DecimalFromFloat(-10) - riskEvts := eng.UpdateMarginsOnSettlement(ctx, []events.Margin{evt}, mtmPrice, inc) + riskEvts := eng.UpdateMarginsOnSettlement(ctx, []events.Margin{evt}, mtmPrice, inc, nil) require.NotEmpty(t, riskEvts) initial := riskEvts[0].Transfer().Amount.Amount require.Equal(t, "5", initial.String()) @@ -193,7 +193,7 @@ func testMarginTopup(t *testing.T) { eng.broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() eng.as.EXPECT().InAuction().AnyTimes().Return(false) evts := []events.Margin{evt} - resp := eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, num.DecimalZero()) + resp := eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, num.DecimalZero(), nil) assert.Equal(t, 1, len(resp)) // ensure we get the correct transfer request back, correct amount etc... trans := resp[0].Transfer() @@ -225,7 +225,7 @@ func TestMarginTopupPerpetual(t *testing.T) { eng.broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() eng.as.EXPECT().InAuction().AnyTimes().Return(false) evts := []events.Margin{evt} - resp := eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, inc) + resp := eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, inc, nil) assert.Equal(t, 1, len(resp)) mm := resp[0].MarginLevels().MaintenanceMargin @@ -233,7 +233,7 @@ func TestMarginTopupPerpetual(t *testing.T) { // now do it again with the funding payment negated, the margin should be as if we were not a perp // and 5 less - resp = eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, inc.Neg()) + resp = eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, inc.Neg(), nil) assert.Equal(t, 1, len(resp)) mm = resp[0].MarginLevels().MaintenanceMargin @@ -259,7 +259,7 @@ func testMarginNotReleasedInAuction(t *testing.T) { eng.as.EXPECT().InAuction().AnyTimes().Return(true) eng.as.EXPECT().CanLeave().AnyTimes().Return(false) evts := []events.Margin{evt} - resp := eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, num.DecimalZero()) + resp := eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, num.DecimalZero(), nil) assert.Equal(t, 0, len(resp)) } @@ -279,7 +279,7 @@ func testMarginTopupOnOrderFailInsufficientFunds(t *testing.T) { } eng.tsvc.EXPECT().GetTimeNow().Times(1) eng.as.EXPECT().InAuction().AnyTimes().Return(false) - riskevt, _, err := eng.UpdateMarginOnNewOrder(context.Background(), evt, markPrice, num.DecimalZero()) + riskevt, _, err := eng.UpdateMarginOnNewOrder(context.Background(), evt, markPrice, num.DecimalZero(), nil) assert.Nil(t, riskevt) assert.NotNil(t, err) assert.Error(t, err, risk.ErrInsufficientFundsForInitialMargin.Error()) @@ -304,7 +304,7 @@ func testMarginNoop(t *testing.T) { eng.as.EXPECT().InAuction().AnyTimes().Return(false) evts := []events.Margin{evt} - resp := eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, num.DecimalZero()) + resp := eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, num.DecimalZero(), nil) assert.Equal(t, 1, len(resp)) } @@ -326,7 +326,7 @@ func testMarginOverflow(t *testing.T) { eng.tsvc.EXPECT().GetTimeNow().Times(1) eng.as.EXPECT().InAuction().Times(2).Return(false) evts := []events.Margin{evt} - resp := eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, num.DecimalZero()) + resp := eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, num.DecimalZero(), nil) assert.Equal(t, 1, len(resp)) // ensure we get the correct transfer request back, correct amount etc... @@ -357,7 +357,7 @@ func testMarginOverflowAuctionEnd(t *testing.T) { eng.as.EXPECT().CanLeave().Times(2).Return(true) // eng.as.EXPECT().InAuction().AnyTimes().Return(false) evts := []events.Margin{evt} - resp := eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, num.DecimalZero()) + resp := eng.UpdateMarginsOnSettlement(ctx, evts, markPrice, num.DecimalZero(), markPrice) assert.Equal(t, 1, len(resp)) // ensure we get the correct transfer request back, correct amount etc... @@ -410,6 +410,7 @@ func TestMarginWithNoOrdersOnBook(t *testing.T) { margin_funding_factor float64 funding_payment_to_date float64 auction bool + auctionPrice num.Decimal }{ { expectedMargin: "87", @@ -587,6 +588,29 @@ func TestMarginWithNoOrdersOnBook(t *testing.T) { funding_payment_to_date: 10, auction: false, }, + { + expectedMargin: "1754", + positionSize: 1, + buyOrders: []*risk.OrderInfo{ + { + TrueRemaining: 100, + Price: num.DecimalFromInt64(1), + IsMarketOrder: false, + }, + { + TrueRemaining: 20, + Price: num.DecimalFromInt64(2), + IsMarketOrder: false, + }, + }, + sellOrders: []*risk.OrderInfo{}, + linearSlippageFactor: num.DecimalFromFloat(0.01), + quadraticSlippageFactor: num.DecimalZero(), + margin_funding_factor: 1, + funding_payment_to_date: 10, + auction: false, + auctionPrice: num.DecimalFromInt64(123), + }, } for _, tc := range testCases { @@ -623,13 +647,16 @@ func TestMarginWithNoOrdersOnBook(t *testing.T) { as.EXPECT().CanLeave().AnyTimes().Return(!tc.auction).AnyTimes() testE := risk.NewEngine(log, conf.Execution.Risk, mc, model, book, as, ts, broker, marketID, "ETH", statevar, num.DecimalFromInt64(1), false, nil, tc.linearSlippageFactor, tc.quadraticSlippageFactor) - riskevt, _, err := testE.UpdateMarginOnNewOrder(context.Background(), evt, num.UintFromUint64(uint64(markPrice)), constantPerUnitPositionSize) - require.NotNil(t, riskevt) + apUint, overflow := num.UintFromDecimal(tc.auctionPrice) + require.False(t, overflow) + + riskevt, _, err := testE.UpdateMarginOnNewOrder(context.Background(), evt, num.UintFromUint64(uint64(markPrice)), constantPerUnitPositionSize, apUint) require.NoError(t, err) + require.NotNil(t, riskevt) margins := riskevt.MarginLevels() require.Equal(t, tc.expectedMargin, margins.MaintenanceMargin.String()) - marginRecalcualted := risk.CalculateMaintenanceMarginWithSlippageFactors(evt.size, tc.buyOrders, tc.sellOrders, num.DecimalFromInt64(markPrice), num.DecimalOne(), tc.linearSlippageFactor, tc.quadraticSlippageFactor, r.Long, r.Short, constantPerUnitPositionSize, tc.auction) + marginRecalcualted := risk.CalculateMaintenanceMarginWithSlippageFactors(evt.size, tc.buyOrders, tc.sellOrders, num.DecimalFromInt64(markPrice), num.DecimalOne(), tc.linearSlippageFactor, tc.quadraticSlippageFactor, r.Long, r.Short, constantPerUnitPositionSize, tc.auction, tc.auctionPrice) require.Equal(t, margins.MaintenanceMargin.Float64(), marginRecalcualted.RoundUp(0).InexactFloat64()) } } @@ -721,7 +748,7 @@ func testMarginWithOrderInBook(t *testing.T) { market: "ETH/DEC19", } // insufficient orders on the book - riskevt, _, err := testE.UpdateMarginOnNewOrder(context.Background(), evt, markPrice.Clone(), num.DecimalZero()) + riskevt, _, err := testE.UpdateMarginOnNewOrder(context.Background(), evt, markPrice.Clone(), num.DecimalZero(), nil) assert.NotNil(t, riskevt) if riskevt == nil { t.Fatal("expecting non nil risk update") @@ -829,7 +856,7 @@ func testMarginWithOrderInBook2(t *testing.T) { previousMarkPrice := num.NewUint(103) - riskevt, _, err := testE.UpdateMarginOnNewOrder(context.Background(), evt, previousMarkPrice, num.DecimalZero()) + riskevt, _, err := testE.UpdateMarginOnNewOrder(context.Background(), evt, previousMarkPrice, num.DecimalZero(), nil) assert.NotNil(t, riskevt) if riskevt == nil { t.Fatal("expecting non nil risk update") @@ -934,7 +961,7 @@ func testMarginWithOrderInBookAfterParamsUpdate(t *testing.T) { general: 100000, market: marketID, } - riskevt, _, err := testE.UpdateMarginOnNewOrder(context.Background(), evt, markPrice.Clone(), num.DecimalZero()) + riskevt, _, err := testE.UpdateMarginOnNewOrder(context.Background(), evt, markPrice.Clone(), num.DecimalZero(), nil) require.NotNil(t, riskevt) require.Nil(t, err) @@ -976,7 +1003,7 @@ func testMarginWithOrderInBookAfterParamsUpdate(t *testing.T) { general: 100000, market: marketID, } - riskevt, _, err = testE.UpdateMarginOnNewOrder(context.Background(), evt, markPrice.Clone(), num.DecimalZero()) + riskevt, _, err = testE.UpdateMarginOnNewOrder(context.Background(), evt, markPrice.Clone(), num.DecimalZero(), nil) require.NotNil(t, riskevt) require.Nil(t, err) @@ -1010,12 +1037,12 @@ func testInitialMarginRequirement(t *testing.T) { eng.tsvc.EXPECT().GetTimeNow().Times(6) eng.as.EXPECT().InAuction().Times(2).Return(false) eng.broker.EXPECT().SendBatch(gomock.Any()).Times(3) - riskevt, _, err := eng.UpdateMarginOnNewOrder(context.Background(), evt, markPrice, num.DecimalZero()) + riskevt, _, err := eng.UpdateMarginOnNewOrder(context.Background(), evt, markPrice, num.DecimalZero(), nil) assert.Error(t, err, risk.ErrInsufficientFundsForInitialMargin.Error()) assert.Nil(t, riskevt) evt.general = initialMargin - riskevt, _, err = eng.UpdateMarginOnNewOrder(context.Background(), evt, markPrice, num.DecimalZero()) + riskevt, _, err = eng.UpdateMarginOnNewOrder(context.Background(), evt, markPrice, num.DecimalZero(), nil) assert.NoError(t, err) assert.NotNil(t, riskevt) assert.True(t, riskevt.MarginLevels().InitialMargin.EQ(num.NewUint(initialMargin))) @@ -1030,12 +1057,12 @@ func testInitialMarginRequirement(t *testing.T) { initialMarginAuction := math.Ceil(initialMarginScalingFactor * (size*slippageFactor + size*size*slippageFactor + size*rf.Short.InexactFloat64()) * markPrice.ToDecimal().InexactFloat64()) evt.general = uint64(initialMarginAuction) - 1 - riskevt, _, err = eng.UpdateMarginOnNewOrder(context.Background(), evt, markPrice, num.DecimalZero()) + riskevt, _, err = eng.UpdateMarginOnNewOrder(context.Background(), evt, markPrice, num.DecimalZero(), nil) assert.Error(t, err, risk.ErrInsufficientFundsForInitialMargin.Error()) assert.Nil(t, riskevt) evt.general = uint64(initialMarginAuction) - riskevt, _, err = eng.UpdateMarginOnNewOrder(context.Background(), evt, markPrice, num.DecimalZero()) + riskevt, _, err = eng.UpdateMarginOnNewOrder(context.Background(), evt, markPrice, num.DecimalZero(), nil) assert.NoError(t, err) assert.NotNil(t, riskevt) assert.True(t, riskevt.MarginLevels().InitialMargin.EQ(num.NewUint(uint64(initialMarginAuction)))) @@ -1047,12 +1074,12 @@ func testInitialMarginRequirement(t *testing.T) { initialMarginAuction = math.Ceil(initialMarginAuction + initialMarginScalingFactor*ordersBit) evt.general = uint64(initialMarginAuction) - 1 - riskevt, _, err = eng.UpdateMarginOnNewOrder(context.Background(), evt, markPrice, num.DecimalZero()) + riskevt, _, err = eng.UpdateMarginOnNewOrder(context.Background(), evt, markPrice, num.DecimalZero(), nil) assert.Error(t, err, risk.ErrInsufficientFundsForInitialMargin.Error()) assert.Nil(t, riskevt) evt.general = uint64(math.Ceil(initialMarginAuction)) - riskevt, _, err = eng.UpdateMarginOnNewOrder(context.Background(), evt, markPrice, num.DecimalZero()) + riskevt, _, err = eng.UpdateMarginOnNewOrder(context.Background(), evt, markPrice, num.DecimalZero(), nil) assert.NoError(t, err) assert.NotNil(t, riskevt) assert.True(t, riskevt.MarginLevels().InitialMargin.EQ(num.NewUint(uint64(initialMarginAuction)))) @@ -1300,7 +1327,7 @@ func TestMaintenanceMarign(t *testing.T) { } expectedMargin := num.MaxD(expectedMarginShort, expectedMarginLong).Add(num.MaxD(num.DecimalZero(), openVolume.Mul(constantPerUnitPositionSize))) - actualMargin := risk.CalculateMaintenanceMarginWithSlippageFactors(tc.positionSize, tc.buyOrders, tc.sellOrders, markPrice, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, constantPerUnitPositionSize, tc.auction) + actualMargin := risk.CalculateMaintenanceMarginWithSlippageFactors(tc.positionSize, tc.buyOrders, tc.sellOrders, markPrice, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, constantPerUnitPositionSize, tc.auction, num.DecimalZero()) require.True(t, expectedMargin.Div(actualMargin).Sub(num.DecimalOne()).Abs().LessThan(relativeTolerance), fmt.Sprintf("Test case %v: expectedMargin=%s, actualMargin:=%s", i+1, expectedMargin, actualMargin)) } @@ -1430,7 +1457,7 @@ func TestLiquidationPriceWithNoOrders(t *testing.T) { riskFactorLong := num.DecimalFromFloat(tc.riskFactorLong) riskFactorShort := num.DecimalFromFloat(tc.riskFactorShort) constantPerUnitPositionSize := num.DecimalFromFloat(tc.margin_funding_factor * tc.funding_payment_to_date) - maintenanceMargin := risk.CalculateMaintenanceMarginWithSlippageFactors(tc.positionSize, nil, nil, markPrice, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, constantPerUnitPositionSize, false) + maintenanceMargin := risk.CalculateMaintenanceMarginWithSlippageFactors(tc.positionSize, nil, nil, markPrice, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, constantPerUnitPositionSize, false, num.DecimalZero()) maintenanceMarginFp := maintenanceMargin.InexactFloat64() require.Greater(t, maintenanceMarginFp, 0.0) @@ -1456,7 +1483,7 @@ func TestLiquidationPriceWithNoOrders(t *testing.T) { liquidationPriceFp = liquidationPrice.InexactFloat64() require.GreaterOrEqual(t, liquidationPriceFp, 0.0) - marginAtLiquidationPrice := risk.CalculateMaintenanceMarginWithSlippageFactors(tc.positionSize, nil, nil, liquidationPrice, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, constantPerUnitPositionSize, false) + marginAtLiquidationPrice := risk.CalculateMaintenanceMarginWithSlippageFactors(tc.positionSize, nil, nil, liquidationPrice, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, constantPerUnitPositionSize, false, num.DecimalZero()) openVolume := num.DecimalFromInt64(tc.positionSize).Div(positionFactor) mtmLoss := liquidationPrice.Sub(markPrice).Mul(openVolume) collateralAfterLoss := collateral.Add(mtmLoss) @@ -1801,7 +1828,7 @@ func TestLiquidationPriceWithOrders(t *testing.T) { require.True(t, withBuy.LessThan(positionOnly), fmt.Sprintf("Test case %v:", i+1)) } - marginAtLiquidationPrice := risk.CalculateMaintenanceMarginWithSlippageFactors(newPositionSize, nil, nil, liquidationPriceForNewPosition, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, num.DecimalZero(), false) + marginAtLiquidationPrice := risk.CalculateMaintenanceMarginWithSlippageFactors(newPositionSize, nil, nil, liquidationPriceForNewPosition, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, num.DecimalZero(), false, num.DecimalZero()) openVolume := num.DecimalFromInt64(newPositionSize).Div(positionFactor) mtmLoss := liquidationPriceForNewPosition.Sub(lastMarkPrice).Mul(openVolume) fundingLoss := num.MaxD(num.DecimalZero(), openVolume.Mul(constantPerUnitPositionSize)).Mul(num.DecimalFromFloat(-1)) @@ -1834,7 +1861,7 @@ func TestLiquidationPriceWithOrders(t *testing.T) { } // recalculate without funding loss and compensate for it when getting the expectation - marginAtLiquidationPrice = risk.CalculateMaintenanceMarginWithSlippageFactors(newPositionSize, nil, nil, liquidationPriceForNewPosition, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, num.DecimalZero(), false) + marginAtLiquidationPrice = risk.CalculateMaintenanceMarginWithSlippageFactors(newPositionSize, nil, nil, liquidationPriceForNewPosition, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, num.DecimalZero(), false, num.DecimalZero()) openVolume = num.DecimalFromInt64(newPositionSize).Div(positionFactor) mtmLoss = liquidationPriceForNewPosition.Sub(lastMarkPrice).Mul(openVolume) fundingLoss = num.MaxD(num.DecimalZero(), openVolume.Mul(constantPerUnitPositionSize)).Mul(num.DecimalFromFloat(-1)) diff --git a/core/risk/isolated_margin.go b/core/risk/isolated_margin.go index 67a98bfb08..9a8664a111 100644 --- a/core/risk/isolated_margin.go +++ b/core/risk/isolated_margin.go @@ -33,8 +33,8 @@ import ( func (e *Engine) calculateIsolatedMargins(m events.Margin, marketObservable *num.Uint, inc num.Decimal, marginFactor num.Decimal, auctionPrice *num.Uint, orders []*types.Order) *types.MarginLevels { auction := e.as.InAuction() && !e.as.CanLeave() // NB:we don't include orders when calculating margin for isolated margin as they are margined separately! - margins := e.calculateMargins(m, marketObservable, *e.factors, false, auction, inc) - margins.OrderMargin = calcOrderMargins(m.Size(), orders, e.positionFactor, marginFactor, auctionPrice) + margins := e.calculateMargins(m, marketObservable, *e.factors, false, auction, inc, auctionPrice) + margins.OrderMargin = CalcOrderMargins(m.Size(), orders, e.positionFactor, marginFactor, auctionPrice) margins.CollateralReleaseLevel = num.UintZero() margins.SearchLevel = num.UintZero() margins.MarginMode = types.MarginModeIsolatedMargin @@ -332,10 +332,10 @@ func (e *Engine) SwitchToIsolatedMargin(ctx context.Context, evt events.Margin, // 1. recalcualtion of the required margin in cross margin mode + margin levels are buffered // 2. return a transfer of all the balance from order margin account to margin account // NB: cannot fail. -func (e *Engine) SwitchFromIsolatedMargin(ctx context.Context, evt events.Margin, marketObservable *num.Uint, inc num.Decimal) events.Risk { +func (e *Engine) SwitchFromIsolatedMargin(ctx context.Context, evt events.Margin, marketObservable *num.Uint, inc num.Decimal, auctionPrice *num.Uint) events.Risk { amt := evt.OrderMarginBalance().Clone() auction := e.as.InAuction() && !e.as.CanLeave() - margins := e.calculateMargins(evt, marketObservable, *e.factors, true, auction, inc) + margins := e.calculateMargins(evt, marketObservable, *e.factors, true, auction, inc, auctionPrice) margins.Party = evt.Party() margins.Asset = evt.Asset() margins.MarketID = evt.MarketID() @@ -497,11 +497,11 @@ func getIsolatedMarginTransfersOnPositionChange(party, asset string, trades []*t } func (e *Engine) CalcOrderMarginsForClosedOutParty(orders []*types.Order, marginFactor num.Decimal) *num.Uint { - return calcOrderMargins(0, orders, e.positionFactor, marginFactor, nil) + return CalcOrderMargins(0, orders, e.positionFactor, marginFactor, nil) } -// calcOrderMargins calculates the the order margin required for the party given their current orders and margin factor. -func calcOrderMargins(positionSize int64, orders []*types.Order, positionFactor, marginFactor num.Decimal, auctionPrice *num.Uint) *num.Uint { +// CalcOrderMargins calculates the the order margin required for the party given their current orders and margin factor. +func CalcOrderMargins(positionSize int64, orders []*types.Order, positionFactor, marginFactor num.Decimal, auctionPrice *num.Uint) *num.Uint { if len(orders) == 0 { return num.UintZero() } diff --git a/core/risk/isolated_margin_ex_test.go b/core/risk/isolated_margin_ex_test.go index 9cb73f119e..e086945d23 100644 --- a/core/risk/isolated_margin_ex_test.go +++ b/core/risk/isolated_margin_ex_test.go @@ -43,7 +43,7 @@ func TestSwitchFromIsolatedMargin(t *testing.T) { e.as.EXPECT().InAuction().Return(false).AnyTimes() e.broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() e.tsvc.EXPECT().GetTimeNow().AnyTimes() - risk := e.SwitchFromIsolatedMargin(context.Background(), evt, num.NewUint(100), num.DecimalOne()) + risk := e.SwitchFromIsolatedMargin(context.Background(), evt, num.NewUint(100), num.DecimalOne(), nil) require.Equal(t, num.NewUint(20), risk.Transfer().Amount.Amount) require.Equal(t, num.NewUint(20), risk.Transfer().MinAmount) require.Equal(t, types.TransferTypeIsolatedMarginLow, risk.Transfer().Type) @@ -91,7 +91,7 @@ func TestSwithToIsolatedMarginContinuous(t *testing.T) { require.Equal(t, num.NewUint(0), riskEvent[0].MarginLevels().OrderMargin) buyOrderInfo, sellOrderInfo := extractOrderInfo(orders) - requiredPositionMarginStatic, requiredOrderMarginStatic := risk.CalculateRequiredMarginInIsolatedMode(evt.size, evt.AverageEntryPrice().ToDecimal(), evt.Price().ToDecimal(), buyOrderInfo, sellOrderInfo, positionFactor, marginFactor) + requiredPositionMarginStatic, requiredOrderMarginStatic := risk.CalculateRequiredMarginInIsolatedMode(evt.size, evt.AverageEntryPrice().ToDecimal(), evt.Price().ToDecimal(), buyOrderInfo, sellOrderInfo, positionFactor, marginFactor, nil) require.True(t, !requiredPositionMarginStatic.IsZero()) require.True(t, requiredOrderMarginStatic.IsZero()) transferRecalc := requiredPositionMarginStatic.Sub(evt.MarginBalance().ToDecimal()) @@ -119,7 +119,7 @@ func TestSwithToIsolatedMarginContinuous(t *testing.T) { require.Equal(t, num.NewUint(300), riskEvent[0].MarginLevels().OrderMargin) buyOrderInfo, sellOrderInfo = extractOrderInfo(orders) - requiredPositionMarginStatic, requiredOrderMarginStatic = risk.CalculateRequiredMarginInIsolatedMode(evt.size, evt.AverageEntryPrice().ToDecimal(), evt.Price().ToDecimal(), buyOrderInfo, sellOrderInfo, positionFactor, marginFactor) + requiredPositionMarginStatic, requiredOrderMarginStatic = risk.CalculateRequiredMarginInIsolatedMode(evt.size, evt.AverageEntryPrice().ToDecimal(), evt.Price().ToDecimal(), buyOrderInfo, sellOrderInfo, positionFactor, marginFactor, nil) require.True(t, !requiredPositionMarginStatic.IsZero()) require.True(t, !requiredOrderMarginStatic.IsZero()) transferRecalc = requiredPositionMarginStatic.Sub(evt.MarginBalance().ToDecimal()) @@ -147,7 +147,7 @@ func TestSwithToIsolatedMarginContinuous(t *testing.T) { require.Equal(t, num.NewUint(300), riskEvent[0].MarginLevels().OrderMargin) buyOrderInfo, sellOrderInfo = extractOrderInfo(orders) - requiredPositionMarginStatic, requiredOrderMarginStatic = risk.CalculateRequiredMarginInIsolatedMode(evt.size, evt.AverageEntryPrice().ToDecimal(), evt.Price().ToDecimal(), buyOrderInfo, sellOrderInfo, positionFactor, marginFactor) + requiredPositionMarginStatic, requiredOrderMarginStatic = risk.CalculateRequiredMarginInIsolatedMode(evt.size, evt.AverageEntryPrice().ToDecimal(), evt.Price().ToDecimal(), buyOrderInfo, sellOrderInfo, positionFactor, marginFactor, nil) require.True(t, !requiredPositionMarginStatic.IsZero()) require.True(t, !requiredOrderMarginStatic.IsZero()) transferRecalc = evt.MarginBalance().ToDecimal().Sub(requiredPositionMarginStatic) diff --git a/core/risk/isolated_margin_test.go b/core/risk/isolated_margin_test.go index 7f07bb6355..1992dd8232 100644 --- a/core/risk/isolated_margin_test.go +++ b/core/risk/isolated_margin_test.go @@ -262,7 +262,7 @@ func TestCalcOrderMarginContinous(t *testing.T) { // buy orderMargin = 0.5*(10 * 50 + 20 * 40 + 30 * 20)/10 = 95 // sell orderMargin = 0.5*(10 * 20 + 20 * 40 + 30 * 50)/10 = 125 // order margin = max(95,125) = 125 - orderSideMargin := calcOrderMargins(currentPos, orders, positionFactor, marginFactor, nil) + orderSideMargin := CalcOrderMargins(currentPos, orders, positionFactor, marginFactor, nil) require.Equal(t, num.NewUint(125), orderSideMargin) staticResult := CalcOrderMarginIsolatedMode(currentPos, buyOrderInfo, sellOrderInfo, positionFactor, marginFactor, num.DecimalZero()) require.Equal(t, staticResult.Round(0).String(), orderSideMargin.String()) @@ -271,7 +271,7 @@ func TestCalcOrderMarginContinous(t *testing.T) { // buy orderMargin = 0.5*(10 * 50 + 20 * 40 + 30 * 20)/10 = 95 // sell orderMargin = 0.5*(6 * 20 + 20 * 40 + 30 * 50)/10 = 121 currentPos = 4 - orderSideMargin = calcOrderMargins(currentPos, orders, positionFactor, marginFactor, nil) + orderSideMargin = CalcOrderMargins(currentPos, orders, positionFactor, marginFactor, nil) require.Equal(t, num.NewUint(121), orderSideMargin) staticResult = CalcOrderMarginIsolatedMode(currentPos, buyOrderInfo, sellOrderInfo, positionFactor, marginFactor, num.DecimalZero()) require.Equal(t, staticResult.Round(0).String(), orderSideMargin.String()) @@ -280,7 +280,7 @@ func TestCalcOrderMarginContinous(t *testing.T) { // buy orderMargin = 0.5*(10 * 50 + 20 * 40 + 30 * 20)/10 = 95 // sell orderMargin = 0.5*(0 * 20 + 5 * 40 + 30 * 50)/10 = 85 currentPos = 25 - orderSideMargin = calcOrderMargins(currentPos, orders, positionFactor, marginFactor, nil) + orderSideMargin = CalcOrderMargins(currentPos, orders, positionFactor, marginFactor, nil) require.Equal(t, num.NewUint(95), orderSideMargin) staticResult = CalcOrderMarginIsolatedMode(currentPos, buyOrderInfo, sellOrderInfo, positionFactor, marginFactor, num.DecimalZero()) require.Equal(t, staticResult.Round(0).String(), orderSideMargin.String()) @@ -289,7 +289,7 @@ func TestCalcOrderMarginContinous(t *testing.T) { // buy orderMargin = 0.5*(6 * 50 + 20 * 40 + 30 * 20)/10 = 85 // sell orderMargin = 0.5*(10 * 20 + 20 * 40 + 30 * 50)/10 = 125 currentPos = -4 - orderSideMargin = calcOrderMargins(currentPos, orders, positionFactor, marginFactor, nil) + orderSideMargin = CalcOrderMargins(currentPos, orders, positionFactor, marginFactor, nil) require.Equal(t, num.NewUint(125), orderSideMargin) staticResult = CalcOrderMarginIsolatedMode(currentPos, buyOrderInfo, sellOrderInfo, positionFactor, marginFactor, num.DecimalZero()) require.Equal(t, staticResult.Round(0).String(), orderSideMargin.String()) @@ -298,7 +298,7 @@ func TestCalcOrderMarginContinous(t *testing.T) { // buy orderMargin = 0.5*(0 * 50 + 10 * 40 + 30 * 20)/10 = 50 // sell orderMargin = 0.5*(10 * 20 + 20 * 40 + 30 * 50)/10 = 125 currentPos = -20 - orderSideMargin = calcOrderMargins(currentPos, orders, positionFactor, marginFactor, nil) + orderSideMargin = CalcOrderMargins(currentPos, orders, positionFactor, marginFactor, nil) require.Equal(t, num.NewUint(125), orderSideMargin) staticResult = CalcOrderMarginIsolatedMode(currentPos, buyOrderInfo, sellOrderInfo, positionFactor, marginFactor, num.DecimalZero()) require.Equal(t, staticResult.Round(0).String(), orderSideMargin.String()) diff --git a/core/risk/margins_calculation.go b/core/risk/margins_calculation.go index b9f23cabc6..23c9d8a1e7 100644 --- a/core/risk/margins_calculation.go +++ b/core/risk/margins_calculation.go @@ -61,7 +61,7 @@ func newMarginLevels(maintenance num.Decimal, scalingFactors *scalingFactorsUint // 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) *types.MarginLevels { +func (e *Engine) calculateMargins(m events.Margin, markPrice *num.Uint, rf types.RiskFactor, withPotentialBuyAndSell, auction bool, inc num.Decimal, auctionPrice *num.Uint) *types.MarginLevels { var ( marginMaintenanceLng num.Decimal marginMaintenanceSht num.Decimal @@ -99,7 +99,11 @@ func (e *Engine) calculateMargins(m events.Margin, markPrice *num.Uint, rf types if auction { marginMaintenanceLng = minV.Add(slippageVolume.Mul(mPriceDec.Mul(rf.Long))) if withPotentialBuyAndSell { - maintenanceMarginLongOpenOrders := m.BuySumProduct().ToDecimal().Div(e.positionFactor).Mul(rf.Long) + p := m.BuySumProduct() + if auctionPrice != nil { + p = num.Max(p, num.UintZero().Mul(num.UintFromUint64(uint64(m.Buy())), auctionPrice)) + } + maintenanceMarginLongOpenOrders := p.ToDecimal().Div(e.positionFactor).Mul(rf.Long) marginMaintenanceLng = marginMaintenanceLng.Add(maintenanceMarginLongOpenOrders) } } else { @@ -131,7 +135,11 @@ func (e *Engine) calculateMargins(m events.Margin, markPrice *num.Uint, rf types if auction { marginMaintenanceSht = minV.Add(absSlippageVolume.Mul(mPriceDec.Mul(rf.Short))) if withPotentialBuyAndSell { - maintenanceMarginShortOpenOrders := m.SellSumProduct().ToDecimal().Div(e.positionFactor).Mul(rf.Short) + p := m.SellSumProduct() + if auctionPrice != nil { + p = num.Max(p, num.UintZero().Mul(num.UintFromUint64(uint64(m.Sell())), auctionPrice)) + } + maintenanceMarginShortOpenOrders := p.ToDecimal().Div(e.positionFactor).Mul(rf.Short) marginMaintenanceSht = marginMaintenanceSht.Add(maintenanceMarginShortOpenOrders) } } else { @@ -180,7 +188,7 @@ func (e *Engine) calculateMargins(m events.Margin, markPrice *num.Uint, rf types } } -func CalculateMaintenanceMarginWithSlippageFactors(sizePosition int64, buyOrders, sellOrders []*OrderInfo, marketObservable, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, fundingPaymntPerUnitPosition num.Decimal, auction bool) num.Decimal { +func CalculateMaintenanceMarginWithSlippageFactors(sizePosition int64, buyOrders, sellOrders []*OrderInfo, marketObservable, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, fundingPaymntPerUnitPosition num.Decimal, auction bool, auctionPrice num.Decimal) num.Decimal { buySumProduct, sellSumProduct := num.DecimalZero(), num.DecimalZero() sizeSells, sizeBuys := int64(0), int64(0) for _, o := range buyOrders { @@ -203,14 +211,14 @@ func CalculateMaintenanceMarginWithSlippageFactors(sizePosition int64, buyOrders sizeSells += size } } - return computeMaintenanceMargin(sizePosition, sizeBuys, sizeSells, buySumProduct, sellSumProduct, marketObservable, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, fundingPaymntPerUnitPosition, auction) + return computeMaintenanceMargin(sizePosition, sizeBuys, sizeSells, buySumProduct, sellSumProduct, marketObservable, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, fundingPaymntPerUnitPosition, auction, auctionPrice) } func calculateSlippageFactor(slippageVolume, linearSlippageFactor, quadraticSlippageFactor num.Decimal) num.Decimal { return linearSlippageFactor.Mul(slippageVolume.Abs()).Add(quadraticSlippageFactor.Mul(slippageVolume.Mul(slippageVolume))) } -func computeMaintenanceMargin(sizePosition, buySize, sellSize int64, buySumProduct, sellSumProduct, marketObservable, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, fundingPaymntPerUnitPosition num.Decimal, auction bool) num.Decimal { +func computeMaintenanceMargin(sizePosition, buySize, sellSize int64, buySumProduct, sellSumProduct, marketObservable, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, fundingPaymntPerUnitPosition num.Decimal, auction bool, auctionPrice num.Decimal) num.Decimal { var ( marginMaintenanceLng num.Decimal marginMaintenanceSht num.Decimal @@ -230,7 +238,11 @@ func computeMaintenanceMargin(sizePosition, buySize, sellSize int64, buySumProdu slippageCap := marketObservable.Mul(calculateSlippageFactor(slippageVolume, linearSlippageFactor, quadraticSlippageFactor)) if auction { marginMaintenanceLng = slippageCap.Add(slippageVolume.Mul(marketObservable.Mul(riskFactorLong))) - maintenanceMarginLongOpenOrders := buySumProduct.Div(positionFactor).Mul(riskFactorLong) + p := buySumProduct + if !auctionPrice.IsZero() { + p = num.MaxD(p, auctionPrice.Mul(num.DecimalFromInt64(buySize))) + } + maintenanceMarginLongOpenOrders := p.Div(positionFactor).Mul(riskFactorLong) marginMaintenanceLng = marginMaintenanceLng.Add(maintenanceMarginLongOpenOrders) } else { marginMaintenanceLng = num.MaxD( @@ -251,7 +263,11 @@ func computeMaintenanceMargin(sizePosition, buySize, sellSize int64, buySumProdu slippageCap := marketObservable.Mul(calculateSlippageFactor(slippageVolume, linearSlippageFactor, quadraticSlippageFactor)) if auction { marginMaintenanceSht = slippageCap.Add(absSlippageVolume.Mul(marketObservable.Mul(riskFactorShort))) - maintenanceMarginShortOpenOrders := sellSumProduct.Div(positionFactor).Mul(riskFactorShort) + p := sellSumProduct + if !auctionPrice.IsZero() { + p = num.MaxD(p, auctionPrice.Mul(num.DecimalFromInt64(sellSize))) + } + maintenanceMarginShortOpenOrders := p.Div(positionFactor).Mul(riskFactorShort) marginMaintenanceSht = marginMaintenanceSht.Add(maintenanceMarginShortOpenOrders) } else { marginMaintenanceSht = num.MaxD( @@ -339,28 +355,44 @@ func calcOrderSideMarginIsolatedMode(currentPosition int64, orders []*OrderInfo, return margin.Mul(marginFactor).Div(positionFactor) } -func CalculateRequiredMarginInIsolatedMode(sizePosition int64, averageEntryPrice, marketObservable num.Decimal, buyOrders, sellOrders []*OrderInfo, positionFactor, marginFactor num.Decimal) (num.Decimal, num.Decimal) { - totalOrderNotional := num.DecimalZero() +func CalculateRequiredMarginInIsolatedMode(sizePosition int64, averageEntryPrice, marketObservable num.Decimal, buyOrders, sellOrders []*OrderInfo, positionFactor, marginFactor num.Decimal, auctionPrice *num.Uint) (num.Decimal, num.Decimal) { marketOrderAdjustedPositionNotional := averageEntryPrice.Copy().Mul(num.DecimalFromInt64(sizePosition)) + var orders []*types.Order = make([]*types.Order, 0, len(buyOrders)+len(sellOrders)) // assume market orders fill immediately at marketObservable price for _, o := range buyOrders { if o.IsMarketOrder { + sizePosition += int64(o.TrueRemaining) marketOrderAdjustedPositionNotional = marketOrderAdjustedPositionNotional.Add(marketObservable.Mul(num.DecimalFromInt64(int64(o.TrueRemaining)))) } else { - totalOrderNotional = totalOrderNotional.Add(o.Price.Mul(num.DecimalFromInt64(int64(o.TrueRemaining)))) + price, _ := num.UintFromDecimal(o.Price) + ord := &types.Order{ + Status: types.OrderStatusActive, + Remaining: o.TrueRemaining, + Price: price, + Side: types.SideBuy, + } + orders = append(orders, ord) } } for _, o := range sellOrders { if o.IsMarketOrder { + sizePosition -= int64(o.TrueRemaining) marketOrderAdjustedPositionNotional = marketOrderAdjustedPositionNotional.Sub(marketObservable.Mul(num.DecimalFromInt64(int64(o.TrueRemaining)))) } else { - totalOrderNotional = totalOrderNotional.Add(o.Price.Mul(num.DecimalFromInt64(int64(o.TrueRemaining)))) + price, _ := num.UintFromDecimal(o.Price) + ord := &types.Order{ + Status: types.OrderStatusActive, + Remaining: o.TrueRemaining, + Price: price, + Side: types.SideSell, + } + orders = append(orders, ord) } } requiredPositionMargin := marketOrderAdjustedPositionNotional.Abs().Mul(marginFactor).Div(positionFactor) - requiredOrderMargin := totalOrderNotional.Mul(marginFactor).Div(positionFactor) + requiredOrderMargin := CalcOrderMargins(sizePosition, orders, positionFactor, marginFactor, auctionPrice) - return requiredPositionMargin, requiredOrderMargin + return requiredPositionMargin, requiredOrderMargin.ToDecimal() } diff --git a/core/snapshot/engine.go b/core/snapshot/engine.go index 38aee93dd1..b9830595d2 100644 --- a/core/snapshot/engine.go +++ b/core/snapshot/engine.go @@ -16,9 +16,11 @@ package snapshot import ( + "bufio" "context" "errors" "fmt" + "os" "reflect" "sort" "sync" @@ -34,9 +36,12 @@ import ( "code.vegaprotocol.io/vega/libs/proto" "code.vegaprotocol.io/vega/logging" "code.vegaprotocol.io/vega/paths" + snapshotpb "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" "code.vegaprotocol.io/vega/version" tmtypes "github.com/cometbft/cometbft/abci/types" + "github.com/gogo/protobuf/jsonpb" + "github.com/libp2p/go-libp2p/p2p/host/autonat/pb" "go.uber.org/zap" "golang.org/x/exp/slices" ) @@ -44,7 +49,6 @@ import ( const ( namedLogger = "snapshot" numWorkers = 1000 - chanSize = numWorkers * 10 // This is a limitation by Tendermint. It must be strictly positive, and // non-zero. @@ -513,6 +517,52 @@ func (e *Engine) Snapshot(ctx context.Context) ([]byte, DoneCh, error) { return e.snapshotNow(ctx, true) } +// SnapshotDump takes a snapshot on demand, without persisting it to the underlying DB +// it's meant to just dump to a file for debugging. +func (e *Engine) SnapshotDump(ctx context.Context, path string) ([]byte, error) { + e.ensureEngineIsStarted() + // dump file + f, err := os.Create(path) + if err != nil { + return nil, err + } + defer func() { _ = f.Close() }() + hash, ch, err := e.snapshotNow(ctx, true) + if err != nil { + return nil, err + } + <-ch + payloads, err := e.snapshotTree.AsProtoPayloads() + if err != nil { + return hash, err + } + + w := bufio.NewWriter(f) + m := jsonpb.Marshaler{Indent: " "} + + payloadData := struct { + Data []*snapshotpb.Payload `json:"data,omitempty" protobuf:"bytes,1,rep,name=data"` + pb.Message + }{ + Data: payloads, + } + + s, err := m.MarshalToString(&payloadData) + if err != nil { + return hash, err + } + + if _, err = w.WriteString(s); err != nil { + return hash, err + } + + if err = w.Flush(); err != nil { + return hash, err + } + + return hash, nil +} + // SnapshotNow triggers the snapshot process right now, ignoring the defined // interval. func (e *Engine) SnapshotNow(ctx context.Context) ([]byte, error) { @@ -544,8 +594,11 @@ func (e *Engine) snapshotNow(ctx context.Context, saveAsync bool) ([]byte, DoneC treeKeysCounter := atomic.Int64{} treeKeysCounter.Store(int64(len(treeKeysToSnapshot))) - treeKeysToSnapshotChan := make(chan treeKeyToSnapshot, chanSize) - serializedStateChan := make(chan snapshotResult, chanSize) + // we push the tree keys into this channel so it can only have at most len(treeKeysToSnapshot) things in it + treeKeysToSnapshotChan := make(chan treeKeyToSnapshot, len(treeKeysToSnapshot)) + + // this is the channel where the workers send their result back to the main thread here, so one slot per worker is enough + serializedStateChan := make(chan snapshotResult, numWorkers) snapMetricsRecord := newSnapMetricsState() defer func() { @@ -563,9 +616,13 @@ func (e *Engine) snapshotNow(ctx context.Context, saveAsync bool) ([]byte, DoneC }() } - for _, treeKeyToSnapshot := range treeKeysToSnapshot { - treeKeysToSnapshotChan <- treeKeyToSnapshot - } + // the above loop sets the worker threads ready to read keys from treeKeysToSnapshotChan + // so we can push the keys in async while the loop below over serializedStateChan starts reading the results + go func() { + for _, treeKeyToSnapshot := range treeKeysToSnapshot { + treeKeysToSnapshotChan <- treeKeyToSnapshot + } + }() if len(treeKeysToSnapshot) == 0 { close(treeKeysToSnapshotChan) @@ -573,7 +630,7 @@ func (e *Engine) snapshotNow(ctx context.Context, saveAsync bool) ([]byte, DoneC } // analyse the results - results := make([]snapshotResult, 0, chanSize) + results := make([]snapshotResult, 0, len(treeKeysToSnapshot)) for res := range serializedStateChan { if res.err != nil { e.log.Panic("Failed to update snapshot namespace", @@ -925,7 +982,7 @@ func (e *Engine) addProviders(newProviders ...types.StateProvider) { duplicatedKeys := findDuplicatedKeys(existingKeys, newKeys) if len(duplicatedKeys) > 0 { // This is a programming error that might happen when adding a - // provider to the codebase, during an . + // provider to the codebase. e.log.Panic("A state provider in the same namespace is already using these keys", zap.String("namespace", namespace.String()), zap.Any("keys", duplicatedKeys), diff --git a/core/snapshot/providers.go b/core/snapshot/providers.go index ddacd77234..5ea1fac0e0 100644 --- a/core/snapshot/providers.go +++ b/core/snapshot/providers.go @@ -53,6 +53,8 @@ var providersInCallOrder = []types.SnapshotNamespace{ types.EventForwarderSnapshot, types.MarketActivityTrackerSnapshot, types.ERC20MultiSigTopologySnapshot, + types.EVMMultiSigTopologiesSnapshot, + types.EVMMultiSigTopologiesSnapshot, types.PoWSnapshot, types.ProtocolUpgradeSnapshot, types.TeamsSnapshot, diff --git a/core/snapshot/tree/tree.go b/core/snapshot/tree/tree.go index 697dba06ac..3c791b49fe 100644 --- a/core/snapshot/tree/tree.go +++ b/core/snapshot/tree/tree.go @@ -134,6 +134,47 @@ func (t *Tree) AsPayloads() ([]*types.Payload, error) { return payloads, nil } +func (t *Tree) AsProtoPayloads() ([]*snapshotpb.Payload, error) { + lastSnapshotTree, err := t.innerTree.GetImmutable(t.innerTree.Version()) + if err != nil { + return nil, fmt.Errorf("could not generate the immutable AVL tree: %w", err) + } + + exporter, err := lastSnapshotTree.Export() + if err != nil { + return nil, fmt.Errorf("could not export the AVL tree: %w", err) + } + defer exporter.Close() + + payloads := []*snapshotpb.Payload{} + + exportedNode, err := exporter.Next() + for err == nil { + // If there is no value, it means the node is an intermediary node and + // not a leaf. Only leaves hold the data we are looking for. + if exportedNode.Value == nil { + exportedNode, err = exporter.Next() + continue + } + + // sort out the payload for this node + payloadProto := &snapshotpb.Payload{} + if perr := proto.Unmarshal(exportedNode.Value, payloadProto); perr != nil { + return nil, perr + } + + payloads = append(payloads, payloadProto) + + exportedNode, err = exporter.Next() + } + + if !errors.Is(err, iavl.ErrorExportDone) { + return nil, fmt.Errorf("failed to export AVL tree: %w", err) + } + + return payloads, nil +} + func (t *Tree) FindImmutableTreeByHeight(blockHeight uint64) (*iavl.ImmutableTree, error) { version, err := t.metadataDB.FindVersionByBlockHeight(blockHeight) if err != nil { @@ -200,7 +241,7 @@ func (t *Tree) AddSnapshot(s *types.Snapshot) error { if n.IsLeaf { payload, ok := payloads[n.Key] if !ok { - return fmt.Errorf("the payloads for key %q is missing from the snapshot: %w", n.Key, err) + return fmt.Errorf("the payload for key %q is missing from the snapshot", n.Key) } value, err = proto.Marshal(payload.IntoProto()) if err != nil { diff --git a/core/spam/engine.go b/core/spam/engine.go index b6dc484696..bfea876bf3 100644 --- a/core/spam/engine.go +++ b/core/spam/engine.go @@ -96,7 +96,7 @@ func New(log *logging.Logger, config Config, epochEngine EpochEngine, accounting valJoinPolicy := NewSimpleSpamPolicy("validatorJoin", netparams.StakingAndDelegationRewardMinimumValidatorStake, "", log, accounting) delegationPolicy := NewSimpleSpamPolicy("delegation", netparams.SpamProtectionMinTokensForDelegation, netparams.SpamProtectionMaxDelegations, log, accounting) transferPolicy := NewSimpleSpamPolicy("transfer", "", netparams.TransferMaxCommandsPerEpoch, log, accounting) - issuesSignaturesPolicy := NewSimpleSpamPolicy("issueSignature", netparams.SpamProtectionMinMultisigUpdates, "", log, accounting) + issuesSignaturesPolicy := NewSimpleSpamPolicy("issueSignature", netparams.SpamProtectionMinMultisigUpdates, netparams.SpamProtectionMaxMultisigUpdates, log, accounting) createReferralSetPolicy := NewSimpleSpamPolicy("createReferralSet", netparams.ReferralProgramMinStakedVegaTokens, netparams.SpamProtectionMaxCreateReferralSet, log, accounting) updateReferralSetPolicy := NewSimpleSpamPolicy("updateReferralSet", netparams.ReferralProgramMinStakedVegaTokens, netparams.SpamProtectionMaxUpdateReferralSet, log, accounting) @@ -232,11 +232,16 @@ func (e *Engine) OnMinValidatorTokensChanged(_ context.Context, minTokens num.De } // OnMinTokensForProposalChanged is called when the net param for min tokens requirement for submitting a proposal has changed. -func (e *Engine) OnMinTokensForMultisigUpdatesChanged(ctx context.Context, minTokens num.Decimal) error { +func (e *Engine) OnMinTokensForMultisigUpdatesChanged(_ context.Context, minTokens num.Decimal) error { minTokensForMultisigUpdates, _ := num.UintFromDecimal(minTokens) return e.transactionTypeToPolicy[txn.IssueSignatures].UpdateUintParam(netparams.SpamProtectionMinMultisigUpdates, minTokensForMultisigUpdates) } +// OnMinTokensForProposalChanged is called when the net param for min tokens requirement for submitting a proposal has changed. +func (e *Engine) OnMaxMultisigUpdatesChanged(_ context.Context, maxUpdates int64) error { + return e.transactionTypeToPolicy[txn.IssueSignatures].UpdateIntParam(netparams.SpamProtectionMaxMultisigUpdates, maxUpdates) +} + // OnEpochEvent is a callback for epoch events. func (e *Engine) OnEpochEvent(ctx context.Context, epoch types.Epoch) { e.log.Info("Spam protection OnEpochEvent called", logging.Uint64("epoch", epoch.Seq)) diff --git a/core/staking/accounting.go b/core/staking/accounting.go index a3ca21da97..66fb92a7ad 100644 --- a/core/staking/accounting.go +++ b/core/staking/accounting.go @@ -68,6 +68,7 @@ type Accounting struct { stakingAssetTotalSupply *num.Uint stakingBridgeAddress ethcmn.Address + chainID string // snapshot bits accState accountingSnapshotState @@ -80,14 +81,17 @@ type Accounting struct { } type pendingStakeTotalSupply struct { - sts *types.StakeTotalSupply - check func() error + sts *types.StakeTotalSupply + chainID string + check func() error } func (p pendingStakeTotalSupply) GetID() string { return hex.EncodeToString(vgcrypto.Hash([]byte(p.sts.String()))) } +func (p pendingStakeTotalSupply) GetChainID() string { return p.chainID } + func (p pendingStakeTotalSupply) GetType() types.NodeVoteType { return types.NodeVoteTypeStakeTotalSupply } @@ -171,8 +175,9 @@ func (a *Accounting) GetAllAvailableBalances() map[string]*num.Uint { return balances } -func (a *Accounting) UpdateStakingBridgeAddress(stakingBridgeAddress ethcmn.Address) error { - a.stakingBridgeAddress = stakingBridgeAddress +func (a *Accounting) UpdateStakingBridgeAddress(ethCfg *types.EthereumConfig) error { + a.stakingBridgeAddress = ethCfg.StakingBridgeAddresses()[0] + a.chainID = ethCfg.ChainID() if !a.accState.isRestoring { if err := a.updateStakingAssetTotalSupply(); err != nil { @@ -195,7 +200,8 @@ func (a *Accounting) ProcessStakeTotalSupply(_ context.Context, evt *types.Stake expectedSupply := evt.TotalSupply.Clone() a.pendingStakeTotalSupply = &pendingStakeTotalSupply{ - sts: evt, + sts: evt, + chainID: a.chainID, check: func() error { totalSupply, err := a.getStakeAssetTotalSupply(a.stakingBridgeAddress) if err != nil { diff --git a/core/staking/accounting_snapshot.go b/core/staking/accounting_snapshot.go index da65cca09d..9763f694e4 100644 --- a/core/staking/accounting_snapshot.go +++ b/core/staking/accounting_snapshot.go @@ -172,7 +172,8 @@ func (a *Accounting) restoreStakingAccounts(ctx context.Context, accounts *types if pendingSupply != nil { expectedSupply := pendingSupply.TotalSupply.Clone() a.pendingStakeTotalSupply = &pendingStakeTotalSupply{ - sts: pendingSupply, + sts: pendingSupply, + chainID: a.chainID, check: func() error { totalSupply, err := a.getStakeAssetTotalSupply(a.stakingBridgeAddress) if err != nil { diff --git a/core/staking/stake_verifier.go b/core/staking/stake_verifier.go index 8a90474a1d..f0b89ff459 100644 --- a/core/staking/stake_verifier.go +++ b/core/staking/stake_verifier.go @@ -89,19 +89,23 @@ type StakeVerifier struct { type pendingSD struct { *types.StakeDeposited - check func() error + chainID string + check func() error } func (p pendingSD) GetID() string { return p.ID } +func (p pendingSD) GetChainID() string { return p.chainID } func (p pendingSD) GetType() types.NodeVoteType { return types.NodeVoteTypeStakeDeposited } func (p *pendingSD) Check(ctx context.Context) error { return p.check() } type pendingSR struct { *types.StakeRemoved - check func() error + chainID string + check func() error } func (p pendingSR) GetID() string { return p.ID } +func (p pendingSR) GetChainID() string { return p.chainID } func (p pendingSR) GetType() types.NodeVoteType { return types.NodeVoteTypeStakeRemoved } func (p *pendingSR) Check(ctx context.Context) error { return p.check() } @@ -166,6 +170,7 @@ func (s *StakeVerifier) ProcessStakeRemoved( pending := &pendingSR{ StakeRemoved: event, + chainID: s.accs.chainID, check: func() error { return s.ocv.CheckStakeRemoved(event) }, } s.pendingSRs = append(s.pendingSRs, pending) @@ -191,6 +196,7 @@ func (s *StakeVerifier) ProcessStakeDeposited( pending := &pendingSD{ StakeDeposited: event, + chainID: s.accs.chainID, check: func() error { return s.ocv.CheckStakeDeposited(event) }, } diff --git a/core/staking/stake_verifier_snapshot.go b/core/staking/stake_verifier_snapshot.go index 7db6290ff6..4a0ebd6c19 100644 --- a/core/staking/stake_verifier_snapshot.go +++ b/core/staking/stake_verifier_snapshot.go @@ -137,6 +137,7 @@ func (s *StakeVerifier) restorePendingSD(ctx context.Context, deposited []*types pending := &pendingSD{ StakeDeposited: d, + chainID: s.accs.chainID, check: func() error { return s.ocv.CheckStakeDeposited(d) }, } @@ -189,6 +190,7 @@ func (s *StakeVerifier) restorePendingSR(ctx context.Context, removed []*types.S pending := &pendingSR{ StakeRemoved: r, + chainID: s.accs.chainID, check: func() error { return s.ocv.CheckStakeRemoved(r) }, } diff --git a/core/staking/staking.go b/core/staking/staking.go index 56be126bb9..48239ecb3b 100644 --- a/core/staking/staking.go +++ b/core/staking/staking.go @@ -63,7 +63,7 @@ func New( stakeV := NewStakeVerifier(log, cfg, accs, witness, ts, broker, ocv, ethEventSource) _ = netp.Watch(netparams.WatchParam{ - Param: netparams.BlockchainsEthereumConfig, + Param: netparams.BlockchainsPrimaryEthereumConfig, Watcher: func(_ context.Context, cfg interface{}) error { ethCfg, err := types.EthereumConfigFromUntypedProto(cfg) if err != nil { @@ -73,7 +73,7 @@ func New( ocv.UpdateStakingBridgeAddresses(ethCfg.StakingBridgeAddresses()) // We just need one of the staking bridges. - if err := accs.UpdateStakingBridgeAddress(ethCfg.StakingBridgeAddresses()[0]); err != nil { + if err := accs.UpdateStakingBridgeAddress(ethCfg); err != nil { return fmt.Errorf("couldn't update Ethereum configuration in accounting: %w", err) } diff --git a/core/subscribers/market_depth.go b/core/subscribers/market_depth.go index 08641f466f..694649ff44 100644 --- a/core/subscribers/market_depth.go +++ b/core/subscribers/market_depth.go @@ -34,6 +34,12 @@ type OE interface { Order() *ptypes.Order } +type CO interface { + events.Event + OrderIDs() []string + MarketID() string +} + type priceLevel struct { // Price of the price level price *num.Uint @@ -114,17 +120,42 @@ func (mdb *MarketDepthBuilder) Push(evts ...events.Event) { case OE: order, _ := types.OrderFromProto(et.Order()) mdb.updateMarketDepth(order) + case CO: + for _, o := range mdb.applyOrderCancellations(et) { + mdb.updateMarketDepth(o) + } default: mdb.log.Panic("Unknown event type in market depth builder", logging.String("Type", et.Type().String())) } } } +func (mdb *MarketDepthBuilder) applyOrderCancellations(evt CO) []*types.Order { + mdb.mu.Lock() + defer mdb.mu.Unlock() + + mktOrders, ok := mdb.marketDepths[evt.MarketID()] + if !ok { + return nil + } + orders := []*types.Order{} + for _, oid := range evt.OrderIDs() { + if o := mktOrders.orderExists(oid); o != nil { + cpy := o.Clone() + cpy.Status = types.OrderStatusCancelled + orders = append(orders, cpy) + } + } + return orders +} + // Types returns all the message types this subscriber wants to receive. func (mdb *MarketDepthBuilder) Types() []events.Type { - return []events.Type{ + ret := []events.Type{ events.OrderEvent, + events.CancelledOrdersEvent, } + return ret } func (md *MarketDepth) orderExists(orderID string) *types.Order { diff --git a/core/teams/engine.go b/core/teams/engine.go index 53d4ee34d6..8df4a73a2f 100644 --- a/core/teams/engine.go +++ b/core/teams/engine.go @@ -229,11 +229,11 @@ func (e *Engine) GetTeamMembers(team string, minEpochsInTeam uint64) []string { } teamMembers := make([]string, 0, len(t.Referees)+1) for _, m := range t.Referees { - if m.StartedAtEpoch-e.currentEpoch >= minEpochsInTeam { + if e.currentEpoch-m.StartedAtEpoch >= minEpochsInTeam { teamMembers = append(teamMembers, string(m.PartyID)) } } - if t.Referrer.StartedAtEpoch-e.currentEpoch >= minEpochsInTeam { + if e.currentEpoch-t.Referrer.StartedAtEpoch >= minEpochsInTeam { teamMembers = append(teamMembers, string(t.Referrer.PartyID)) } sort.Strings(teamMembers) diff --git a/core/teams/engine_test.go b/core/teams/engine_test.go index 90f9aedf4b..675c766afa 100644 --- a/core/teams/engine_test.go +++ b/core/teams/engine_test.go @@ -23,6 +23,7 @@ import ( "code.vegaprotocol.io/vega/core/types" vgrand "code.vegaprotocol.io/vega/libs/rand" vgtest "code.vegaprotocol.io/vega/libs/test" + vegapb "code.vegaprotocol.io/vega/protos/vega" commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" "github.com/stretchr/testify/assert" @@ -33,6 +34,7 @@ func TestEngine(t *testing.T) { t.Run("Administrate a team succeeds", testAdministrateTeamSucceeds) t.Run("Joining team succeeds", testJoiningTeamSucceeds) t.Run("unique team names", testUniqueTeamNames) + t.Run("must be in a team for the minimum number of epochs", testMinEpochsRequired) } func testUniqueTeamNames(t *testing.T) { @@ -669,3 +671,40 @@ func testJoiningTeamSucceeds(t *testing.T) { }, }, te.engine.ListTeams()) } + +func testMinEpochsRequired(t *testing.T) { + ctx := vgtest.VegaContext(vgrand.RandomStr(5), vgtest.RandomI64()) + + te := newEngine(t) + + team1CreationDate := time.Now() + te.timeService.EXPECT().GetTimeNow().Return(team1CreationDate).Times(1) + teamID1, _, _ := newTeam(t, ctx, te) + + // if we set min epochs to 0 then we see the referrer + members := te.engine.GetTeamMembers(string(teamID1), 0) + assert.Len(t, members, 1) + + // referrer made a team, but does not get returned as a team member until its been the minimum epochs + members = te.engine.GetTeamMembers(string(teamID1), 5) + assert.Len(t, members, 0) + + // move to epoch 11 and add a team member + te.engine.OnEpoch(ctx, types.Epoch{Seq: 11, Action: vegapb.EpochAction_EPOCH_ACTION_START}) + + expectRefereeJoinedTeamEvent(t, te) + referee := newPartyID(t) + refereeJoiningDate := time.Now() + te.timeService.EXPECT().GetTimeNow().Return(refereeJoiningDate).Times(1) + require.NoError(t, te.engine.JoinTeam(ctx, referee, joinTeamCmd(t, teamID1))) + + // referrer joined at epoch 10, team member at 11 lets move to epoch 15 + te.engine.OnEpoch(ctx, types.Epoch{Seq: 15, Action: vegapb.EpochAction_EPOCH_ACTION_START}) + members = te.engine.GetTeamMembers(string(teamID1), 5) + assert.Len(t, members, 1) + + // now at epoch 16 both should be there + te.engine.OnEpoch(ctx, types.Epoch{Seq: 16, Action: vegapb.EpochAction_EPOCH_ACTION_START}) + members = te.engine.GetTeamMembers(string(teamID1), 5) + assert.Len(t, members, 2) +} diff --git a/core/types/asset.go b/core/types/asset.go index dd97a71916..52391a411f 100644 --- a/core/types/asset.go +++ b/core/types/asset.go @@ -22,7 +22,7 @@ import ( "code.vegaprotocol.io/vega/libs/crypto" "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/libs/stringer" - proto "code.vegaprotocol.io/vega/protos/vega" + vegapb "code.vegaprotocol.io/vega/protos/vega" ) var ( @@ -30,31 +30,30 @@ var ( ErrMissingBuiltinAssetField = errors.New("missing builtin asset field") ErrInvalidAssetNameEmpty = errors.New("invalid asset, name must not be empty") ErrInvalidAssetSymbolEmpty = errors.New("invalid asset, symbol must not be empty") - ErrInvalidAssetDecimalPlacesZero = errors.New("invalid asset, decimal places must not be zero") ErrInvalidAssetQuantumZero = errors.New("invalid asset, quantum must not be zero") ErrLifetimeLimitMustBePositive = errors.New("lifetime limit must be positive") ErrWithdrawThresholdMustBePositive = errors.New("withdraw threshold must be positive") ) -type AssetStatus = proto.Asset_Status +type AssetStatus = vegapb.Asset_Status const ( - // Default value, always invalid. - AssetStatusUnspecified AssetStatus = proto.Asset_STATUS_UNSPECIFIED - // Asset is proposed and under vote. - AssetStatusProposed AssetStatus = proto.Asset_STATUS_PROPOSED - // Asset has been rejected from governance. - AssetStatusRejected AssetStatus = proto.Asset_STATUS_REJECTED - // Asset is pending listing from the bridge. - AssetStatusPendingListing AssetStatus = proto.Asset_STATUS_PENDING_LISTING - // Asset is fully usable in the network. - AssetStatusEnabled AssetStatus = proto.Asset_STATUS_ENABLED + // AssetStatusUnspecified is the default value, always invalid. + AssetStatusUnspecified AssetStatus = vegapb.Asset_STATUS_UNSPECIFIED + // AssetStatusProposed states the asset is proposed and under vote. + AssetStatusProposed AssetStatus = vegapb.Asset_STATUS_PROPOSED + // AssetStatusRejected states the asset has been rejected from governance. + AssetStatusRejected AssetStatus = vegapb.Asset_STATUS_REJECTED + // AssetStatusPendingListing states the asset is pending listing from the bridge. + AssetStatusPendingListing AssetStatus = vegapb.Asset_STATUS_PENDING_LISTING + // AssetStatusEnabled states the asset is fully usable in the network. + AssetStatusEnabled AssetStatus = vegapb.Asset_STATUS_ENABLED ) type Asset struct { // Internal identifier of the asset ID string - // Name of the asset (e.g: Great British Pound) + // Details of the asset (e.g: Great British Pound) Details *AssetDetails // Status of the asset Status AssetStatus @@ -68,12 +67,12 @@ type isAssetDetails interface { String() string } -func (a Asset) IntoProto() *proto.Asset { - var details *proto.AssetDetails +func (a Asset) IntoProto() *vegapb.Asset { + var details *vegapb.AssetDetails if a.Details != nil { details = a.Details.IntoProto() } - return &proto.Asset{ + return &vegapb.Asset{ Id: a.ID, Details: details, Status: a.Status, @@ -92,7 +91,7 @@ func (a Asset) DeepClone() *Asset { return &cpy } -func AssetFromProto(p *proto.Asset) (*Asset, error) { +func AssetFromProto(p *vegapb.Asset) (*Asset, error) { var ( details *AssetDetails err error @@ -115,9 +114,7 @@ type AssetDetails struct { Symbol string Decimals uint64 Quantum num.Decimal - // *AssetDetailsBuiltinAsset - // *AssetDetailsErc20 - Source isAssetDetails + Source isAssetDetails } func (a AssetDetails) String() string { @@ -147,8 +144,8 @@ func (a AssetDetails) Validate() (ProposalError, error) { return ProposalErrorUnspecified, nil } -func (a AssetDetails) IntoProto() *proto.AssetDetails { - r := &proto.AssetDetails{ +func (a AssetDetails) IntoProto() *vegapb.AssetDetails { + r := &vegapb.AssetDetails{ Name: a.Name, Symbol: a.Symbol, Decimals: a.Decimals, @@ -159,9 +156,9 @@ func (a AssetDetails) IntoProto() *proto.AssetDetails { } src := a.Source.adIntoProto() switch s := src.(type) { - case *proto.AssetDetails_Erc20: + case *vegapb.AssetDetails_Erc20: r.Source = s - case *proto.AssetDetails_BuiltinAsset: + case *vegapb.AssetDetails_BuiltinAsset: r.Source = s } return r @@ -191,24 +188,24 @@ func (a AssetDetails) DeepClone() *AssetDetails { return cpy } -func AssetDetailsFromProto(p *proto.AssetDetails) (*AssetDetails, error) { +func AssetDetailsFromProto(p *vegapb.AssetDetails) (*AssetDetails, error) { var ( src isAssetDetails err error ) switch st := p.Source.(type) { - case *proto.AssetDetails_Erc20: + case *vegapb.AssetDetails_Erc20: src, err = AssetDetailsERC20FromProto(st) if err != nil { return nil, err } - case *proto.AssetDetails_BuiltinAsset: + case *vegapb.AssetDetails_BuiltinAsset: src = AssetDetailsBuiltinFromProto(st) } - min := num.DecimalZero() + quantum := num.DecimalZero() if len(p.Quantum) > 0 { var err error - min, err = num.DecimalFromString(p.Quantum) + quantum, err = num.DecimalFromString(p.Quantum) if err != nil { return nil, fmt.Errorf("invalid quantum: %w", err) } @@ -217,7 +214,7 @@ func AssetDetailsFromProto(p *proto.AssetDetails) (*AssetDetails, error) { Name: p.Name, Symbol: p.Symbol, Decimals: p.Decimals, - Quantum: min, + Quantum: quantum, Source: src, }, nil } @@ -233,9 +230,9 @@ func (a AssetDetailsBuiltinAsset) String() string { ) } -func (a AssetDetailsBuiltinAsset) IntoProto() *proto.AssetDetails_BuiltinAsset { - p := &proto.AssetDetails_BuiltinAsset{ - BuiltinAsset: &proto.BuiltinAsset{}, +func (a AssetDetailsBuiltinAsset) IntoProto() *vegapb.AssetDetails_BuiltinAsset { + p := &vegapb.AssetDetails_BuiltinAsset{ + BuiltinAsset: &vegapb.BuiltinAsset{}, } if a.BuiltinAsset != nil && a.BuiltinAsset.MaxFaucetAmountMint != nil { p.BuiltinAsset.MaxFaucetAmountMint = a.BuiltinAsset.MaxFaucetAmountMint.String() @@ -267,7 +264,7 @@ func (a AssetDetailsBuiltinAsset) Validate() (ProposalError, error) { return ProposalErrorUnspecified, nil } -func AssetDetailsBuiltinFromProto(p *proto.AssetDetails_BuiltinAsset) *AssetDetailsBuiltinAsset { +func AssetDetailsBuiltinFromProto(p *vegapb.AssetDetails_BuiltinAsset) *AssetDetailsBuiltinAsset { if p.BuiltinAsset.MaxFaucetAmountMint != "" { max, _ := num.UintFromString(p.BuiltinAsset.MaxFaucetAmountMint, 10) return &AssetDetailsBuiltinAsset{ @@ -302,7 +299,7 @@ func (a AssetDetailsErc20) String() string { ) } -func (a AssetDetailsErc20) IntoProto() *proto.AssetDetails_Erc20 { +func (a AssetDetailsErc20) IntoProto() *vegapb.AssetDetails_Erc20 { lifetimeLimit := "0" if a.ERC20.LifetimeLimit != nil { lifetimeLimit = a.ERC20.LifetimeLimit.String() @@ -311,9 +308,10 @@ func (a AssetDetailsErc20) IntoProto() *proto.AssetDetails_Erc20 { if a.ERC20.WithdrawThreshold != nil { withdrawThreshold = a.ERC20.WithdrawThreshold.String() } - return &proto.AssetDetails_Erc20{ - Erc20: &proto.ERC20{ + return &vegapb.AssetDetails_Erc20{ + Erc20: &vegapb.ERC20{ ContractAddress: a.ERC20.ContractAddress, + ChainId: a.ERC20.ChainID, LifetimeLimit: lifetimeLimit, WithdrawThreshold: withdrawThreshold, }, @@ -339,16 +337,11 @@ func (a AssetDetailsErc20) Validate() (ProposalError, error) { if len(a.ERC20.ContractAddress) <= 0 { return ProposalErrorMissingErc20ContractAddress, ErrMissingERC20ContractAddress } - // if a.ERC20.LifetimeLimit.EQ(num.Zero()) { - // return ProposalErrorInvalidAsset, ErrLifetimeLimitMustBePositive - // } - // if a.ERC20.WithdrawThreshold.EQ(num.Zero()) { - // return ProposalErrorInvalidAsset, ErrWithdrawThresholdMustBePositive - // } + return ProposalErrorUnspecified, nil } -func AssetDetailsERC20FromProto(p *proto.AssetDetails_Erc20) (*AssetDetailsErc20, error) { +func AssetDetailsERC20FromProto(p *vegapb.AssetDetails_Erc20) (*AssetDetailsErc20, error) { var ( lifetimeLimit = num.UintZero() withdrawThreshold = num.UintZero() @@ -368,6 +361,7 @@ func AssetDetailsERC20FromProto(p *proto.AssetDetails_Erc20) (*AssetDetailsErc20 } return &AssetDetailsErc20{ ERC20: &ERC20{ + ChainID: p.Erc20.ChainId, ContractAddress: crypto.EthereumChecksumAddress(p.Erc20.ContractAddress), LifetimeLimit: lifetimeLimit, WithdrawThreshold: withdrawThreshold, @@ -377,6 +371,9 @@ func AssetDetailsERC20FromProto(p *proto.AssetDetails_Erc20) (*AssetDetailsErc20 // An ERC20 token based asset, living on the ethereum network. type ERC20 struct { + // Chain ID from which the asset originated from. + ChainID string + ContractAddress string LifetimeLimit *num.Uint WithdrawThreshold *num.Uint @@ -385,6 +382,7 @@ type ERC20 struct { func (e ERC20) DeepClone() *ERC20 { cpy := &ERC20{ ContractAddress: e.ContractAddress, + ChainID: e.ChainID, } if e.LifetimeLimit != nil { cpy.LifetimeLimit = e.LifetimeLimit.Clone() @@ -401,8 +399,9 @@ func (e ERC20) DeepClone() *ERC20 { func (e ERC20) String() string { return fmt.Sprintf( - "contractAddress(%s) lifetimeLimit(%s) withdrawThreshold(%s)", + "contractAddress(%s) chainID(%s) lifetimeLimit(%s) withdrawThreshold(%s)", e.ContractAddress, + e.ChainID, stringer.PtrToString(e.LifetimeLimit), stringer.PtrToString(e.WithdrawThreshold), ) diff --git a/core/types/asset_snapshot.go b/core/types/asset_snapshot.go new file mode 100644 index 0000000000..4f869c0a35 --- /dev/null +++ b/core/types/asset_snapshot.go @@ -0,0 +1,195 @@ +// 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/protos/vega" + snapshot "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" +) + +type PayloadActiveAssets struct { + ActiveAssets *ActiveAssets +} + +func (p PayloadActiveAssets) IntoProto() *snapshot.Payload_ActiveAssets { + return &snapshot.Payload_ActiveAssets{ + ActiveAssets: p.ActiveAssets.IntoProto(), + } +} + +func (*PayloadActiveAssets) Namespace() SnapshotNamespace { + return AssetsSnapshot +} + +func (*PayloadActiveAssets) Key() string { + return "active" +} + +func (*PayloadActiveAssets) isPayload() {} + +func (p *PayloadActiveAssets) plToProto() interface{} { + return p.IntoProto() +} + +func PayloadActiveAssetsFromProto(paa *snapshot.Payload_ActiveAssets) *PayloadActiveAssets { + return &PayloadActiveAssets{ + ActiveAssets: ActiveAssetsFromProto(paa.ActiveAssets), + } +} + +type ActiveAssets struct { + Assets []*Asset +} + +func (a ActiveAssets) IntoProto() *snapshot.ActiveAssets { + ret := &snapshot.ActiveAssets{ + Assets: make([]*vega.Asset, 0, len(a.Assets)), + } + for _, a := range a.Assets { + ret.Assets = append(ret.Assets, a.IntoProto()) + } + return ret +} + +func ActiveAssetsFromProto(aa *snapshot.ActiveAssets) *ActiveAssets { + ret := ActiveAssets{ + Assets: make([]*Asset, 0, len(aa.Assets)), + } + for _, a := range aa.Assets { + aa, err := AssetFromProto(a) + if err != nil { + panic(err) + } + ret.Assets = append(ret.Assets, aa) + } + return &ret +} + +type PayloadPendingAssets struct { + PendingAssets *PendingAssets +} + +func PayloadPendingAssetsFromProto(ppa *snapshot.Payload_PendingAssets) *PayloadPendingAssets { + return &PayloadPendingAssets{ + PendingAssets: PendingAssetsFromProto(ppa.PendingAssets), + } +} + +func (p PayloadPendingAssets) IntoProto() *snapshot.Payload_PendingAssets { + return &snapshot.Payload_PendingAssets{ + PendingAssets: p.PendingAssets.IntoProto(), + } +} + +func (*PayloadPendingAssets) Key() string { + return "pending" +} + +func (*PayloadPendingAssets) Namespace() SnapshotNamespace { + return AssetsSnapshot +} + +func (*PayloadPendingAssets) isPayload() {} + +func (p *PayloadPendingAssets) plToProto() interface{} { + return p.IntoProto() +} + +type PendingAssets struct { + Assets []*Asset +} + +func PendingAssetsFromProto(aa *snapshot.PendingAssets) *PendingAssets { + ret := PendingAssets{ + Assets: make([]*Asset, 0, len(aa.Assets)), + } + for _, a := range aa.Assets { + pa, err := AssetFromProto(a) + if err != nil { + panic(err) + } + ret.Assets = append(ret.Assets, pa) + } + return &ret +} + +func (a PendingAssets) IntoProto() *snapshot.PendingAssets { + ret := &snapshot.PendingAssets{ + Assets: make([]*vega.Asset, 0, len(a.Assets)), + } + for _, a := range a.Assets { + ret.Assets = append(ret.Assets, a.IntoProto()) + } + return ret +} + +type PayloadPendingAssetUpdates struct { + PendingAssetUpdates *PendingAssetUpdates +} + +func (p PayloadPendingAssetUpdates) IntoProto() *snapshot.Payload_PendingAssetUpdates { + return &snapshot.Payload_PendingAssetUpdates{ + PendingAssetUpdates: p.PendingAssetUpdates.IntoProto(), + } +} + +func (*PayloadPendingAssetUpdates) Key() string { + return "pending_updates" +} + +func (*PayloadPendingAssetUpdates) Namespace() SnapshotNamespace { + return AssetsSnapshot +} + +func (*PayloadPendingAssetUpdates) isPayload() {} + +func (p *PayloadPendingAssetUpdates) plToProto() interface{} { + return p.IntoProto() +} + +func PayloadPendingAssetUpdatesFromProto(ppa *snapshot.Payload_PendingAssetUpdates) *PayloadPendingAssetUpdates { + return &PayloadPendingAssetUpdates{ + PendingAssetUpdates: PendingAssetUpdatesFromProto(ppa.PendingAssetUpdates), + } +} + +type PendingAssetUpdates struct { + Assets []*Asset +} + +func (a PendingAssetUpdates) IntoProto() *snapshot.PendingAssetUpdates { + ret := &snapshot.PendingAssetUpdates{ + Assets: make([]*vega.Asset, 0, len(a.Assets)), + } + for _, a := range a.Assets { + ret.Assets = append(ret.Assets, a.IntoProto()) + } + return ret +} + +func PendingAssetUpdatesFromProto(aa *snapshot.PendingAssetUpdates) *PendingAssetUpdates { + ret := PendingAssetUpdates{ + Assets: make([]*Asset, 0, len(aa.Assets)), + } + for _, a := range aa.Assets { + pa, err := AssetFromProto(a) + if err != nil { + panic(err) + } + ret.Assets = append(ret.Assets, pa) + } + return &ret +} diff --git a/core/types/banking.go b/core/types/banking.go index c94f55c948..5afc53bd0c 100644 --- a/core/types/banking.go +++ b/core/types/banking.go @@ -104,7 +104,7 @@ func (t *TransferBase) IsValid() error { return ErrInvalidToForRewardAccountType } case AccountTypeGeneral, AccountTypeLPFeeReward, AccountTypeMakerReceivedFeeReward, AccountTypeMakerPaidFeeReward, AccountTypeMarketProposerReward, - AccountTypeAveragePositionReward, AccountTypeRelativeReturnReward, AccountTypeValidatorRankingReward, AccountTypeReturnVolatilityReward: /*, AccountTypeLockedForStaking*/ + AccountTypeAveragePositionReward, AccountTypeRelativeReturnReward, AccountTypeValidatorRankingReward, AccountTypeReturnVolatilityReward, AccountTypeRealisedReturnReward: /*, AccountTypeLockedForStaking*/ break default: return ErrUnsupportedToAccountType @@ -180,8 +180,9 @@ func (g *GovernanceTransfer) IntoEvent(amount *num.Uint, reason, gameID *string) } else { out.Kind = &eventspb.Transfer_RecurringGovernance{ RecurringGovernance: &eventspb.RecurringGovernanceTransfer{ - StartEpoch: g.Config.RecurringTransferConfig.StartEpoch, - EndEpoch: g.Config.RecurringTransferConfig.EndEpoch, + StartEpoch: g.Config.RecurringTransferConfig.StartEpoch, + EndEpoch: g.Config.RecurringTransferConfig.EndEpoch, + DispatchStrategy: g.Config.RecurringTransferConfig.DispatchStrategy, }, } } diff --git a/core/types/banking_snapshot.go b/core/types/banking_snapshot.go new file mode 100644 index 0000000000..bbdd266bf0 --- /dev/null +++ b/core/types/banking_snapshot.go @@ -0,0 +1,598 @@ +// 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 ( + checkpointpb "code.vegaprotocol.io/vega/protos/vega/checkpoint/v1" + snapshot "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" +) + +type PayloadBankingPrimaryBridgeState struct { + BankingBridgeState *BankingBridgeState +} + +func (p PayloadBankingPrimaryBridgeState) IntoProto() *snapshot.Payload_BankingPrimaryBridgeState { + return &snapshot.Payload_BankingPrimaryBridgeState{ + BankingPrimaryBridgeState: &snapshot.BankingBridgeState{ + BridgeState: &checkpointpb.BridgeState{ + Active: p.BankingBridgeState.Active, + BlockHeight: p.BankingBridgeState.BlockHeight, + LogIndex: p.BankingBridgeState.LogIndex, + ChainId: p.BankingBridgeState.ChainID, + }, + }, + } +} + +func (*PayloadBankingPrimaryBridgeState) isPayload() {} + +func (p *PayloadBankingPrimaryBridgeState) plToProto() interface{} { + return p.IntoProto() +} + +func (*PayloadBankingPrimaryBridgeState) Key() string { + return "bridgeState" +} + +func (*PayloadBankingPrimaryBridgeState) Namespace() SnapshotNamespace { + return BankingSnapshot +} + +func PayloadBankingPrimaryBridgeStateFromProto(pbbs *snapshot.Payload_BankingPrimaryBridgeState) *PayloadBankingPrimaryBridgeState { + return &PayloadBankingPrimaryBridgeState{ + BankingBridgeState: &BankingBridgeState{ + Active: pbbs.BankingPrimaryBridgeState.BridgeState.Active, + BlockHeight: pbbs.BankingPrimaryBridgeState.BridgeState.BlockHeight, + LogIndex: pbbs.BankingPrimaryBridgeState.BridgeState.LogIndex, + ChainID: pbbs.BankingPrimaryBridgeState.BridgeState.ChainId, + }, + } +} + +type PayloadBankingEVMBridgeStates struct { + BankingBridgeStates []*checkpointpb.BridgeState +} + +func (p PayloadBankingEVMBridgeStates) IntoProto() *snapshot.Payload_BankingEvmBridgeStates { + return &snapshot.Payload_BankingEvmBridgeStates{ + BankingEvmBridgeStates: &snapshot.BankingEVMBridgeStates{ + BridgeStates: p.BankingBridgeStates, + }, + } +} + +func (*PayloadBankingEVMBridgeStates) isPayload() {} + +func (p *PayloadBankingEVMBridgeStates) plToProto() interface{} { + return p.IntoProto() +} + +func (*PayloadBankingEVMBridgeStates) Key() string { + return "evmBridgeStates" +} + +func (*PayloadBankingEVMBridgeStates) Namespace() SnapshotNamespace { + return BankingSnapshot +} + +func PayloadBankingEVMBridgeStatesFromProto(pbbs *snapshot.Payload_BankingEvmBridgeStates) *PayloadBankingEVMBridgeStates { + return &PayloadBankingEVMBridgeStates{ + BankingBridgeStates: pbbs.BankingEvmBridgeStates.BridgeStates, + } +} + +type BankingBridgeState struct { + Active bool + BlockHeight uint64 + LogIndex uint64 + ChainID string +} + +type PayloadBankingWithdrawals struct { + BankingWithdrawals *BankingWithdrawals +} + +func PayloadBankingWithdrawalsFromProto(pbw *snapshot.Payload_BankingWithdrawals) *PayloadBankingWithdrawals { + return &PayloadBankingWithdrawals{ + BankingWithdrawals: BankingWithdrawalsFromProto(pbw.BankingWithdrawals), + } +} + +func (p PayloadBankingWithdrawals) IntoProto() *snapshot.Payload_BankingWithdrawals { + return &snapshot.Payload_BankingWithdrawals{ + BankingWithdrawals: p.BankingWithdrawals.IntoProto(), + } +} + +func (*PayloadBankingWithdrawals) isPayload() {} + +func (p *PayloadBankingWithdrawals) plToProto() interface{} { + return p.IntoProto() +} + +func (*PayloadBankingWithdrawals) Key() string { + return "withdrawals" +} + +func (*PayloadBankingWithdrawals) Namespace() SnapshotNamespace { + return BankingSnapshot +} + +type BankingWithdrawals struct { + Withdrawals []*RWithdrawal +} + +func (b BankingWithdrawals) IntoProto() *snapshot.BankingWithdrawals { + ret := snapshot.BankingWithdrawals{ + Withdrawals: make([]*snapshot.Withdrawal, 0, len(b.Withdrawals)), + } + for _, w := range b.Withdrawals { + ret.Withdrawals = append(ret.Withdrawals, w.IntoProto()) + } + return &ret +} + +func BankingWithdrawalsFromProto(bw *snapshot.BankingWithdrawals) *BankingWithdrawals { + ret := &BankingWithdrawals{ + Withdrawals: make([]*RWithdrawal, 0, len(bw.Withdrawals)), + } + for _, w := range bw.Withdrawals { + ret.Withdrawals = append(ret.Withdrawals, RWithdrawalFromProto(w)) + } + return ret +} + +type RWithdrawal struct { + Ref string + Withdrawal *Withdrawal +} + +func (r RWithdrawal) IntoProto() *snapshot.Withdrawal { + return &snapshot.Withdrawal{ + Ref: r.Ref, + Withdrawal: r.Withdrawal.IntoProto(), + } +} + +func RWithdrawalFromProto(rw *snapshot.Withdrawal) *RWithdrawal { + return &RWithdrawal{ + Ref: rw.Ref, + Withdrawal: WithdrawalFromProto(rw.Withdrawal), + } +} + +type PayloadBankingDeposits struct { + BankingDeposits *BankingDeposits +} + +func (p PayloadBankingDeposits) IntoProto() *snapshot.Payload_BankingDeposits { + return &snapshot.Payload_BankingDeposits{ + BankingDeposits: p.BankingDeposits.IntoProto(), + } +} + +func (*PayloadBankingDeposits) isPayload() {} + +func (p *PayloadBankingDeposits) plToProto() interface{} { + return p.IntoProto() +} + +func (*PayloadBankingDeposits) Key() string { + return "deposits" +} + +func (*PayloadBankingDeposits) Namespace() SnapshotNamespace { + return BankingSnapshot +} + +func PayloadBankingDepositsFromProto(pbd *snapshot.Payload_BankingDeposits) *PayloadBankingDeposits { + return &PayloadBankingDeposits{ + BankingDeposits: BankingDepositsFromProto(pbd.BankingDeposits), + } +} + +type BankingDeposits struct { + Deposit []*BDeposit +} + +func (b BankingDeposits) IntoProto() *snapshot.BankingDeposits { + ret := snapshot.BankingDeposits{ + Deposit: make([]*snapshot.Deposit, 0, len(b.Deposit)), + } + for _, d := range b.Deposit { + ret.Deposit = append(ret.Deposit, d.IntoProto()) + } + return &ret +} + +func BankingDepositsFromProto(bd *snapshot.BankingDeposits) *BankingDeposits { + ret := &BankingDeposits{ + Deposit: make([]*BDeposit, 0, len(bd.Deposit)), + } + for _, d := range bd.Deposit { + ret.Deposit = append(ret.Deposit, BDepositFromProto(d)) + } + return ret +} + +type BDeposit struct { + ID string + Deposit *Deposit +} + +func (b BDeposit) IntoProto() *snapshot.Deposit { + return &snapshot.Deposit{ + Id: b.ID, + Deposit: b.Deposit.IntoProto(), + } +} + +func BDepositFromProto(d *snapshot.Deposit) *BDeposit { + return &BDeposit{ + ID: d.Id, + Deposit: DepositFromProto(d.Deposit), + } +} + +type PayloadBankingSeen struct { + BankingSeen *BankingSeen +} + +func (p PayloadBankingSeen) IntoProto() *snapshot.Payload_BankingSeen { + return &snapshot.Payload_BankingSeen{ + BankingSeen: p.BankingSeen.IntoProto(), + } +} + +func (*PayloadBankingSeen) isPayload() {} + +func (p *PayloadBankingSeen) plToProto() interface{} { + return p.IntoProto() +} + +func (*PayloadBankingSeen) Key() string { + return "seen" +} + +func (*PayloadBankingSeen) Namespace() SnapshotNamespace { + return BankingSnapshot +} + +func PayloadBankingSeenFromProto(pbs *snapshot.Payload_BankingSeen) *PayloadBankingSeen { + return &PayloadBankingSeen{ + BankingSeen: BankingSeenFromProto(pbs.BankingSeen), + } +} + +type BankingSeen struct { + Refs []string + LastSeenPrimaryEthBlock uint64 + LastSeenSecondaryEthBlock uint64 +} + +func (b BankingSeen) IntoProto() *snapshot.BankingSeen { + ret := snapshot.BankingSeen{ + Refs: b.Refs, + LastSeenPrimaryEthBlock: b.LastSeenPrimaryEthBlock, + LastSeenSecondaryEthBlock: b.LastSeenSecondaryEthBlock, + } + return &ret +} + +func BankingSeenFromProto(bs *snapshot.BankingSeen) *BankingSeen { + ret := BankingSeen{ + Refs: bs.Refs, + LastSeenPrimaryEthBlock: bs.LastSeenPrimaryEthBlock, + LastSeenSecondaryEthBlock: bs.LastSeenSecondaryEthBlock, + } + return &ret +} + +type PayloadBankingAssetActions struct { + BankingAssetActions *BankingAssetActions +} + +func (p PayloadBankingAssetActions) IntoProto() *snapshot.Payload_BankingAssetActions { + return &snapshot.Payload_BankingAssetActions{ + BankingAssetActions: p.BankingAssetActions.IntoProto(), + } +} + +func (*PayloadBankingAssetActions) isPayload() {} + +func (p *PayloadBankingAssetActions) plToProto() interface{} { + return p.IntoProto() +} + +func (*PayloadBankingAssetActions) Key() string { + return "assetActions" +} + +func (*PayloadBankingAssetActions) Namespace() SnapshotNamespace { + return BankingSnapshot +} + +func PayloadBankingAssetActionsFromProto(pbs *snapshot.Payload_BankingAssetActions) *PayloadBankingAssetActions { + return &PayloadBankingAssetActions{ + BankingAssetActions: BankingAssetActionsFromProto(pbs.BankingAssetActions), + } +} + +type BankingAssetActions struct { + AssetAction []*AssetAction +} + +func (a *BankingAssetActions) IntoProto() *snapshot.BankingAssetActions { + ret := snapshot.BankingAssetActions{ + AssetAction: make([]*checkpointpb.AssetAction, 0, len(a.AssetAction)), + } + for _, aa := range a.AssetAction { + ret.AssetAction = append(ret.AssetAction, aa.IntoProto()) + } + return &ret +} + +func BankingAssetActionsFromProto(aa *snapshot.BankingAssetActions) *BankingAssetActions { + ret := BankingAssetActions{ + AssetAction: make([]*AssetAction, 0, len(aa.AssetAction)), + } + + for _, a := range aa.AssetAction { + ret.AssetAction = append(ret.AssetAction, AssetActionFromProto(a)) + } + return &ret +} + +type AssetAction struct { + ID string + State uint32 + Asset string + BlockNumber uint64 + TxIndex uint64 + Hash string + ChainID string + BuiltinD *BuiltinAssetDeposit + Erc20D *ERC20Deposit + Erc20AL *ERC20AssetList + ERC20AssetLimitsUpdated *ERC20AssetLimitsUpdated + BridgeStopped bool + BridgeResume bool +} + +func (aa *AssetAction) IntoProto() *checkpointpb.AssetAction { + ret := &checkpointpb.AssetAction{ + Id: aa.ID, + State: aa.State, + Asset: aa.Asset, + BlockNumber: aa.BlockNumber, + TxIndex: aa.TxIndex, + Hash: aa.Hash, + Erc20BridgeStopped: aa.BridgeStopped, + Erc20BridgeResumed: aa.BridgeResume, + ChainId: aa.ChainID, + } + if aa.BuiltinD != nil { + ret.BuiltinDeposit = aa.BuiltinD.IntoProto() + } + if aa.Erc20D != nil { + ret.Erc20Deposit = aa.Erc20D.IntoProto() + } + if aa.Erc20AL != nil { + ret.AssetList = aa.Erc20AL.IntoProto() + } + if aa.ERC20AssetLimitsUpdated != nil { + ret.Erc20AssetLimitsUpdated = aa.ERC20AssetLimitsUpdated.IntoProto() + } + return ret +} + +func AssetActionFromProto(a *checkpointpb.AssetAction) *AssetAction { + aa := &AssetAction{ + ID: a.Id, + State: a.State, + Asset: a.Asset, + BlockNumber: a.BlockNumber, + ChainID: a.ChainId, + TxIndex: a.TxIndex, + Hash: a.Hash, + BridgeStopped: a.Erc20BridgeStopped, + BridgeResume: a.Erc20BridgeResumed, + } + + if a.Erc20Deposit != nil { + erc20d, err := NewERC20DepositFromProto(a.Erc20Deposit) + if err == nil { + aa.Erc20D = erc20d + } + } + + if a.BuiltinDeposit != nil { + builtind, err := NewBuiltinAssetDepositFromProto(a.BuiltinDeposit) + if err == nil { + aa.BuiltinD = builtind + } + } + + if a.AssetList != nil { + aa.Erc20AL = NewERC20AssetListFromProto(a.AssetList) + } + + if a.Erc20AssetLimitsUpdated != nil { + aa.ERC20AssetLimitsUpdated = NewERC20AssetLimitsUpdatedFromProto(a.Erc20AssetLimitsUpdated) + } + + return aa +} + +type PayloadBankingScheduledTransfers struct { + BankingScheduledTransfers []*checkpointpb.ScheduledTransferAtTime +} + +func (p PayloadBankingScheduledTransfers) IntoProto() *snapshot.Payload_BankingScheduledTransfers { + return &snapshot.Payload_BankingScheduledTransfers{ + BankingScheduledTransfers: &snapshot.BankingScheduledTransfers{ + TransfersAtTime: p.BankingScheduledTransfers, + }, + } +} + +func (*PayloadBankingScheduledTransfers) isPayload() {} + +func (p *PayloadBankingScheduledTransfers) plToProto() interface{} { + return p.IntoProto() +} + +func (*PayloadBankingScheduledTransfers) Key() string { + return "scheduledTransfers" +} + +func (*PayloadBankingScheduledTransfers) Namespace() SnapshotNamespace { + return BankingSnapshot +} + +func PayloadBankingScheduledTransfersFromProto(pbd *snapshot.Payload_BankingScheduledTransfers) *PayloadBankingScheduledTransfers { + return &PayloadBankingScheduledTransfers{ + BankingScheduledTransfers: pbd.BankingScheduledTransfers.TransfersAtTime, + } +} + +type PayloadBankingRecurringGovernanceTransfers struct { + BankingRecurringGovernanceTransfers []*checkpointpb.GovernanceTransfer +} + +func (p PayloadBankingRecurringGovernanceTransfers) IntoProto() *snapshot.Payload_BankingRecurringGovernanceTransfers { + return &snapshot.Payload_BankingRecurringGovernanceTransfers{ + BankingRecurringGovernanceTransfers: &snapshot.BankingRecurringGovernanceTransfers{ + RecurringTransfers: p.BankingRecurringGovernanceTransfers, + }, + } +} + +func (*PayloadBankingRecurringGovernanceTransfers) isPayload() {} + +func (p *PayloadBankingRecurringGovernanceTransfers) plToProto() interface{} { + return p.IntoProto() +} + +func (*PayloadBankingRecurringGovernanceTransfers) Key() string { + return "recurringGovernanceTransfers" +} + +func (*PayloadBankingRecurringGovernanceTransfers) Namespace() SnapshotNamespace { + return BankingSnapshot +} + +func PayloadBankingRecurringGovernanceTransfersFromProto(pbd *snapshot.Payload_BankingRecurringGovernanceTransfers) *PayloadBankingRecurringGovernanceTransfers { + return &PayloadBankingRecurringGovernanceTransfers{ + BankingRecurringGovernanceTransfers: pbd.BankingRecurringGovernanceTransfers.RecurringTransfers, + } +} + +type PayloadBankingScheduledGovernanceTransfers struct { + BankingScheduledGovernanceTransfers []*checkpointpb.ScheduledGovernanceTransferAtTime +} + +func (p PayloadBankingScheduledGovernanceTransfers) IntoProto() *snapshot.Payload_BankingScheduledGovernanceTransfers { + return &snapshot.Payload_BankingScheduledGovernanceTransfers{ + BankingScheduledGovernanceTransfers: &snapshot.BankingScheduledGovernanceTransfers{ + TransfersAtTime: p.BankingScheduledGovernanceTransfers, + }, + } +} + +func (*PayloadBankingScheduledGovernanceTransfers) isPayload() {} + +func (p *PayloadBankingScheduledGovernanceTransfers) plToProto() interface{} { + return p.IntoProto() +} + +func (*PayloadBankingScheduledGovernanceTransfers) Key() string { + return "scheduledGovernanceTransfers" +} + +func (*PayloadBankingScheduledGovernanceTransfers) Namespace() SnapshotNamespace { + return BankingSnapshot +} + +func PayloadBankingScheduledGovernanceTransfersFromProto(pbd *snapshot.Payload_BankingScheduledGovernanceTransfers) *PayloadBankingScheduledGovernanceTransfers { + return &PayloadBankingScheduledGovernanceTransfers{ + BankingScheduledGovernanceTransfers: pbd.BankingScheduledGovernanceTransfers.TransfersAtTime, + } +} + +type PayloadBankingTransferFeeDiscounts struct { + BankingTransferFeeDiscounts *snapshot.BankingTransferFeeDiscounts +} + +func (p PayloadBankingTransferFeeDiscounts) IntoProto() *snapshot.Payload_BankingTransferFeeDiscounts { + return &snapshot.Payload_BankingTransferFeeDiscounts{ + BankingTransferFeeDiscounts: &snapshot.BankingTransferFeeDiscounts{ + PartyAssetDiscount: p.BankingTransferFeeDiscounts.PartyAssetDiscount, + }, + } +} + +func (*PayloadBankingTransferFeeDiscounts) isPayload() {} + +func (p *PayloadBankingTransferFeeDiscounts) plToProto() interface{} { + return p.IntoProto() +} + +func (*PayloadBankingTransferFeeDiscounts) Key() string { + return "transferFeeDiscounts" +} + +func (*PayloadBankingTransferFeeDiscounts) Namespace() SnapshotNamespace { + return BankingSnapshot +} + +func PayloadBankingTransferFeeDiscountsFromProto(pbd *snapshot.Payload_BankingTransferFeeDiscounts) *PayloadBankingTransferFeeDiscounts { + return &PayloadBankingTransferFeeDiscounts{ + BankingTransferFeeDiscounts: pbd.BankingTransferFeeDiscounts, + } +} + +type PayloadBankingRecurringTransfers struct { + BankingRecurringTransfers *checkpointpb.RecurringTransfers +} + +func (p PayloadBankingRecurringTransfers) IntoProto() *snapshot.Payload_BankingRecurringTransfers { + return &snapshot.Payload_BankingRecurringTransfers{ + BankingRecurringTransfers: &snapshot.BankingRecurringTransfers{ + RecurringTransfers: p.BankingRecurringTransfers, + }, + } +} + +func (*PayloadBankingRecurringTransfers) isPayload() {} + +func (p *PayloadBankingRecurringTransfers) plToProto() interface{} { + return p.IntoProto() +} + +func (*PayloadBankingRecurringTransfers) Key() string { + return "recurringTransfers" +} + +func (*PayloadBankingRecurringTransfers) Namespace() SnapshotNamespace { + return BankingSnapshot +} + +func PayloadBankingRecurringTransfersFromProto(pbd *snapshot.Payload_BankingRecurringTransfers) *PayloadBankingRecurringTransfers { + return &PayloadBankingRecurringTransfers{ + BankingRecurringTransfers: pbd.BankingRecurringTransfers.RecurringTransfers, + } +} diff --git a/core/types/chain_events.go b/core/types/chain_events.go index b9376c298c..a0e9b73223 100644 --- a/core/types/chain_events.go +++ b/core/types/chain_events.go @@ -544,7 +544,9 @@ type ERC20Event struct { // Index of the transaction Index uint64 // The block in which the transaction was added - Block uint64 + Block uint64 + ChainID string + // The action // // Types that are valid to be assigned to Action: @@ -566,8 +568,9 @@ type erc20EventAction interface { func NewERC20Event(p *vegapb.ERC20Event) (*ERC20Event, error) { e := ERC20Event{ - Index: p.Index, - Block: p.Block, + Index: p.Index, + Block: p.Block, + ChainID: p.ChainId, } var err error diff --git a/core/types/collateral.go b/core/types/collateral.go index 19de832839..25c2573e7d 100644 --- a/core/types/collateral.go +++ b/core/types/collateral.go @@ -319,4 +319,6 @@ const ( AccountTypeValidatorRankingReward AccountType = proto.AccountType_ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING // Account for pending fee referral rewards. AccountTypePendingFeeReferralReward AccountType = proto.AccountType_ACCOUNT_TYPE_PENDING_FEE_REFERRAL_REWARD + // Account for realised return rewards. + AccountTypeRealisedReturnReward = proto.AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN ) diff --git a/core/types/ethereum.go b/core/types/ethereum.go index cc8ea54fb9..9a8cab8cb3 100644 --- a/core/types/ethereum.go +++ b/core/types/ethereum.go @@ -41,6 +41,7 @@ var ( ErrDuplicateChainID = errors.New("duplicate chain ID name") ErrCannotRemoveL2Config = errors.New("L2 config cannot be removed") ErrCanOnlyAmendedConfirmationsAndBlockInterval = errors.New("can only amended L2 config confirmations and block interval") + ErrInvalidBlockLengthDuration = errors.New("block-length duration is invalid") ) type EthereumConfig struct { @@ -229,7 +230,7 @@ func CheckEthereumConfig(cfgProto *proto.EthereumConfig) error { func toEthereumConfigProto(v interface{}) (*proto.EthereumConfig, error) { cfg, ok := v.(*proto.EthereumConfig) if !ok { - return nil, fmt.Errorf("type \"%s\" is not a EthereumConfig proto", vgreflect.TypeName(v)) + return nil, fmt.Errorf("type %q is not a EthereumConfig proto", vgreflect.TypeName(v)) } return cfg, nil } @@ -249,7 +250,7 @@ type EthereumL2Config struct { func toEthereumL2ConfigsProto(v interface{}) (*proto.EthereumL2Configs, error) { cfg, ok := v.(*proto.EthereumL2Configs) if !ok { - return nil, fmt.Errorf("type \"%s\" is not a EthereumL2Configs proto", vgreflect.TypeName(v)) + return nil, fmt.Errorf("type %q is not a EthereumL2Configs proto", vgreflect.TypeName(v)) } return cfg, nil } diff --git a/core/types/ethereum_secondary.go b/core/types/ethereum_secondary.go new file mode 100644 index 0000000000..3cde39511f --- /dev/null +++ b/core/types/ethereum_secondary.go @@ -0,0 +1,171 @@ +// 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 ( + "errors" + "fmt" + "time" + + vgreflect "code.vegaprotocol.io/vega/libs/reflect" + proto "code.vegaprotocol.io/vega/protos/vega" +) + +type EVMChainConfig struct { + chainID string + networkID string + confirmations uint64 + collateralBridge EthereumContract + multiSigControl EthereumContract + blockTime time.Duration +} + +type EVMChainConfigs struct { + Configs []*EVMChainConfig +} + +func EVMChainConfigFromUntypedProto(v interface{}) (*EVMChainConfigs, error) { + cfg, err := toEVMChainConfigProto(v) + if err != nil { + return nil, fmt.Errorf("couldn't convert untyped proto to EVMChainConfig proto: %w", err) + } + + ethConfig, err := SecondaryConfigFromProto(cfg) + if err != nil { + return nil, fmt.Errorf("couldn't build EVMChainConfig: %w", err) + } + + return ethConfig, nil +} + +func SecondaryConfigFromProto(cfgsProto *proto.EVMBridgeConfigs) (*EVMChainConfigs, error) { + if err := CheckEVMChainConfig(cfgsProto); err != nil { + return nil, fmt.Errorf("invalid EVM chain configurations: %w", err) + } + + cfgs := &EVMChainConfigs{} + for _, cfgProto := range cfgsProto.Configs { + cfg := &EVMChainConfig{ + chainID: cfgProto.ChainId, + networkID: cfgProto.NetworkId, + confirmations: uint64(cfgProto.Confirmations), + collateralBridge: EthereumContract{ + address: cfgProto.CollateralBridgeContract.Address, + }, + multiSigControl: EthereumContract{ + address: cfgProto.MultisigControlContract.Address, + deploymentBlockHeight: cfgProto.MultisigControlContract.DeploymentBlockHeight, + }, + } + if len(cfgProto.BlockTime) != 0 { + bl, err := time.ParseDuration(cfgProto.BlockTime) + if err != nil { + return nil, fmt.Errorf("invalid EVM chain configuration, block_length: %w", err) + } + cfg.blockTime = bl + } + + cfgs.Configs = append(cfgs.Configs, cfg) + } + + return cfgs, nil +} + +func (c *EVMChainConfig) BlockTime() time.Duration { + return c.blockTime +} + +func (c *EVMChainConfig) ChainID() string { + return c.chainID +} + +func (c *EVMChainConfig) NetworkID() string { + return c.networkID +} + +func (c *EVMChainConfig) Confirmations() uint64 { + return c.confirmations +} + +func (c *EVMChainConfig) CollateralBridge() EthereumContract { + return c.collateralBridge +} + +func (c *EVMChainConfig) MultiSigControl() EthereumContract { + return c.multiSigControl +} + +// CheckUntypedEVMChainConfig verifies the `v` parameter is a proto.EVMChainConfig +// struct and check if it's valid. +func CheckUntypedEVMChainConfig(v interface{}, _ interface{}) error { + cfg, err := toEVMChainConfigProto(v) + if err != nil { + return err + } + + return CheckEVMChainConfig(cfg) +} + +// CheckEVMChainConfig verifies the proto.EVMChainConfig is valid. +func CheckEVMChainConfig(cfgs *proto.EVMBridgeConfigs) error { + if len(cfgs.Configs) <= 0 { + return errors.New("missing EVM configurations") + } + + for _, cfgProto := range cfgs.Configs { + if len(cfgProto.NetworkId) == 0 { + return ErrMissingNetworkID + } + + if len(cfgProto.ChainId) == 0 { + return ErrMissingChainID + } + + if cfgProto.Confirmations == 0 { + return ErrConfirmationsMustBeHigherThan0 + } + + noMultiSigControlSetUp := cfgProto.MultisigControlContract == nil || len(cfgProto.MultisigControlContract.Address) == 0 + if noMultiSigControlSetUp { + return ErrMissingMultiSigControlAddress + } + + noCollateralBridgeSetUp := cfgProto.CollateralBridgeContract == nil || len(cfgProto.CollateralBridgeContract.Address) == 0 + if noCollateralBridgeSetUp { + return ErrMissingCollateralBridgeAddress + } + if cfgProto.CollateralBridgeContract.DeploymentBlockHeight != 0 { + return ErrUnsupportedCollateralBridgeDeploymentBlockHeight + } + + if len(cfgProto.BlockTime) != 0 { + _, err := time.ParseDuration(cfgProto.BlockTime) + if err != nil { + return ErrInvalidBlockLengthDuration + } + } + } + + return nil +} + +func toEVMChainConfigProto(v interface{}) (*proto.EVMBridgeConfigs, error) { + cfg, ok := v.(*proto.EVMBridgeConfigs) + if !ok { + return nil, fmt.Errorf("type %q is not a EVMChainConfig proto", vgreflect.TypeName(v)) + } + return cfg, nil +} diff --git a/core/types/event_forwarder_snapshot.go b/core/types/event_forwarder_snapshot.go new file mode 100644 index 0000000000..ccb005a237 --- /dev/null +++ b/core/types/event_forwarder_snapshot.go @@ -0,0 +1,55 @@ +// 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 snapshot "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" + +type PayloadEventForwarder struct { + // keys are deprecated, to be removed after 74 + Keys []string + // Buckets are used with the new upgrade + Buckets []*snapshot.EventForwarderBucket +} + +func (p *PayloadEventForwarder) IntoProto() *snapshot.Payload_EventForwarder { + return &snapshot.Payload_EventForwarder{ + EventForwarder: &snapshot.EventForwarder{ + AckedEvents: p.Keys, + Buckets: p.Buckets, + }, + } +} + +func (*PayloadEventForwarder) isPayload() {} + +func (p *PayloadEventForwarder) plToProto() interface{} { + return p.IntoProto() +} + +func (*PayloadEventForwarder) Key() string { + return "all" +} + +func (p *PayloadEventForwarder) Namespace() SnapshotNamespace { + return EventForwarderSnapshot +} + +func PayloadEventForwarderFromProto(ef *snapshot.Payload_EventForwarder) *PayloadEventForwarder { + return &PayloadEventForwarder{ + Keys: ef.EventForwarder.AckedEvents, + Buckets: ef.EventForwarder.Buckets, + } +} diff --git a/core/types/governance_new_asset.go b/core/types/governance_new_asset.go index 8bf13a98fa..90c065dd1b 100644 --- a/core/types/governance_new_asset.go +++ b/core/types/governance_new_asset.go @@ -66,14 +66,14 @@ func (a ProposalTermsNewAsset) DeepClone() ProposalTerm { } } -func NewNewAssetFromProto(p *vegapb.ProposalTerms_NewAsset) (*ProposalTermsNewAsset, error) { +func NewNewAssetFromProto(p *vegapb.NewAsset) (*ProposalTermsNewAsset, error) { var newAsset *NewAsset - if p.NewAsset != nil { + if p != nil { newAsset = &NewAsset{} - if p.NewAsset.Changes != nil { + if p.Changes != nil { var err error - newAsset.Changes, err = AssetDetailsFromProto(p.NewAsset.Changes) + newAsset.Changes, err = AssetDetailsFromProto(p.Changes) if err != nil { return nil, err } diff --git a/core/types/governance_new_market.go b/core/types/governance_new_market.go index 188d6d7827..7443bceaf6 100644 --- a/core/types/governance_new_market.go +++ b/core/types/governance_new_market.go @@ -988,7 +988,6 @@ func InstrumentConfigurationFromProto( case *vegapb.InstrumentConfiguration_Spot: r.Product = &InstrumentConfigurationSpot{ Spot: &SpotProduct{ - Name: pr.Spot.Name, BaseAsset: pr.Spot.BaseAsset, QuoteAsset: pr.Spot.QuoteAsset, }, diff --git a/core/types/governance_new_market_test.go b/core/types/governance_new_market_test.go index ecd8510b40..e8fc923325 100644 --- a/core/types/governance_new_market_test.go +++ b/core/types/governance_new_market_test.go @@ -160,10 +160,11 @@ func TestNewMarketProposalMapping(t *testing.T) { SlaCompetitionFactor: "0.5", }, LiquidationStrategy: &vegapb.LiquidationStrategy{ - DisposalTimeStep: 300, - DisposalFraction: "0.1", - FullDisposalSize: 20, - MaxFractionConsumed: "0.01", + DisposalTimeStep: 300, + DisposalFraction: "0.1", + FullDisposalSize: 20, + MaxFractionConsumed: "0.01", + DisposalSlippageRange: "0.1", }, TickSize: "1", }, diff --git a/core/types/governance_new_spot_market.go b/core/types/governance_new_spot_market.go index 21b0133deb..d92d4e97d2 100644 --- a/core/types/governance_new_spot_market.go +++ b/core/types/governance_new_spot_market.go @@ -111,8 +111,8 @@ func (n NewSpotMarket) String() string { type NewSpotMarketConfiguration struct { Instrument *InstrumentConfiguration - DecimalPlaces uint64 - PositionDecimalPlaces int64 + PriceDecimalPlaces uint64 + SizeDecimalPlaces int64 Metadata []string PriceMonitoringParameters *PriceMonitoringParameters TargetStakeParameters *TargetStakeParameters @@ -155,8 +155,8 @@ func (n NewSpotMarketConfiguration) IntoProto() *vegapb.NewSpotMarketConfigurati r := &vegapb.NewSpotMarketConfiguration{ Instrument: instrument, - DecimalPlaces: n.DecimalPlaces, - PositionDecimalPlaces: n.PositionDecimalPlaces, + PriceDecimalPlaces: n.PriceDecimalPlaces, + SizeDecimalPlaces: n.SizeDecimalPlaces, Metadata: md, PriceMonitoringParameters: priceMonitoring, TargetStakeParameters: targetStakeParameters, @@ -175,11 +175,11 @@ func (n NewSpotMarketConfiguration) IntoProto() *vegapb.NewSpotMarketConfigurati func (n NewSpotMarketConfiguration) DeepClone() *NewSpotMarketConfiguration { cpy := &NewSpotMarketConfiguration{ - DecimalPlaces: n.DecimalPlaces, - PositionDecimalPlaces: n.PositionDecimalPlaces, - Metadata: make([]string, len(n.Metadata)), - SLAParams: n.SLAParams.DeepClone(), - TickSize: n.TickSize.Clone(), + PriceDecimalPlaces: n.PriceDecimalPlaces, + SizeDecimalPlaces: n.SizeDecimalPlaces, + Metadata: make([]string, len(n.Metadata)), + SLAParams: n.SLAParams.DeepClone(), + TickSize: n.TickSize.Clone(), } cpy.Metadata = append(cpy.Metadata, n.Metadata...) if n.Instrument != nil { @@ -204,8 +204,8 @@ 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)", n.Metadata, - n.DecimalPlaces, - n.PositionDecimalPlaces, + n.PriceDecimalPlaces, + n.SizeDecimalPlaces, stringer.PtrToString(n.Instrument), stringer.PtrToString(n.PriceMonitoringParameters), stringer.PtrToString(n.TargetStakeParameters), @@ -248,8 +248,8 @@ func NewSpotMarketConfigurationFromProto(p *vegapb.NewSpotMarketConfiguration) ( r := &NewSpotMarketConfiguration{ Instrument: instrument, - DecimalPlaces: p.DecimalPlaces, - PositionDecimalPlaces: p.PositionDecimalPlaces, + PriceDecimalPlaces: p.PriceDecimalPlaces, + SizeDecimalPlaces: p.SizeDecimalPlaces, Metadata: md, PriceMonitoringParameters: priceMonitoring, TargetStakeParameters: targetStakeParams, @@ -392,7 +392,6 @@ type SpotProduct struct { func (f SpotProduct) IntoProto() *vegapb.SpotProduct { return &vegapb.SpotProduct{ - Name: f.Name, BaseAsset: f.BaseAsset, QuoteAsset: f.QuoteAsset, } diff --git a/core/types/governance_proposal.go b/core/types/governance_proposal.go index 0bbd445896..048b2b7e38 100644 --- a/core/types/governance_proposal.go +++ b/core/types/governance_proposal.go @@ -129,6 +129,8 @@ const ( ProposalErrorProposalInBatchRejected ProposalError = vegapb.ProposalError_PROPOSAL_ERROR_PROPOSAL_IN_BATCH_REJECTED // ProposalErrorProposalInBatchDeclined is returned when one or more proposals in the batch are rejected. ProposalErrorProposalInBatchDeclined ProposalError = vegapb.ProposalError_PROPOSAL_ERROR_PROPOSAL_IN_BATCH_DECLINED + // ProposalErrorInvalidSizeDecimalPlaces is returned in spot market when the proposed position decimal places is > base asset decimal places. + ProposalErrorInvalidSizeDecimalPlaces = vegapb.ProposalError_PROPOSAL_ERROR_INVALID_SIZE_DECIMAL_PLACES ) type ProposalState = vegapb.Proposal_State @@ -384,6 +386,28 @@ func (bp *BatchProposal) SetProposalParams(params ProposalParameters) { } } +func (p *BatchProposal) WaitForNodeVote() { + p.State = ProposalStateWaitingForNodeVote + for _, v := range p.Proposals { + v.WaitForNodeVote() + } +} + +func (p *BatchProposal) Open() { + p.State = ProposalStateOpen + for _, v := range p.Proposals { + v.Open() + } +} + +func (p *BatchProposal) Reject(reason ProposalError) { + p.State = ProposalStateRejected + p.Reason = reason + for _, v := range p.Proposals { + v.Reject(reason) + } +} + func (bp *BatchProposal) RejectWithErr(reason ProposalError, details error) { bp.ErrorDetails = details.Error() bp.State = ProposalStateRejected @@ -492,6 +516,10 @@ func (p *Proposal) WaitForNodeVote() { p.State = ProposalStateWaitingForNodeVote } +func (p *Proposal) Open() { + p.State = ProposalStateOpen +} + func (p *Proposal) Reject(reason ProposalError) { p.State = ProposalStateRejected p.Reason = reason diff --git a/core/types/governance_proposal_terms.go b/core/types/governance_proposal_terms.go index dd92840f89..e554eba2a8 100644 --- a/core/types/governance_proposal_terms.go +++ b/core/types/governance_proposal_terms.go @@ -322,7 +322,7 @@ func ProposalTermsFromProto(p *vegapb.ProposalTerms) (*ProposalTerms, error) { case *vegapb.ProposalTerms_UpdateNetworkParameter: change = NewUpdateNetworkParameterFromProto(ch.UpdateNetworkParameter) case *vegapb.ProposalTerms_NewAsset: - change, err = NewNewAssetFromProto(ch) + change, err = NewNewAssetFromProto(ch.NewAsset) case *vegapb.ProposalTerms_UpdateAsset: change, err = NewUpdateAssetFromProto(ch.UpdateAsset) case *vegapb.ProposalTerms_NewFreeform: @@ -355,9 +355,10 @@ func ProposalTermsFromProto(p *vegapb.ProposalTerms) (*ProposalTerms, error) { } type BatchProposalChange struct { - ID string - Change ProposalTerm - EnactmentTime int64 + ID string + Change ProposalTerm + EnactmentTime int64 + ValidationTime int64 } type BatchProposalTerms struct { @@ -408,6 +409,8 @@ func (p BatchProposalTerms) changesToProto() []*vegapb.BatchProposalTermsChange termsChange.Change = ch case *vegapb.BatchProposalTermsChange_UpdateAsset: termsChange.Change = ch + case *vegapb.BatchProposalTermsChange_NewAsset: + termsChange.Change = ch case *vegapb.BatchProposalTermsChange_NewFreeform: termsChange.Change = ch case *vegapb.BatchProposalTermsChange_NewTransfer: @@ -467,6 +470,8 @@ func BatchProposalTermsSubmissionFromProto(p *commandspb.BatchProposalSubmission } switch ch := term.Change.(type) { + case *vegapb.BatchProposalTermsChange_NewAsset: + change, err = NewNewAssetFromProto(ch.NewAsset) case *vegapb.BatchProposalTermsChange_NewMarket: change, err = NewNewMarketFromProto(ch.NewMarket) case *vegapb.BatchProposalTermsChange_UpdateMarket: @@ -497,9 +502,10 @@ func BatchProposalTermsSubmissionFromProto(p *commandspb.BatchProposalSubmission } changes = append(changes, BatchProposalChange{ - ID: ids[i], - EnactmentTime: term.EnactmentTimestamp, - Change: change, + ID: ids[i], + EnactmentTime: term.EnactmentTimestamp, + ValidationTime: term.ValidationTimestamp, + Change: change, }) } diff --git a/core/types/governance_update_spot_market.go b/core/types/governance_update_spot_market.go index 83e972c19c..40416dd239 100644 --- a/core/types/governance_update_spot_market.go +++ b/core/types/governance_update_spot_market.go @@ -128,6 +128,8 @@ type UpdateSpotMarketConfiguration struct { RiskParameters updateRiskParams SLAParams *LiquiditySLAParams TickSize *num.Uint + Instrument *InstrumentConfiguration + LiquidityFeeSettings *LiquidityFeeSettings } func (n UpdateSpotMarketConfiguration) String() string { @@ -147,6 +149,10 @@ func (n UpdateSpotMarketConfiguration) DeepClone() *UpdateSpotMarketConfiguratio Metadata: make([]string, len(n.Metadata)), SLAParams: n.SLAParams.DeepClone(), TickSize: n.TickSize.Clone(), + Instrument: &InstrumentConfiguration{ + Code: n.Instrument.Code, + Name: n.Instrument.Name, + }, } cpy.Metadata = append(cpy.Metadata, n.Metadata...) if n.PriceMonitoringParameters != nil { @@ -158,6 +164,10 @@ func (n UpdateSpotMarketConfiguration) DeepClone() *UpdateSpotMarketConfiguratio if n.RiskParameters != nil { cpy.RiskParameters = n.RiskParameters.DeepClone() } + + if n.LiquidityFeeSettings != nil { + cpy.LiquidityFeeSettings = n.LiquidityFeeSettings.DeepClone() + } return cpy } @@ -172,12 +182,22 @@ func (n UpdateSpotMarketConfiguration) IntoProto() *vegapb.UpdateSpotMarketConfi } targetStakeParameters := n.TargetStakeParameters.IntoProto() + var liquidityFeeSettings *vegapb.LiquidityFeeSettings + if n.LiquidityFeeSettings != nil { + liquidityFeeSettings = n.LiquidityFeeSettings.IntoProto() + } + r := &vegapb.UpdateSpotMarketConfiguration{ Metadata: md, PriceMonitoringParameters: priceMonitoring, TargetStakeParameters: targetStakeParameters, SlaParams: n.SLAParams.IntoProto(), TickSize: n.TickSize.String(), + Instrument: &vegapb.UpdateSpotInstrumentConfiguration{ + Code: n.Instrument.Code, + Name: n.Instrument.Name, + }, + LiquidityFeeSettings: liquidityFeeSettings, } switch rp := riskParams.(type) { case *vegapb.UpdateSpotMarketConfiguration_Simple: @@ -210,6 +230,11 @@ func UpdateSpotMarketConfigurationFromProto(p *vegapb.UpdateSpotMarketConfigurat TargetStakeParameters: targetStakeParameters, SLAParams: slaParams, TickSize: tickSize, + LiquidityFeeSettings: LiquidityFeeSettingsFromProto(p.LiquidityFeeSettings), + Instrument: &InstrumentConfiguration{ + Name: p.Instrument.Name, + Code: p.Instrument.Code, + }, } if p.RiskParameters != nil { switch rp := p.RiskParameters.(type) { diff --git a/core/types/liquidation.go b/core/types/liquidation.go index 8a57cb4abb..1e765db7c6 100644 --- a/core/types/liquidation.go +++ b/core/types/liquidation.go @@ -28,6 +28,7 @@ type LiquidationStrategy struct { DisposalFraction num.Decimal FullDisposalSize uint64 MaxFractionConsumed num.Decimal + DisposalSlippage num.Decimal // this has to be a pointer for the time being, with the need to default to 0.1 } type LiquidationNode struct { @@ -71,6 +72,10 @@ func (l *LiquidationNode) IntoProto() *snapshot.Liquidation { } func PayloadLiquidationNodeFromProto(p *snapshot.Payload_Liquidation) *LiquidationNode { + // @NOTE this is here only for the protocol upgrade + if p.Liquidation.Config != nil && p.Liquidation.Config.DisposalSlippageRange == "" { + p.Liquidation.Config.DisposalSlippageRange = "0" + } node, err := LiquidationSnapshotFromProto(p.Liquidation) if err != nil { // @TODO figure out what to do with this error @@ -109,20 +114,33 @@ func LiquidationStrategyFromProto(p *vegapb.LiquidationStrategy) (*LiquidationSt if err != nil { return nil, err } + if p.DisposalSlippageRange == "" { + p.DisposalSlippageRange = "0" + } + slippage, err := num.DecimalFromString(p.DisposalSlippageRange) + if err != nil { + return nil, err + } return &LiquidationStrategy{ DisposalTimeStep: time.Second * time.Duration(p.DisposalTimeStep), DisposalFraction: df, FullDisposalSize: p.FullDisposalSize, MaxFractionConsumed: mfc, + DisposalSlippage: slippage, }, nil } func (l *LiquidationStrategy) IntoProto() *vegapb.LiquidationStrategy { + slip := "" + if !l.DisposalSlippage.IsZero() { + slip = l.DisposalSlippage.String() + } return &vegapb.LiquidationStrategy{ - DisposalTimeStep: int64(l.DisposalTimeStep / time.Second), - DisposalFraction: l.DisposalFraction.String(), - FullDisposalSize: l.FullDisposalSize, - MaxFractionConsumed: l.MaxFractionConsumed.String(), + DisposalTimeStep: int64(l.DisposalTimeStep / time.Second), + DisposalFraction: l.DisposalFraction.String(), + FullDisposalSize: l.FullDisposalSize, + MaxFractionConsumed: l.MaxFractionConsumed.String(), + DisposalSlippageRange: slip, } } diff --git a/core/types/market.go b/core/types/market.go index 636b0294f4..cd6f74a467 100644 --- a/core/types/market.go +++ b/core/types/market.go @@ -389,7 +389,6 @@ type Spot struct { func SpotFromProto(s *vegapb.Spot) *Spot { return &Spot{ - Name: s.Name, BaseAsset: s.BaseAsset, QuoteAsset: s.QuoteAsset, } @@ -397,7 +396,6 @@ func SpotFromProto(s *vegapb.Spot) *Spot { func (s Spot) IntoProto() *vegapb.Spot { return &vegapb.Spot{ - Name: s.Name, BaseAsset: s.BaseAsset, QuoteAsset: s.QuoteAsset, } diff --git a/core/types/matching.go b/core/types/matching.go index ce3e5a40dc..9cfe1147e0 100644 --- a/core/types/matching.go +++ b/core/types/matching.go @@ -408,7 +408,7 @@ func (o *Order) amendSizeWithDelta(delta int64) { } // ApplyOrderAmendment assumes the amendment have been validated before. -func (o *Order) ApplyOrderAmendment(amendment *OrderAmendment, updatedAtNano int64, priceFactor *num.Uint) (order *Order, err error) { +func (o *Order) ApplyOrderAmendment(amendment *OrderAmendment, updatedAtNano int64, priceFactor num.Decimal) (order *Order, err error) { order = o.Clone() order.UpdatedAt = updatedAtNano order.Version++ @@ -422,8 +422,7 @@ func (o *Order) ApplyOrderAmendment(amendment *OrderAmendment, updatedAtNano int var amendPrice *num.Uint if amendment.Price != nil { - amendPrice = amendment.Price.Clone() - amendPrice.Mul(amendPrice, priceFactor) + amendPrice, _ = num.UintFromDecimal(amendment.Price.ToDecimal().Mul(priceFactor)) } // apply price changes if amendment.Price != nil && o.Price.NEQ(amendPrice) { diff --git a/core/types/multisig.go b/core/types/multisig.go index 059e873d42..5147e1edba 100644 --- a/core/types/multisig.go +++ b/core/types/multisig.go @@ -40,6 +40,7 @@ type SignerEvent struct { Address string Nonce string BlockTime int64 + ChainID string Kind SignerEventKind } @@ -63,7 +64,7 @@ func (s SignerEvent) Hash() string { func SignerEventFromSignerAddedProto( s *vgproto.ERC20SignerAdded, blockNumber, logIndex uint64, - txhash, id string, + txhash, id, chainID string, ) (*SignerEvent, error) { return &SignerEvent{ ID: id, @@ -74,6 +75,7 @@ func SignerEventFromSignerAddedProto( Nonce: s.Nonce, Kind: SignerEventKindAdded, BlockTime: s.BlockTime, + ChainID: chainID, }, nil } @@ -89,6 +91,7 @@ func SignerEventFromEventProto( Nonce: event.Nonce, Kind: event.Type, BlockTime: event.BlockTime, + ChainID: event.ChainId, } } @@ -102,12 +105,13 @@ func (s *SignerEvent) IntoProto() *eventspb.ERC20MultiSigSignerEvent { TxHash: s.TxHash, BlockNumber: s.BlockNumber, LogIndex: s.LogIndex, + ChainId: s.ChainID, } } func (s *SignerEvent) String() string { return fmt.Sprintf( - "blockNumber(%v) txHash(%s) ID(%s) address(%s) nonce(%s) blockTime(%v) kind(%s) ", + "blockNumber(%v) txHash(%s) ID(%s) address(%s) nonce(%s) blockTime(%v) kind(%s) chainID(%s)", s.BlockNumber, s.TxHash, s.ID, @@ -115,13 +119,14 @@ func (s *SignerEvent) String() string { s.Nonce, s.BlockTime, s.Kind.String(), + s.ChainID, ) } func SignerEventFromSignerRemovedProto( s *vgproto.ERC20SignerRemoved, blockNumber, logIndex uint64, - txhash, id string, + txhash, id, chainID string, ) (*SignerEvent, error) { return &SignerEvent{ ID: id, @@ -132,6 +137,7 @@ func SignerEventFromSignerRemovedProto( Nonce: s.Nonce, Kind: SignerEventKindRemoved, BlockTime: s.BlockTime, + ChainID: chainID, }, nil } @@ -143,6 +149,7 @@ type SignerThresholdSetEvent struct { Threshold uint32 Nonce string BlockTime int64 + ChainID string } func (s SignerThresholdSetEvent) Hash() string { @@ -157,7 +164,7 @@ func (s SignerThresholdSetEvent) Hash() string { func SignerThresholdSetEventFromProto( s *vgproto.ERC20ThresholdSet, blockNumber, logIndex uint64, - txhash, id string, + txhash, id, chainID string, ) (*SignerThresholdSetEvent, error) { return &SignerThresholdSetEvent{ ID: id, @@ -167,6 +174,7 @@ func SignerThresholdSetEventFromProto( Threshold: s.NewThreshold, Nonce: s.Nonce, BlockTime: s.BlockTime, + ChainID: chainID, }, nil } @@ -181,6 +189,7 @@ func SignerThresholdSetEventFromEventProto( Threshold: event.NewThreshold, Nonce: event.Nonce, BlockTime: event.BlockTime, + ChainID: event.ChainId, } } @@ -193,12 +202,13 @@ func (s *SignerThresholdSetEvent) IntoProto() *eventspb.ERC20MultiSigThresholdSe TxHash: s.TxHash, BlockNumber: s.BlockNumber, LogIndex: s.LogIndex, + ChainId: s.ChainID, } } func (s *SignerThresholdSetEvent) String() string { return fmt.Sprintf( - "ID(%s) blockNumber(%v) logIndex(%v) txHash(%s) threshold(%v) nonce(%s) blockTime(%v)", + "ID(%s) blockNumber(%v) logIndex(%v) txHash(%s) threshold(%v) nonce(%s) blockTime(%v) chainID(%s)", s.ID, s.BlockNumber, s.LogIndex, @@ -206,5 +216,6 @@ func (s *SignerThresholdSetEvent) String() string { s.Threshold, s.Nonce, s.BlockTime, + s.ChainID, ) } diff --git a/core/types/proposal_data_test.go b/core/types/proposal_data_test.go new file mode 100644 index 0000000000..378258cc52 --- /dev/null +++ b/core/types/proposal_data_test.go @@ -0,0 +1,21692 @@ +// 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 ( + "fmt" + "log" + "testing" + + "code.vegaprotocol.io/vega/core/types" + snapshotpb "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" + + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/encoding/protojson" +) + +func unmarshalGovernanceEnacted(t *testing.T, jsonStr string) (*snapshotpb.GovernanceEnacted, error) { + t.Helper() + pb := snapshotpb.Payload{} + unmarshaler := protojson.UnmarshalOptions{ + AllowPartial: true, + DiscardUnknown: true, + } + err := unmarshaler.Unmarshal([]byte(jsonStr), &pb) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal JSON to proto: %w", err) + } + return pb.GetGovernanceEnacted(), nil +} + +func TestMarshalling(t *testing.T) { + jsonStr := `{ + "governanceEnacted": { + "proposals": [ + { + "proposal": { + "id": "b844aacfe0c6a5db17c1a65164a6c4418f9cc4c5d0e29eed28811487befd296b", + "reference": "SyW1TPPG2tGWkWV8Msr4b7W2l67b152zO7DuiMwH", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1688142755690838874", + "terms": { + "closingTimestamp": "1689767298", + "enactmentTimestamp": "1689767313", + "newMarket": { + "changes": { + "instrument": { + "name": "ETHDAI Monthly (Jul 2023)", + "code": "ETHDAI.MF21", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "DAI", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.ETH.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.ETH.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.ETH.value", + "tradingTerminationProperty": "termination.ETH.value" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:4BC6D2154BE74E1F", + "base:ETH", + "quote:DAI", + "class:fx/crypto", + "monthly", + "sector:defi", + "auto:ethdai" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.01, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.3 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.1", + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New ETHDAI market", + "title": "New ETHDAI market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + } + }, + { + "proposal": { + "id": "b66cd4be223dfd900a4750bb5175e17d8f678996877d262be4c749a99e22a970", + "reference": "dE6VwMjuVW9SV6Mj5bp2HtJ5Tw3FMHjYHezLH7Jk", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1688142755690838874", + "terms": { + "closingTimestamp": "1689767298", + "enactmentTimestamp": "1689767313", + "newMarket": { + "changes": { + "instrument": { + "name": "Tesla Quarterly (Sep 2023)", + "code": "TSLA.QM21", + "future": { + "settlementAsset": "177e8f6c25a955bd18475084b99b2b1d37f28f3dec393fab7755a7e69c3d8c3b", + "quoteName": "EURO", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.TSLA.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.TSLA.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.TSLA.value", + "tradingTerminationProperty": "termination.TSLA.value" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:5A86B190C384997F", + "quote:EURO", + "ticker:TSLA", + "class:equities/single-stock-futures", + "sector:tech", + "listing_venue:NASDAQ", + "country:US", + "auto:tsla" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.01, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.8 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.1", + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New EURO market", + "title": "New EURO market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + } + }, + { + "proposal": { + "id": "24df2940a2617b78b4e9f64c6508e4d5d509151a6321a3244a11e1d9859e7cb1", + "reference": "Z0BxjyvsX7nOeItoHc0uYZ4igGXXPDBFUW08Ogxf", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1688142755690838874", + "terms": { + "closingTimestamp": "1689767298", + "enactmentTimestamp": "1689767313", + "newMarket": { + "changes": { + "instrument": { + "name": "Apple Monthly (Jul 2023)", + "code": "AAPL.MF21", + "future": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.AAPL.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.AAPL.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.AAPL.value", + "tradingTerminationProperty": "termination.AAPL.value" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:4899E01009F1A721", + "quote:USD", + "ticker:AAPL", + "class:equities/single-stock-futures", + "sector:tech", + "listing_venue:NASDAQ", + "country:US", + "auto:aapl" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.1, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.3 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.1", + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New USD market", + "title": "New USD market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + } + }, + { + "proposal": { + "id": "d780eeb28a3a6e3a047019ca68e510dbe53f57b13eb33c9385221d128e218fce", + "reference": "j4cdF8jMYstOfpFUKlj607A34ZdsDWOhFLgMqs0w", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1688142755690838874", + "terms": { + "closingTimestamp": "1689767298", + "enactmentTimestamp": "1689767313", + "newMarket": { + "changes": { + "instrument": { + "name": "UNIDAI Monthly (Jul 2023)", + "code": "UNIDAI.MF21", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "DAI", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.UNI.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.UNI.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.UNI.value", + "tradingTerminationProperty": "termination.UNI.value" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:3C58ED2A4A6C5D7E", + "base:UNI", + "quote:DAI", + "class:fx/crypto", + "monthly", + "sector:defi", + "auto:unidai" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.01, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.5 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.1", + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New DAI market", + "title": "New DAI market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + } + }, + { + "proposal": { + "id": "38a4aa08cc0ff0da92ab7d0951de999b0ee0f81029f452b8cf77fb4c300dbd41", + "reference": "A3rN5PTedEe7ydRU2uoayABRjoOgC9G2IusMTnEo", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1688142755690838874", + "terms": { + "closingTimestamp": "1689767298", + "enactmentTimestamp": "1689767313", + "newMarket": { + "changes": { + "instrument": { + "name": "ETHBTC Quarterly (Sep 2023)", + "code": "ETHBTC.QM21", + "future": { + "settlementAsset": "cee709223217281d7893b650850ae8ee8a18b7539b5658f9b4cc24de95dd18ad", + "quoteName": "BTC", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.ETH.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.ETH.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.ETH.value", + "tradingTerminationProperty": "termination.ETH.value" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:1F0BB6EB5703B099", + "base:ETH", + "quote:BTC", + "class:fx/crypto", + "quarterly", + "sector:crypto", + "auto:ethbtc" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.01, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.3 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.1", + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New BTC market", + "title": "New BTC market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + } + }, + { + "proposal": { + "id": "c1cb93afe500f2ce3f68ab8a083cd440bd15f037fa5a64a1e65be40975b09f4d", + "reference": "yl2383kpvQxyuAH7HJLBaHzg3bTFwf44rXfMeilr", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1688142755690838874", + "terms": { + "closingTimestamp": "1689767298", + "enactmentTimestamp": "1689767313", + "newMarket": { + "changes": { + "instrument": { + "name": "AAVEDAI Monthly (Jul 2023)", + "code": "AAVEDAI.MF21", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "DAI", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.AAVE.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.AAVE.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.AAVE.value", + "tradingTerminationProperty": "termination.AAVE.value" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:2839D9B2329C9E70", + "base:AAVE", + "quote:DAI", + "class:fx/crypto", + "monthly", + "sector:defi", + "auto:aavedai" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.01, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.5 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.1", + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New DAI market", + "title": "New DAI market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + } + }, + { + "proposal": { + "id": "0776fbdef4ee2fd13784875ae61b48f1b3ab554b65e3304828bb926d7f19922f", + "reference": "SCGFvul0tJbShyq1UsnPxS7LZ5OyMmFnFLxpAAvy", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1688142755690838874", + "terms": { + "closingTimestamp": "1689767298", + "enactmentTimestamp": "1689767313", + "newMarket": { + "changes": { + "instrument": { + "name": "BTCUSD Monthly (Jul 2023)", + "code": "BTCUSD.MF21", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.BTC.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.BTC.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.BTC.value", + "tradingTerminationProperty": "termination.BTC.value" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:076BB86A5AA41E3E", + "base:BTC", + "quote:USD", + "class:fx/crypto", + "monthly", + "sector:crypto", + "auto:btcusd" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + }, + { + "horizon": "300", + "probability": "0.9999", + "auctionExtension": "60" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.0001, + "tau": 0.0000190129, + "params": { + "r": 0.016, + "sigma": 1.25 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.1", + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New BTCUSD Market", + "title": "New BTCUSD market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + } + }, + { + "proposal": { + "id": "4bd471659ae3e63e6671f10778c4cf801533b146dbb33c7aa3ab9ea90fd05320", + "reference": "Test Successsor Market 2", + "partyId": "2e1ef32e5804e14232406aebaad719087d326afa5c648b7824d0823d8a46c8d1", + "state": "STATE_ENACTED", + "timestamp": "1689230479296530529", + "terms": { + "closingTimestamp": "1689767298", + "enactmentTimestamp": "1689768198", + "newMarket": { + "changes": { + "instrument": { + "name": "Test Successsor Market 2", + "code": "Test Successsor Market 2", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "DAI", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "ethAddress": { + "address": "0xfCEAdAFab14d46e20144F48824d0C09B1a03F2BC" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.ETH.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "6" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + }, + { + "key": { + "name": "prices.ETH.timestamp", + "type": "TYPE_TIMESTAMP" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "1693382400" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "internal": { + "time": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "1693382400" + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.ETH.value", + "tradingTerminationProperty": "vegaprotocol.builtin.timestamp" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "base:BTC", + "quote:DAI", + "class:fx/crypto", + "quarterly", + "sector:defi", + "enactment:2023-08-23T14:00:00Z", + "settlement:2023-08-30T08:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "3600", + "probability": "0.9999", + "auctionExtension": "120" + }, + { + "horizon": "14400", + "probability": "0.9999", + "auctionExtension": "180" + }, + { + "horizon": "43200", + "probability": "0.9999", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 1 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0001140771161, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "successor": { + "parentMarketId": "d780eeb28a3a6e3a047019ca68e510dbe53f57b13eb33c9385221d128e218fce", + "insurancePoolFraction": "1" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Success success success!!!", + "title": "Test successor market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + } + }, + { + "proposal": { + "id": "707c17dd2817521233e77b109f8f8aa65b8bd1148ea6a252e736677ea2e0f35c", + "reference": "injected_at_runtime", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1689253863379357172", + "terms": { + "closingTimestamp": "1689767298", + "enactmentTimestamp": "1689767358", + "newMarket": { + "changes": { + "instrument": { + "name": "XX tDAI TERM", + "code": "XX/tDAI TERM", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.BTC.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "5" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "trading.terminated.BTC-term", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.BTC.value", + "tradingTerminationProperty": "trading.terminated.BTC-term" + } + } + }, + "decimalPlaces": "2", + "metadata": [ + "base:BTC", + "quote:USDT", + "class:fx/crypto", + "monthly", + "sector:defi", + "enactment:2023-05-15T13:25:00Z", + "settlement:2023-05-15T14:25:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "720", + "probability": "0.99", + "auctionExtension": "60" + }, + { + "horizon": "3600", + "probability": "0.99", + "auctionExtension": "120" + }, + { + "horizon": "14400", + "probability": "0.99", + "auctionExtension": "180" + }, + { + "horizon": "43200", + "probability": "0.99", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.5 + } + }, + "logNormal": { + "riskAversionParameter": 0.001, + "tau": 0.00001901285269, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "tickSize": "1" + } + } + }, + "rationale": { + "description": "# Summary\n\nThis proposal requests to list XX as a market with ($XX) as a settlement asset on the Vega Network as discussed in: https://community.vega.xyz/.\n\n# Rationale\n\n- XX is the largest Crypto asset with the highest volume and Marketcap.\n- Given the price, 2 decimal places will be used for price\n- Position decimal places will be set to 4 considering the value per contract\n- The settlement asset chosen is the largest by trading volume", + "title": "XX tDAI TERM" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + } + }, + { + "proposal": { + "id": "749e5924010353243dc3423bf3bf7edcca312239d91a4bbe2e987646154470d0", + "partyId": "2e1ef32e5804e14232406aebaad719087d326afa5c648b7824d0823d8a46c8d1", + "state": "STATE_ENACTED", + "timestamp": "1689255668155592706", + "terms": { + "closingTimestamp": "1689767298", + "enactmentTimestamp": "1689767598", + "newMarket": { + "changes": { + "instrument": { + "name": "Test Successor Market 4", + "code": "Test Successor Market 4", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "DAI", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "ethAddress": { + "address": "0x973cB2a51F83a707509fe7cBafB9206982E1c3ad" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.ETH.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "6" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + }, + { + "key": { + "name": "prices.ETH.timestamp", + "type": "TYPE_TIMESTAMP" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "1688738871" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "internal": { + "time": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "1691572666" + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.ETH.value", + "tradingTerminationProperty": "vegaprotocol.builtin.timestamp" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "enactment:2023-07-30T11:48:47Z", + "settlement:2023-07-30T11:48:47Z", + "source:docs.vega.xyz" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.01, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.5 + } + }, + "positionDecimalPlaces": "5", + "linearSlippageFactor": "0.001", + "successor": { + "parentMarketId": "4bd471659ae3e63e6671f10778c4cf801533b146dbb33c7aa3ab9ea90fd05320", + "insurancePoolFraction": "1" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "An example proposal to add Lorem Ipsum market", + "title": "Add Lorem Ipsum market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + } + }, + { + "proposal": { + "id": "370751c99dee8d4ef0f2481f767800d9f9e0a0bfd466ae32b0e97a47e53dd860", + "reference": "YY SUCCESSOR Market C4", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1689264962341903110", + "terms": { + "closingTimestamp": "1689767298", + "enactmentTimestamp": "1689767358", + "newMarket": { + "changes": { + "instrument": { + "name": "Market YY SUCCESSOR", + "code": "Market YY SUCCESSOR", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.BTC2.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "5" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "trading.terminated.BTC2", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.BTC2.value", + "tradingTerminationProperty": "trading.terminated.BTC2" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "base:ETH", + "quote:USDT", + "class:fx/crypto", + "quarterly", + "sector:defi", + "enactment:2023-05-23T14:00:00Z", + "settlement:2023-06-30T08:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "3600", + "probability": "0.9999", + "auctionExtension": "120" + }, + { + "horizon": "14400", + "probability": "0.9999", + "auctionExtension": "180" + }, + { + "horizon": "43200", + "probability": "0.9999", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 1 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0001140771161, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "successor": { + "parentMarketId": "707c17dd2817521233e77b109f8f8aa65b8bd1148ea6a252e736677ea2e0f35c", + "insurancePoolFraction": "1" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\n YY SUCCESSOR MARKET C4 This proposal requests to list BTC/USDT-230630 as a market with USDT as a settlement asset on the Vega Network as discussed in: https://community.vega.xyz/.\n\n## Rationale\n\n- BTC is the largest Crypto asset with the highest volume and Marketcap.\n- Given the price, 1 decimal places will be used for price due to the number of valid digits in asset price. \n- Position decimal places will be set to 4 considering the value per contract\n- USDT is chosen as settlement asset due to its stability.-success", + "title": "YY SUCCESSOR -001 - Create market - Market C4 Future - 2023/06/30 -success" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + } + }, + { + "proposal": { + "id": "c4fb2668061f0e660009413d1a7073cd73ccbbe5e821a3597df2db51fea4189e", + "reference": "YY SUCCESSOR Enact Last voting end 1st", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_PASSED", + "timestamp": "1689266245054453580", + "terms": { + "closingTimestamp": "1689767298", + "enactmentTimestamp": "1689770358", + "newMarket": { + "changes": { + "instrument": { + "name": "YY SUCCESSOR Enact Last voting end 1st", + "code": "YY SUCCESSOR Enact Last voting end 1st", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.BTC3.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "5" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "trading.terminated.BTC3", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.BTC3.value", + "tradingTerminationProperty": "trading.terminated.BTC3" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "base:ETH", + "quote:USDT", + "class:fx/crypto", + "quarterly", + "sector:defi", + "enactment:2023-05-23T14:00:00Z", + "settlement:2023-06-30T08:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "3600", + "probability": "0.9999", + "auctionExtension": "120" + }, + { + "horizon": "14400", + "probability": "0.9999", + "auctionExtension": "180" + }, + { + "horizon": "43200", + "probability": "0.9999", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 1 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0001140771161, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "successor": { + "parentMarketId": "370751c99dee8d4ef0f2481f767800d9f9e0a0bfd466ae32b0e97a47e53dd860", + "insurancePoolFraction": "1" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\n YY SUCCESSOR lasst enactment first vote end This proposal requests to list BTC/USDT-230630 as a market with USDT as a settlement asset on the Vega Network as discussed in: https://community.vega.xyz/.\n\n## Rationale\n\n- BTC is the largest Crypto asset with the highest volume and Marketcap.\n- Given the price, 1 decimal places will be used for price due to the number of valid digits in asset price. \n- Position decimal places will be set to 4 considering the value per contract\n- USDT is chosen as settlement asset due to its stability.-success", + "title": "YY SUCCESSOR last enact vote end 1st -001 - Create market - Market C4 Future - 2023/06/30 -success" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + } + }, + { + "proposal": { + "id": "f7062e14d1199e026b390f44fcd3ed590d65954dad92f14ac24dedba63a75729", + "reference": "YY SUCCESSOR Enacting 1st", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_PASSED", + "timestamp": "1689266260574252071", + "terms": { + "closingTimestamp": "1689767298", + "enactmentTimestamp": "1689767538", + "newMarket": { + "changes": { + "instrument": { + "name": "YY SUCCESSOR 1st enactment", + "code": "YY SUCCESSOR 1st enactment", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.BTC3.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "5" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "trading.terminated.BTC3", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.BTC3.value", + "tradingTerminationProperty": "trading.terminated.BTC3" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "base:ETH", + "quote:USDT", + "class:fx/crypto", + "quarterly", + "sector:defi", + "enactment:2023-05-23T14:00:00Z", + "settlement:2023-06-30T08:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "3600", + "probability": "0.9999", + "auctionExtension": "120" + }, + { + "horizon": "14400", + "probability": "0.9999", + "auctionExtension": "180" + }, + { + "horizon": "43200", + "probability": "0.9999", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 1 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0001140771161, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "successor": { + "parentMarketId": "370751c99dee8d4ef0f2481f767800d9f9e0a0bfd466ae32b0e97a47e53dd860", + "insurancePoolFraction": "1" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\n YY SUCCESSOR 1st enactment This proposal requests to list BTC/USDT-230630 as a market with USDT as a settlement asset on the Vega Network as discussed in: https://community.vega.xyz/.\n\n## Rationale\n\n- BTC is the largest Crypto asset with the highest volume and Marketcap.\n- Given the price, 1 decimal places will be used for price due to the number of valid digits in asset price. \n- Position decimal places will be set to 4 considering the value per contract\n- USDT is chosen as settlement asset due to its stability.-success", + "title": "YY SUCCESSOR 1st enactment -001 - Create market - Market C4 Future - 2023/06/30 -success" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + } + }, + { + "proposal": { + "id": "c97084bde81e07fdcb3b5c67cf9c9457567ba57f5bf4ee84d675c11e9fb0c3ce", + "reference": "YY SUCCESSOR Enacting second", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_PASSED", + "timestamp": "1689266342785990755", + "terms": { + "closingTimestamp": "1689767298", + "enactmentTimestamp": "1689768018", + "newMarket": { + "changes": { + "instrument": { + "name": "YY SUCCESSOR 2nd enactment", + "code": "YY SUCCESSOR 2nd enactment", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.BTC3.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "5" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "trading.terminated.BTC3", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.BTC3.value", + "tradingTerminationProperty": "trading.terminated.BTC3" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "base:ETH", + "quote:USDT", + "class:fx/crypto", + "quarterly", + "sector:defi", + "enactment:2023-05-23T14:00:00Z", + "settlement:2023-06-30T08:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "3600", + "probability": "0.9999", + "auctionExtension": "120" + }, + { + "horizon": "14400", + "probability": "0.9999", + "auctionExtension": "180" + }, + { + "horizon": "43200", + "probability": "0.9999", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 1 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0001140771161, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "successor": { + "parentMarketId": "370751c99dee8d4ef0f2481f767800d9f9e0a0bfd466ae32b0e97a47e53dd860", + "insurancePoolFraction": "1" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\n YY SUCCESSOR 2nd enactment This proposal requests to list BTC/USDT-230630 as a market with USDT as a settlement asset on the Vega Network as discussed in: https://community.vega.xyz/.\n\n## Rationale\n\n- BTC is the largest Crypto asset with the highest volume and Marketcap.\n- Given the price, 1 decimal places will be used for price due to the number of valid digits in asset price. \n- Position decimal places will be set to 4 considering the value per contract\n- USDT is chosen as settlement asset due to its stability.-success", + "title": "YY SUCCESSOR 2nd enactment -001 - Create market - Market C4 Future - 2023/06/30 -success" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + } + }, + { + "proposal": { + "id": "b37d4ad5cd7561cbf16859325f8baf58d96a3cb3c9cb6726621e2a1dc0f30801", + "reference": "injected_at_runtime", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1689775672681753985", + "terms": { + "closingTimestamp": "1689776065", + "enactmentTimestamp": "1689776125", + "newMarket": { + "changes": { + "instrument": { + "name": "ZZ1 tDAI TERM", + "code": "ZZ1/tDAI TERM", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.BTC.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "5" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "trading.terminated.ZZ1", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.BTC.value", + "tradingTerminationProperty": "trading.terminated.ZZ1" + } + } + }, + "decimalPlaces": "2", + "metadata": [ + "base:BTC", + "quote:USDT", + "class:fx/crypto", + "monthly", + "sector:defi", + "enactment:2023-05-15T13:25:00Z", + "settlement:2023-05-15T14:25:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "720", + "probability": "0.99", + "auctionExtension": "60" + }, + { + "horizon": "3600", + "probability": "0.99", + "auctionExtension": "120" + }, + { + "horizon": "14400", + "probability": "0.99", + "auctionExtension": "180" + }, + { + "horizon": "43200", + "probability": "0.99", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.5 + } + }, + "logNormal": { + "riskAversionParameter": 0.001, + "tau": 0.00001901285269, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "tickSize": "1" + } + } + }, + "rationale": { + "description": "# Summary\n\nThis proposal requests to list ZZ1 as a market with ($ZZ1) as a settlement asset on the Vega Network as discussed in: https://community.vega.xyz/.\n\n# Rationale\n\n- XX is the largest Crypto asset with the highest volume and Marketcap.\n- Given the price, 2 decimal places will be used for price\n- Position decimal places will be set to 4 considering the value per contract\n- The settlement asset chosen is the largest by trading volume", + "title": "ZZ1 tDAI TERM" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "b37d4ad5cd7561cbf16859325f8baf58d96a3cb3c9cb6726621e2a1dc0f30801", + "timestamp": "1689775712592319057", + "totalGovernanceTokenBalance": "5000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "b6755a98db5b7376a3ed836d65e75b5bb99bbb4a8f3b2b88edbc93cb942ee6a4", + "reference": "ZZ3 SUCCESSOR Enacting 1st", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1689776134227266289", + "terms": { + "closingTimestamp": "1689776699", + "enactmentTimestamp": "1689776759", + "newMarket": { + "changes": { + "instrument": { + "name": "ZZ3 SUCCESSOR 1st enactment", + "code": "ZZ3 SUCCESSOR 1st enactment", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.BTC3.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "5" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "trading.terminated.ZZ3", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.BTC3.value", + "tradingTerminationProperty": "trading.terminated.ZZ3" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "base:ETH", + "quote:USDT", + "class:fx/crypto", + "quarterly", + "sector:defi", + "enactment:2023-05-23T14:00:00Z", + "settlement:2023-06-30T08:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "3600", + "probability": "0.9999", + "auctionExtension": "120" + }, + { + "horizon": "14400", + "probability": "0.9999", + "auctionExtension": "180" + }, + { + "horizon": "43200", + "probability": "0.9999", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 1 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0001140771161, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "successor": { + "parentMarketId": "b37d4ad5cd7561cbf16859325f8baf58d96a3cb3c9cb6726621e2a1dc0f30801", + "insurancePoolFraction": "1" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\n ZZ3 SUCCESSOR 1st enactment This proposal requests to list BTC/USDT-230630 as a market with USDT as a settlement asset on the Vega Network as discussed in: https://community.vega.xyz/.\n\n## Rationale\n\n- BTC is the largest Crypto asset with the highest volume and Marketcap.\n- Given the price, 1 decimal places will be used for price due to the number of valid digits in asset price. \n- Position decimal places will be set to 4 considering the value per contract\n- USDT is chosen as settlement asset due to its stability.-success", + "title": "ZZ3 SUCCESSOR 1st enactment -001 - Create market - Market C4 Future - 2023/06/30 -success" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "b6755a98db5b7376a3ed836d65e75b5bb99bbb4a8f3b2b88edbc93cb942ee6a4", + "timestamp": "1689776221222639218", + "totalGovernanceTokenBalance": "5000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "bbbf50bdf026e40e3663cbe9e9df25b0dae9f43b2ef000ccb3b3c63c8d3a9280", + "reference": "injected_at_runtime", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1689780899487249272", + "terms": { + "closingTimestamp": "1689781222", + "enactmentTimestamp": "1689784822", + "newMarket": { + "changes": { + "instrument": { + "name": "ZZ5 tDAI TERM", + "code": "ZZ5/tDAI TERM", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.BTC.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "5" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "trading.terminated.ZZ5", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.BTC.value", + "tradingTerminationProperty": "trading.terminated.ZZ5" + } + } + }, + "decimalPlaces": "2", + "metadata": [ + "base:BTC", + "quote:USDT", + "class:fx/crypto", + "monthly", + "sector:defi", + "enactment:2023-05-15T13:25:00Z", + "settlement:2023-05-15T14:25:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "720", + "probability": "0.99", + "auctionExtension": "60" + }, + { + "horizon": "3600", + "probability": "0.99", + "auctionExtension": "120" + }, + { + "horizon": "14400", + "probability": "0.99", + "auctionExtension": "180" + }, + { + "horizon": "43200", + "probability": "0.99", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.5 + } + }, + "logNormal": { + "riskAversionParameter": 0.001, + "tau": 0.00001901285269, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "tickSize": "1" + } + } + }, + "rationale": { + "description": "# Summary\n\nThis proposal requests to list ZZ5 as a market with ($ZZ1) as a settlement asset on the Vega Network as discussed in: https://community.vega.xyz/.\n\n# Rationale\n\n- XX is the largest Crypto asset with the highest volume and Marketcap.\n- Given the price, 2 decimal places will be used for price\n- Position decimal places will be set to 4 considering the value per contract\n- The settlement asset chosen is the largest by trading volume", + "title": "ZZ5 tDAI TERM" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "bbbf50bdf026e40e3663cbe9e9df25b0dae9f43b2ef000ccb3b3c63c8d3a9280", + "timestamp": "1689781055163365268", + "totalGovernanceTokenBalance": "5000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "edf9aa407a79da28f612637131d03d2264cdd16f4fe33bb8e0479b7185756d06", + "reference": "ZZ6 SUCCESSOR Enacting second", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1689785219703502195", + "terms": { + "closingTimestamp": "1689785735", + "enactmentTimestamp": "1689787535", + "newMarket": { + "changes": { + "instrument": { + "name": "ZZ6 SUCCESSOR 2nd enactment", + "code": "ZZ6 SUCCESSOR 2nd enactment", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.BTC3.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "5" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "trading.terminated.ZZ6", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.BTC3.value", + "tradingTerminationProperty": "trading.terminated.ZZ6" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "base:ETH", + "quote:USDT", + "class:fx/crypto", + "quarterly", + "sector:defi", + "enactment:2023-05-23T14:00:00Z", + "settlement:2023-06-30T08:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "3600", + "probability": "0.9999", + "auctionExtension": "120" + }, + { + "horizon": "14400", + "probability": "0.9999", + "auctionExtension": "180" + }, + { + "horizon": "43200", + "probability": "0.9999", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 1 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0001140771161, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "successor": { + "parentMarketId": "bbbf50bdf026e40e3663cbe9e9df25b0dae9f43b2ef000ccb3b3c63c8d3a9280", + "insurancePoolFraction": "1" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\n ZZ6 SUCCESSOR 2nd enactment This proposal requests to list BTC/USDT-230630 as a market with USDT as a settlement asset on the Vega Network as discussed in: https://community.vega.xyz/.\n\n## Rationale\n\n- BTC is the largest Crypto asset with the highest volume and Marketcap.\n- Given the price, 1 decimal places will be used for price due to the number of valid digits in asset price. \n- Position decimal places will be set to 4 considering the value per contract\n- USDT is chosen as settlement asset due to its stability.-success", + "title": "ZZ6 SUCCESSOR 2nd enactment -001 - Create market - Market C4 Future - 2023/06/30 -success" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "edf9aa407a79da28f612637131d03d2264cdd16f4fe33bb8e0479b7185756d06", + "timestamp": "1689785290665319867", + "totalGovernanceTokenBalance": "5000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "f89edff9a4aca0088e28363e4a20a9d0fd9ea4cb89bf9dc816f2cb5ca4189453", + "reference": "ZZ7 SUCCESSOR Enacting 1st", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1689785252934860194", + "terms": { + "closingTimestamp": "1689785735", + "enactmentTimestamp": "1689786155", + "newMarket": { + "changes": { + "instrument": { + "name": "ZZ7 SUCCESSOR 1st enactment", + "code": "ZZ7 SUCCESSOR 1st enactment", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.BTC3.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "5" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "trading.terminated.ZZ7", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.BTC3.value", + "tradingTerminationProperty": "trading.terminated.ZZ7" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "base:ETH", + "quote:USDT", + "class:fx/crypto", + "quarterly", + "sector:defi", + "enactment:2023-05-23T14:00:00Z", + "settlement:2023-06-30T08:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "3600", + "probability": "0.9999", + "auctionExtension": "120" + }, + { + "horizon": "14400", + "probability": "0.9999", + "auctionExtension": "180" + }, + { + "horizon": "43200", + "probability": "0.9999", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 1 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0001140771161, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "successor": { + "parentMarketId": "b37d4ad5cd7561cbf16859325f8baf58d96a3cb3c9cb6726621e2a1dc0f30801", + "insurancePoolFraction": "1" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\n ZZ7 SUCCESSOR 1st enactment This proposal requests to list BTC/USDT-230630 as a market with USDT as a settlement asset on the Vega Network as discussed in: https://community.vega.xyz/.\n\n## Rationale\n\n- BTC is the largest Crypto asset with the highest volume and Marketcap.\n- Given the price, 1 decimal places will be used for price due to the number of valid digits in asset price. \n- Position decimal places will be set to 4 considering the value per contract\n- USDT is chosen as settlement asset due to its stability.-success", + "title": "ZZ7 SUCCESSOR 1st enactment -001 - Create market - Market C4 Future - 2023/06/30 -success" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "f89edff9a4aca0088e28363e4a20a9d0fd9ea4cb89bf9dc816f2cb5ca4189453", + "timestamp": "1689785313676544470", + "totalGovernanceTokenBalance": "5000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "896bc6593dd4ab4cb81b2eb7b1b4b208861fa96b66a7d59fb16bcaef057cd882", + "reference": "injected_at_runtime", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1689786582538900712", + "terms": { + "closingTimestamp": "1689786764", + "enactmentTimestamp": "1689786824", + "newMarket": { + "changes": { + "instrument": { + "name": "ZY1 tDAI TERM", + "code": "ZY1/tDAI TERM", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.BTC.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "5" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "trading.terminated.ZY1", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.BTC.value", + "tradingTerminationProperty": "trading.terminated.ZY1" + } + } + }, + "decimalPlaces": "2", + "metadata": [ + "base:BTC", + "quote:USDT", + "class:fx/crypto", + "monthly", + "sector:defi", + "enactment:2023-05-15T13:25:00Z", + "settlement:2023-05-15T14:25:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "720", + "probability": "0.99", + "auctionExtension": "60" + }, + { + "horizon": "3600", + "probability": "0.99", + "auctionExtension": "120" + }, + { + "horizon": "14400", + "probability": "0.99", + "auctionExtension": "180" + }, + { + "horizon": "43200", + "probability": "0.99", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.5 + } + }, + "logNormal": { + "riskAversionParameter": 0.001, + "tau": 0.00001901285269, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "tickSize": "1" + } + } + }, + "rationale": { + "description": "# Summary\n\nThis proposal requests to list ZY1 as a market with ($ZZ1) as a settlement asset on the Vega Network as discussed in: https://community.vega.xyz/.\n\n# Rationale\n\n- XX is the largest Crypto asset with the highest volume and Marketcap.\n- Given the price, 2 decimal places will be used for price\n- Position decimal places will be set to 4 considering the value per contract\n- The settlement asset chosen is the largest by trading volume", + "title": "ZY1 tDAI TERM" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "896bc6593dd4ab4cb81b2eb7b1b4b208861fa96b66a7d59fb16bcaef057cd882", + "timestamp": "1689786626771020341", + "totalGovernanceTokenBalance": "5000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "9bd440f8ec1c7639ef4988a2938180236d996796ec03ffa20974d5bf6f294354", + "reference": "ZY3 SUCCESSOR Enacting 1st", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1689787059699515263", + "terms": { + "closingTimestamp": "1689787325", + "enactmentTimestamp": "1689787385", + "newMarket": { + "changes": { + "instrument": { + "name": "ZY3 SUCCESSOR 1st enactment", + "code": "ZY3 SUCCESSOR 1st enactment", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.BTC3.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "5" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "trading.terminated.ZY3", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.BTC3.value", + "tradingTerminationProperty": "trading.terminated.ZY3" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "base:ETH", + "quote:USDT", + "class:fx/crypto", + "quarterly", + "sector:defi", + "enactment:2023-05-23T14:00:00Z", + "settlement:2023-06-30T08:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "3600", + "probability": "0.9999", + "auctionExtension": "120" + }, + { + "horizon": "14400", + "probability": "0.9999", + "auctionExtension": "180" + }, + { + "horizon": "43200", + "probability": "0.9999", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 1 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0001140771161, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "successor": { + "parentMarketId": "896bc6593dd4ab4cb81b2eb7b1b4b208861fa96b66a7d59fb16bcaef057cd882", + "insurancePoolFraction": "1" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\n ZY3 SUCCESSOR 1st enactment This proposal requests to list BTC/USDT-230630 as a market with USDT as a settlement asset on the Vega Network as discussed in: https://community.vega.xyz/.\n\n## Rationale\n\n- BTC is the largest Crypto asset with the highest volume and Marketcap.\n- Given the price, 1 decimal places will be used for price due to the number of valid digits in asset price. \n- Position decimal places will be set to 4 considering the value per contract\n- USDT is chosen as settlement asset due to its stability.-success", + "title": "ZY3 SUCCESSOR 1st enactment -001 - Create market - Market C4 Future - 2023/06/30 -success" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "9bd440f8ec1c7639ef4988a2938180236d996796ec03ffa20974d5bf6f294354", + "timestamp": "1689787112499280816", + "totalGovernanceTokenBalance": "5000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "728e68e99e926ec1fe125cf303d18fc1a52e956b5a35f92e84177b7fa639fbe3", + "reference": "injected_at_runtime", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1690454777674769965", + "terms": { + "closingTimestamp": "1690455303", + "enactmentTimestamp": "1690455363", + "newMarket": { + "changes": { + "instrument": { + "name": "New York temperature 3 day average (°C)", + "code": "NY Celsius/USDC-CE", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USDC-CE", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.NY.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "4" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + }, + { + "operator": "OPERATOR_LESS_THAN", + "value": "0" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "internal": { + "time": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "1691232149" + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.NY.value", + "tradingTerminationProperty": "vegaprotocol.builtin.timestamp" + } + } + }, + "decimalPlaces": "1", + "metadata": [ + "base:BTC", + "quote:USDT", + "class:fx/crypto", + "monthly", + "sector:defi", + "enactment:2023-07-20T17:00:00Z", + "settlement:2023-07-25T15:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "14400", + "probability": "0.999", + "auctionExtension": "30" + }, + { + "horizon": "43200", + "probability": "0.9999", + "auctionExtension": "60" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 1 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0001140771161, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "tickSize": "1" + } + } + }, + "rationale": { + "description": "# Summary\n\nThis proposal requests to list the average 3 day temperature (°C) in New York as a market with ($USD-CE) as a settlement asset on the Vega Network\n\n# Rationale\n\n- The underying of hte market is the temperature in celsius in New York (latitude=40.7128, longitude=-74.0060) \n- Source used for settling data will be the 3 day average using https://api.open-meteo.com/v1/forecast?latitude=40.7128\u0026longitude=-74.0060\u0026hourly=temperature_2m\n- After the termination of the market the market will update with a vote for the settlement value of the 3 day average temeperature\n- Leaderboard will only use public key so feel free to check what your fellow iceberg orders competitors are doing\n- Remember to checkout the bughunts since finding bugs are rewarded\n- Browser wallet and Windows CLI wallet are now available for Iceberg orders so please try and break them", + "title": "Avg 3 day temperature (°C) New York market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "728e68e99e926ec1fe125cf303d18fc1a52e956b5a35f92e84177b7fa639fbe3", + "timestamp": "1690455138915113618", + "totalGovernanceTokenBalance": "5000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "c663f1e0adfeeaa692bb4cb1d17363a214d83666be2573b7b9462433f80757f0", + "reference": "injected_at_runtime", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1690457567059687881", + "terms": { + "closingTimestamp": "1690457758", + "enactmentTimestamp": "1690457818", + "newMarket": { + "changes": { + "instrument": { + "name": "New York temperature 3 day average (°C) v2", + "code": "NY Celsius/USDC-CE v2", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USDC-CE", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.NY.value", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "4" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + }, + { + "operator": "OPERATOR_LESS_THAN", + "value": "0" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "internal": { + "time": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "1691232149" + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.NY.value", + "tradingTerminationProperty": "vegaprotocol.builtin.timestamp" + } + } + }, + "decimalPlaces": "3", + "metadata": [ + "base:BTC", + "quote:USDT", + "class:fx/crypto", + "monthly", + "sector:defi", + "enactment:2023-07-20T17:00:00Z", + "settlement:2023-07-25T15:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "14400", + "probability": "0.999", + "auctionExtension": "30" + }, + { + "horizon": "43200", + "probability": "0.9999", + "auctionExtension": "60" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 1 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0001140771161, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "1", + "linearSlippageFactor": "0.001", + "tickSize": "1" + } + } + }, + "rationale": { + "description": "# Summary\n\nThis proposal requests to list the average 3 day temperature (°C) in New York as a market with ($USD-CE) as a settlement asset on the Vega Network\n\n# Rationale\n\n- The underying of hte market is the temperature in celsius in New York (latitude=40.7128, longitude=-74.0060) \n- Source used for settling data will be the 3 day average using https://api.open-meteo.com/v1/forecast?latitude=40.7128\u0026longitude=-74.0060\u0026hourly=temperature_2m\n- After the termination of the market the market will update with a vote for the settlement value of the 3 day average temeperature\n- Leaderboard will only use public key so feel free to check what your fellow iceberg orders competitors are doing\n- Remember to checkout the bughunts since finding bugs are rewarded\n- Browser wallet and Windows CLI wallet are now available for Iceberg orders so please try and break them", + "title": "Avg 3 day temperature (°C) New York market v2" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "c663f1e0adfeeaa692bb4cb1d17363a214d83666be2573b7b9462433f80757f0", + "timestamp": "1690457582581164302", + "totalGovernanceTokenBalance": "5000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "03d8a113c3dbe1cf601e4351178b1b728e50a1798dc2ecb1d696bfb1e35459b6", + "reference": "aBh86rj3YvGo6fdfM216YpqelbH8WYvgW2X9xUTW", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891791249715900", + "terms": { + "closingTimestamp": "1699891815", + "enactmentTimestamp": "1699891830", + "updateMarketState": { + "changes": { + "marketId": "0776fbdef4ee2fd13784875ae61b48f1b3ab554b65e3304828bb926d7f19922f", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate BTCUSD Monthly (Jul 2023) market", + "title": "Terminate BTCUSD Monthly (Jul 2023) market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "03d8a113c3dbe1cf601e4351178b1b728e50a1798dc2ecb1d696bfb1e35459b6", + "timestamp": "1699891801423732939", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "c67a287d69c9482f2cc9c141e2ffce3625555a7625240db9117b85adccdfba4e", + "reference": "ZJEQiTTSt7Vc9KIIgLLzRvlpPCFqFbS05efZqiCs", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891801423732939", + "terms": { + "closingTimestamp": "1699891825", + "enactmentTimestamp": "1699891840", + "updateMarketState": { + "changes": { + "marketId": "24df2940a2617b78b4e9f64c6508e4d5d509151a6321a3244a11e1d9859e7cb1", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate Apple Monthly (Jul 2023) market", + "title": "Terminate Apple Monthly (Jul 2023) market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "c67a287d69c9482f2cc9c141e2ffce3625555a7625240db9117b85adccdfba4e", + "timestamp": "1699891810653434355", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "7a8bce665a36ab6ab3d8e175ab2928356b99aba38005ffb1b008159d298f5a11", + "reference": "kdBHqkxCOumYSd8F0bzCaUe7iDK1GmnUF3BEn1Ff", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891810653434355", + "terms": { + "closingTimestamp": "1699891835", + "enactmentTimestamp": "1699891850", + "updateMarketState": { + "changes": { + "marketId": "38a4aa08cc0ff0da92ab7d0951de999b0ee0f81029f452b8cf77fb4c300dbd41", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate ETHBTC Quarterly (Sep 2023) market", + "title": "Terminate ETHBTC Quarterly (Sep 2023) market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "7a8bce665a36ab6ab3d8e175ab2928356b99aba38005ffb1b008159d298f5a11", + "timestamp": "1699891821691014906", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "dca04dee0546cc003ee4b341d35c4590d93a5cfdd91c7cbc2975d6d4a463459f", + "reference": "3ZLeSwA33tx7X0FYuFwsfxSNw8DsTlKn8UHVwT3a", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891821691014906", + "terms": { + "closingTimestamp": "1699891845", + "enactmentTimestamp": "1699891860", + "updateMarketState": { + "changes": { + "marketId": "b66cd4be223dfd900a4750bb5175e17d8f678996877d262be4c749a99e22a970", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate Tesla Quarterly (Sep 2023) market", + "title": "Terminate Tesla Quarterly (Sep 2023) market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "dca04dee0546cc003ee4b341d35c4590d93a5cfdd91c7cbc2975d6d4a463459f", + "timestamp": "1699891832082127741", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "0fad7395ef3bf1beb8ddef760ba7b5a96505bec27336319322c5e1b11fac5d6a", + "reference": "Jnm9gdocpZi5qCi35Dd8qrzxm9z7W7h5G4ZQQYlf", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891832082127741", + "terms": { + "closingTimestamp": "1699891856", + "enactmentTimestamp": "1699891871", + "updateMarketState": { + "changes": { + "marketId": "b844aacfe0c6a5db17c1a65164a6c4418f9cc4c5d0e29eed28811487befd296b", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate ETHDAI Monthly (Jul 2023) market", + "title": "Terminate ETHDAI Monthly (Jul 2023) market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "0fad7395ef3bf1beb8ddef760ba7b5a96505bec27336319322c5e1b11fac5d6a", + "timestamp": "1699891841358501240", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "0eb63efe42df03dca4430c1074936c59957f5ec49524a171c56fda9f575fd774", + "reference": "IFwv40hQixounHCE3CgRM5OMCRjv0W248o6eatwQ", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891841358501240", + "terms": { + "closingTimestamp": "1699891866", + "enactmentTimestamp": "1699891881", + "updateMarketState": { + "changes": { + "marketId": "bbbf50bdf026e40e3663cbe9e9df25b0dae9f43b2ef000ccb3b3c63c8d3a9280", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate ZZ5 tDAI TERM market", + "title": "Terminate ZZ5 tDAI TERM market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "0eb63efe42df03dca4430c1074936c59957f5ec49524a171c56fda9f575fd774", + "timestamp": "1699891852386861499", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "22f360b44dd3943e54f45fe5b40a7ec4106f86e479a0dc16b1ffae000f683470", + "reference": "B6VbPrXPDKEu6NtIQ7rGaMPsydDqqPkVkN8Zna18", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891852386861499", + "terms": { + "closingTimestamp": "1699891876", + "enactmentTimestamp": "1699891891", + "updateMarketState": { + "changes": { + "marketId": "c1cb93afe500f2ce3f68ab8a083cd440bd15f037fa5a64a1e65be40975b09f4d", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate AAVEDAI Monthly (Jul 2023) market", + "title": "Terminate AAVEDAI Monthly (Jul 2023) market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "22f360b44dd3943e54f45fe5b40a7ec4106f86e479a0dc16b1ffae000f683470", + "timestamp": "1699891861375351935", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "1164590407beb942fc4e920472f394fb500229bdd0aba83d53ba410c57a7a7c4", + "reference": "tZHkt7eLhMBQXhHnaNRTtRIcYDnVeVTg81JvDF7N", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891861375351935", + "terms": { + "closingTimestamp": "1699891886", + "enactmentTimestamp": "1699891901", + "updateMarketState": { + "changes": { + "marketId": "d780eeb28a3a6e3a047019ca68e510dbe53f57b13eb33c9385221d128e218fce", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate UNIDAI Monthly (Jul 2023) market", + "title": "Terminate UNIDAI Monthly (Jul 2023) market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "1164590407beb942fc4e920472f394fb500229bdd0aba83d53ba410c57a7a7c4", + "timestamp": "1699891871767055221", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "e1a28abfdfec6bead77921cc8537f34f040c90c9256524d08c3f6529623b2f40", + "reference": "mS1Ioavr5EN40YHr3G4rtjNJuRKBzj1TPxlbUDBM", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891871767055221", + "terms": { + "closingTimestamp": "1699891897", + "enactmentTimestamp": "1699891912", + "updateMarketState": { + "changes": { + "marketId": "896bc6593dd4ab4cb81b2eb7b1b4b208861fa96b66a7d59fb16bcaef057cd882", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate ZY1 tDAI TERM market", + "title": "Terminate ZY1 tDAI TERM market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "e1a28abfdfec6bead77921cc8537f34f040c90c9256524d08c3f6529623b2f40", + "timestamp": "1699891882701545556", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "988be8259bf01f15729e3e1e1fd499036104b5c6daf46b9cd63a2fa7fd215d1b", + "reference": "RYkIYPUzgaKBD8OfI33ALm3Vahpgd0yDmv5kv792", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891882701545556", + "terms": { + "closingTimestamp": "1699891907", + "enactmentTimestamp": "1699891922", + "updateMarketState": { + "changes": { + "marketId": "9bd440f8ec1c7639ef4988a2938180236d996796ec03ffa20974d5bf6f294354", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate ZY3 SUCCESSOR 1st enactment market", + "title": "Terminate ZY3 SUCCESSOR 1st enactment market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "988be8259bf01f15729e3e1e1fd499036104b5c6daf46b9cd63a2fa7fd215d1b", + "timestamp": "1699891893136290128", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "c6df0cb9484482763ccac2cc5e65613076e589849e55f4af89d914c1e87e092e", + "reference": "ypnEOeeFIgfS63bIKPN9D6c1YOcVoIJ62SwZZZH1", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891903827513949", + "terms": { + "closingTimestamp": "1699891927", + "enactmentTimestamp": "1699891942", + "updateMarketState": { + "changes": { + "marketId": "f89edff9a4aca0088e28363e4a20a9d0fd9ea4cb89bf9dc816f2cb5ca4189453", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate ZZ7 SUCCESSOR 1st enactment market", + "title": "Terminate ZZ7 SUCCESSOR 1st enactment market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "c6df0cb9484482763ccac2cc5e65613076e589849e55f4af89d914c1e87e092e", + "timestamp": "1699891913528299989", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "75ea731815d61e87f5cc0e657eff39a220cb65b2dd3d48bf483732167f714b63", + "reference": "f8SThQ2tMyhE2VwcCgEa6n3KSVhs8zEWIlBhv8pP", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891914125915089", + "terms": { + "closingTimestamp": "1699891937", + "enactmentTimestamp": "1699891952", + "updateMarketState": { + "changes": { + "marketId": "edf9aa407a79da28f612637131d03d2264cdd16f4fe33bb8e0479b7185756d06", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate ZZ6 SUCCESSOR 2nd enactment market", + "title": "Terminate ZZ6 SUCCESSOR 2nd enactment market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "75ea731815d61e87f5cc0e657eff39a220cb65b2dd3d48bf483732167f714b63", + "timestamp": "1699891923025595200", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "ad640a7f55832c4330a75939f3926bc9ea3448bb00d8dc5bb899b1535ede5bb2", + "reference": "JEGqc8B3AP4OBOJDOxP4W3HIYY2rJgJCRee5dFKr", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891923025595200", + "terms": { + "closingTimestamp": "1699891948", + "enactmentTimestamp": "1699891963", + "updateMarketState": { + "changes": { + "marketId": "b6755a98db5b7376a3ed836d65e75b5bb99bbb4a8f3b2b88edbc93cb942ee6a4", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate ZZ3 SUCCESSOR 1st enactment market", + "title": "Terminate ZZ3 SUCCESSOR 1st enactment market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "ad640a7f55832c4330a75939f3926bc9ea3448bb00d8dc5bb899b1535ede5bb2", + "timestamp": "1699891933175448740", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "aa1a91f08994aa924ef82e44c5e5c610d22d138bc848690285108c6708501c72", + "reference": "GzLJJ0ENBGR7JcCS5IKuaHwU9XGqSJozNaSiRNNI", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891953575329379", + "terms": { + "closingTimestamp": "1699891978", + "enactmentTimestamp": "1699891993", + "updateMarketState": { + "changes": { + "marketId": "707c17dd2817521233e77b109f8f8aa65b8bd1148ea6a252e736677ea2e0f35c", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate XX tDAI TERM market", + "title": "Terminate XX tDAI TERM market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "aa1a91f08994aa924ef82e44c5e5c610d22d138bc848690285108c6708501c72", + "timestamp": "1699891963877033931", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "37b2ec935c3f8503e1690013962e0821bd467ae2523bebccd9cda45e446e4692", + "reference": "j0sr8CEfaGJqk4f9om7ziHsP2jpSTy2LtA6prTla", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891963877033931", + "terms": { + "closingTimestamp": "1699891988", + "enactmentTimestamp": "1699892003", + "updateMarketState": { + "changes": { + "marketId": "370751c99dee8d4ef0f2481f767800d9f9e0a0bfd466ae32b0e97a47e53dd860", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "10" + } + } + }, + "rationale": { + "description": "Terminate Market YY SUCCESSOR market", + "title": "Terminate Market YY SUCCESSOR market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "37b2ec935c3f8503e1690013962e0821bd467ae2523bebccd9cda45e446e4692", + "timestamp": "1699891974780239571", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "d6839f728d0bf1c5394015e6e3a9483796911d1b212a18144a0a64d2bb3e893a", + "reference": "WaQjAAOoYSQIydCxuadhin5PAC2QS6auK7nvkASM", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699891998712904740", + "terms": { + "closingTimestamp": "1699892023", + "enactmentTimestamp": "1699892038", + "updateNetworkParameter": { + "changes": { + "key": "limits.markets.proposePerpetualEnabled", + "value": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of limits.markets.proposePerpetualEnabled to 1 from the previous value", + "title": "Update limits.markets.proposePerpetualEnabled" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "d6839f728d0bf1c5394015e6e3a9483796911d1b212a18144a0a64d2bb3e893a", + "timestamp": "1699892009334370206", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "1b0d91c8422f6dfb3037f0d2beea9b41a6045e42341b6b9deeefa956cead18fb", + "reference": "z5O5t9jpnWYeQZ9NTswuUlGGKB5jA4X0nK38eGGU", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892048754483549", + "terms": { + "closingTimestamp": "1699892073", + "enactmentTimestamp": "1699892088", + "newMarket": { + "changes": { + "instrument": { + "name": "ETHDAI Monthly (Dec 2023)", + "code": "ETHDAI.MF21", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "DAI", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.ETH.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.ETH.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.ETH.value", + "tradingTerminationProperty": "termination.ETH.value" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:4BC6D2154BE74E1F", + "base:ETH", + "quote:DAI", + "class:fx/crypto", + "monthly", + "managed:vega/ops", + "sector:defi", + "auto:ethdai" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.01, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.3 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.1", + "liquiditySlaParameters": { + "priceRange": "0.05", + "commitmentMinTimeFraction": "0.95", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.9" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New ETHDAI market", + "title": "New ETHDAI market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "1b0d91c8422f6dfb3037f0d2beea9b41a6045e42341b6b9deeefa956cead18fb", + "timestamp": "1699892059028287988", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "498a96130727446e28efb6df6b2da9590b369142216a31f9a844bee1ced2d3bd", + "reference": "j67oV0vCxemil88Lng7W5ydqitQtpCGoXcqLYtHg", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892048754483549", + "terms": { + "closingTimestamp": "1699892073", + "enactmentTimestamp": "1699892088", + "newMarket": { + "changes": { + "instrument": { + "name": "AAVEDAI Monthly (Dec 2023)", + "code": "AAVEDAI.MF21", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "DAI", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.AAVE.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.AAVE.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.AAVE.value", + "tradingTerminationProperty": "termination.AAVE.value" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:2839D9B2329C9E70", + "base:AAVE", + "quote:DAI", + "class:fx/crypto", + "monthly", + "managed:vega/ops", + "sector:defi", + "auto:aavedai" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.01, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.5 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.1", + "liquiditySlaParameters": { + "priceRange": "0.05", + "commitmentMinTimeFraction": "0.95", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.9" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New DAI market", + "title": "New DAI market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "498a96130727446e28efb6df6b2da9590b369142216a31f9a844bee1ced2d3bd", + "timestamp": "1699892059821916752", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "7cf3abfe9c3310de14dd613523caf8d52cd27a7bd7befb958693b4ec9abee6ae", + "reference": "cvhiQ4vOGw0q770VaPnOb11EXxAJd5GZsfbXC3Rv", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892049382487724", + "terms": { + "closingTimestamp": "1699892073", + "enactmentTimestamp": "1699892088", + "newMarket": { + "changes": { + "instrument": { + "name": "Apple Monthly (Dec 2023)", + "code": "AAPL.MF21", + "future": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.AAPL.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.AAPL.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.AAPL.value", + "tradingTerminationProperty": "termination.AAPL.value" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:4899E01009F1A721", + "quote:USD", + "ticker:AAPL", + "class:equities/single-stock-futures", + "sector:tech", + "managed:vega/ops", + "listing_venue:NASDAQ", + "country:US", + "auto:aapl" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.1, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.3 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.1", + "liquiditySlaParameters": { + "priceRange": "0.05", + "commitmentMinTimeFraction": "0.95", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.9" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New USD market", + "title": "New USD market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "7cf3abfe9c3310de14dd613523caf8d52cd27a7bd7befb958693b4ec9abee6ae", + "timestamp": "1699892059821916752", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "66aa425859126386468555ee489d9ef657e6d70061e01f70913500c9cb74a237", + "reference": "jsUmP9iKBtavDAeHMHx73myeWhSl78NNgjrzkTBZ", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892049382487724", + "terms": { + "closingTimestamp": "1699892073", + "enactmentTimestamp": "1699892088", + "newMarket": { + "changes": { + "instrument": { + "name": "EURUSD Perpetual", + "code": "EURUSD.PERP", + "perpetual": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USD", + "marginFundingFactor": "0.1", + "interestRate": "0", + "clampLowerBound": "0", + "clampUpperBound": "0", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1699892088", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x1a81afB8146aeFfCFc5E50e8479e826E7D55b910", + "abi": "[{\"inputs\":[],\"name\":\"latestAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + "method": "latestAnswer", + "trigger": { + "timeTrigger": { + "initial": "1699892088", + "every": "300" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eur.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "8" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eur.price", + "expression": "$[0]" + } + ], + "sourceChainId": "11155111" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "eur.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:70657270657572757364", + "base:EUR", + "quote:USD", + "class:fx/crypto", + "monthly", + "managed:vega/ops", + "sector:crypto", + "auto:perpetual_eur_usd" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "2160", + "probability": "0.99", + "auctionExtension": "300" + }, + { + "horizon": "720", + "probability": "0.99", + "auctionExtension": "180" + }, + { + "horizon": "180", + "probability": "0.99", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.0001, + "tau": 0.00000380258, + "params": { + "r": 0.016, + "sigma": 0.7 + } + }, + "positionDecimalPlaces": "1", + "linearSlippageFactor": "0.01", + "liquiditySlaParameters": { + "priceRange": "0.05", + "commitmentMinTimeFraction": "0.95", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.9" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New EURUSD perpetual market", + "title": "New EURUSD perpetual market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "66aa425859126386468555ee489d9ef657e6d70061e01f70913500c9cb74a237", + "timestamp": "1699892059028287988", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "d5f5b8d3bdb4f918b86bc3e6609b3ded911b8b47ea4ca7170869dddee2eb2639", + "reference": "PMJhGomRnZq7NWwCCBqXg0LJNlNGfB41KSScthAO", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892049382487724", + "terms": { + "closingTimestamp": "1699892073", + "enactmentTimestamp": "1699892088", + "newMarket": { + "changes": { + "instrument": { + "name": "UNIDAI Monthly (Dec 2023)", + "code": "UNIDAI.MF21", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "DAI", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.UNI.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.UNI.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.UNI.value", + "tradingTerminationProperty": "termination.UNI.value" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:3C58ED2A4A6C5D7E", + "base:UNI", + "quote:DAI", + "class:fx/crypto", + "monthly", + "managed:vega/ops", + "sector:defi", + "auto:unidai" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.01, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.5 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.1", + "liquiditySlaParameters": { + "priceRange": "0.05", + "commitmentMinTimeFraction": "0.95", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.9" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New DAI market", + "title": "New DAI market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "d5f5b8d3bdb4f918b86bc3e6609b3ded911b8b47ea4ca7170869dddee2eb2639", + "timestamp": "1699892059821916752", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "74ea9b5f3441189dcd7b1fbff42f200bb77653cac76f14d21123a80267c2730b", + "reference": "tCB9tKovPWzitQSq0BeukZYMap6X1cnrHEFpCVSW", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892049382487724", + "terms": { + "closingTimestamp": "1699892073", + "enactmentTimestamp": "1699892088", + "newMarket": { + "changes": { + "instrument": { + "name": "LINKUSD Perpetual", + "code": "LINKUSD.PERP", + "perpetual": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USD", + "marginFundingFactor": "0.1", + "interestRate": "0", + "clampLowerBound": "0", + "clampUpperBound": "0", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1699892088", + "every": "14400" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0xc59E3633BAAC79493d908e63626716e204A45EdF", + "abi": "[{\"inputs\":[],\"name\":\"latestAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + "method": "latestAnswer", + "trigger": { + "timeTrigger": { + "initial": "1699892088", + "every": "120" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "link.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "8" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "link.price", + "expression": "$[0]" + } + ], + "sourceChainId": "11155111" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "link.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:706572706c696e6b757364", + "base:LINK", + "quote:USD", + "class:fx/crypto", + "monthly", + "managed:vega/ops", + "sector:crypto", + "auto:perpetual_link_usd" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "4320", + "probability": "0.99", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.99", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.99", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.0001, + "tau": 0.00000380258, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "1", + "linearSlippageFactor": "0.01", + "liquiditySlaParameters": { + "priceRange": "0.05", + "commitmentMinTimeFraction": "0.95", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.9" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New LINKUSD perpetual market", + "title": "New LINKUSD perpetual market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "74ea9b5f3441189dcd7b1fbff42f200bb77653cac76f14d21123a80267c2730b", + "timestamp": "1699892059821916752", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "4ea4c96f3a498c2384fa5b3362fc97da157f5bc17260627c7d7c5ea92392da1c", + "reference": "Lr6qknL3nbQvQvzqAIlyjrAQIg8ecvIbYDZE4Ura", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892049382487724", + "terms": { + "closingTimestamp": "1699892073", + "enactmentTimestamp": "1699892088", + "newMarket": { + "changes": { + "instrument": { + "name": "Tesla Quarterly (Feb 2024)", + "code": "TSLA.QM21", + "future": { + "settlementAsset": "177e8f6c25a955bd18475084b99b2b1d37f28f3dec393fab7755a7e69c3d8c3b", + "quoteName": "EURO", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.TSLA.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.TSLA.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.TSLA.value", + "tradingTerminationProperty": "termination.TSLA.value" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:5A86B190C384997F", + "quote:EURO", + "ticker:TSLA", + "class:equities/single-stock-futures", + "sector:tech", + "managed:vega/ops", + "listing_venue:NASDAQ", + "country:US", + "auto:tsla" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.01, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.8 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.1", + "liquiditySlaParameters": { + "priceRange": "0.05", + "commitmentMinTimeFraction": "0.95", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.9" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New EURO market", + "title": "New EURO market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "4ea4c96f3a498c2384fa5b3362fc97da157f5bc17260627c7d7c5ea92392da1c", + "timestamp": "1699892059821916752", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "7314703a4424f74e88869196e27beaac5bac5f4da86cdfe41b036bf7a66e9cfb", + "reference": "a4sLBZICz6690hTsTvTu52kAPuJru6AVjwKKyBN1", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892049382487724", + "terms": { + "closingTimestamp": "1699892073", + "enactmentTimestamp": "1699892088", + "newMarket": { + "changes": { + "instrument": { + "name": "BTCUSD Monthly (Dec 2023)", + "code": "BTCUSD.MF21", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "USD", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.BTC.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.BTC.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.BTC.value", + "tradingTerminationProperty": "termination.BTC.value" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:076BB86A5AA41E3E", + "base:BTC", + "quote:USD", + "class:fx/crypto", + "monthly", + "managed:vega/ops", + "sector:crypto", + "auto:btcusd" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + }, + { + "horizon": "300", + "probability": "0.9999", + "auctionExtension": "60" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.0001, + "tau": 0.0000190129, + "params": { + "r": 0.016, + "sigma": 1.25 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.1", + "liquiditySlaParameters": { + "priceRange": "0.05", + "commitmentMinTimeFraction": "0.95", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.9" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New BTCUSD Market", + "title": "New BTCUSD market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "7314703a4424f74e88869196e27beaac5bac5f4da86cdfe41b036bf7a66e9cfb", + "timestamp": "1699892059821916752", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "40f22f1012e971d3532df04f4c9c15bbda43715dd46304612eeb6bd17d5eb3a4", + "reference": "Z24iNgZlVDzWLJ7iresz86zsYofHWzI8MFl8QhBy", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892049382487724", + "terms": { + "closingTimestamp": "1699892073", + "enactmentTimestamp": "1699892088", + "newMarket": { + "changes": { + "instrument": { + "name": "ETHBTC Quarterly (Feb 2024)", + "code": "ETHBTC.QM21", + "future": { + "settlementAsset": "cee709223217281d7893b650850ae8ee8a18b7539b5658f9b4cc24de95dd18ad", + "quoteName": "BTC", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.ETH.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.ETH.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.ETH.value", + "tradingTerminationProperty": "termination.ETH.value" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:1F0BB6EB5703B099", + "base:ETH", + "quote:BTC", + "class:fx/crypto", + "quarterly", + "managed:vega/ops", + "sector:crypto", + "auto:ethbtc" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.01, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.3 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.1", + "liquiditySlaParameters": { + "priceRange": "0.05", + "commitmentMinTimeFraction": "0.95", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.9" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New BTC market", + "title": "New BTC market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "40f22f1012e971d3532df04f4c9c15bbda43715dd46304612eeb6bd17d5eb3a4", + "timestamp": "1699892059821916752", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "c2697de7929f37adf10b4e91a99fe4133f2f1d0209c6089ff8a41b6519214238", + "reference": "1pyILXAJGEl8ScLcz5S1xjsCG9TY5lboX4EoUN1C", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892049382487724", + "terms": { + "closingTimestamp": "1699892073", + "enactmentTimestamp": "1699892088", + "newMarket": { + "changes": { + "instrument": { + "name": "DAIUSD Perpetual", + "code": "DAIUSD.PERP", + "perpetual": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USD", + "marginFundingFactor": "0.1", + "interestRate": "0", + "clampLowerBound": "0", + "clampUpperBound": "0", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1699892088", + "every": "3600" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x14866185B1962B63C3Ea9E03Bc1da838bab34C19", + "abi": "[{\"inputs\":[],\"name\":\"latestAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + "method": "latestAnswer", + "trigger": { + "timeTrigger": { + "initial": "1699892088", + "every": "30" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "dai.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "8" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "dai.price", + "expression": "$[0]" + } + ], + "sourceChainId": "11155111" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "dai.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "formerly:70657270646169757364", + "base:DAI", + "quote:USD", + "class:fx/crypto", + "monthly", + "managed:vega/ops", + "sector:crypto", + "auto:perpetual_dai_usd" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "720", + "probability": "0.99", + "auctionExtension": "300" + }, + { + "horizon": "240", + "probability": "0.99", + "auctionExtension": "180" + }, + { + "horizon": "60", + "probability": "0.99", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.0001, + "tau": 0.00000380258, + "params": { + "sigma": 0.6 + } + }, + "positionDecimalPlaces": "1", + "linearSlippageFactor": "0.01", + "liquiditySlaParameters": { + "priceRange": "0.05", + "commitmentMinTimeFraction": "0.95", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.9" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New DAIUSD perpetual market", + "title": "New DAIUSD perpetual market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "c2697de7929f37adf10b4e91a99fe4133f2f1d0209c6089ff8a41b6519214238", + "timestamp": "1699892059821916752", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "0738f83c527b3ac9df8bcf399017b5f74c781c7a3e41db7e18dfc473e75e1256", + "reference": "PtSNgkbk9SFkQ96IO4rM8q4JD6a7xEA1lS3jCNzG", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892161313763986", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.VolumeDiscountProgram.minEnact", + "value": "48h0m0s" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.VolumeDiscountProgram.minEnact to 48h0m0s from the previous value", + "title": "Update governance.proposal.VolumeDiscountProgram.minEnact" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "0738f83c527b3ac9df8bcf399017b5f74c781c7a3e41db7e18dfc473e75e1256", + "timestamp": "1699892175353756695", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "2d2c64fcf4abd68c4377b60f11484208613445668050365fd7ebb341a5422706", + "reference": "djlWZOQ1HIwkspowu7zq06djmphpd5LfAAMJrPKV", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892161313763986", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "rewards.vesting.benefitTiers", + "value": "{\"tiers\": [{\"minimum_quantum_balance\": \"10\", \"reward_multiplier\": \"1.05\"}, {\"minimum_quantum_balance\": \"100\", \"reward_multiplier\": \"1.10\"},{\"minimum_quantum_balance\": \"1000\", \"reward_multiplier\": \"1.15\"},{\"minimum_quantum_balance\": \"10000\", \"reward_multiplier\": \"1.20\"}]}" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of rewards.vesting.benefitTiers to {\"tiers\": [{\"minimum_quantum_balance\": \"10\", \"reward_multiplier\": \"1.05\"}, {\"minimum_quantum_balance\": \"100\", \"reward_multiplier\": \"1.10\"},{\"minimum_quantum_balance\": \"1000\", \"reward_multiplier\": \"1.15\"},{\"minimum_quantum_balance\": \"10000\", \"reward_multiplier\": \"1.20\"}]} from the previous value", + "title": "Update rewards.vesting.benefitTiers" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "2d2c64fcf4abd68c4377b60f11484208613445668050365fd7ebb341a5422706", + "timestamp": "1699892176699434033", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "e4f3bbd99f0bc0ea0075a27f8455adaea43cebabdde116f80b86de9e45d0ad32", + "reference": "4drdr2fE6Bemsvbm7etbrnjiubgJGZ0MyinDsT5s", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892162840856585", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.transfer.minClose", + "value": "1m" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.transfer.minClose to 1m from the previous value", + "title": "Update governance.proposal.transfer.minClose" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "e4f3bbd99f0bc0ea0075a27f8455adaea43cebabdde116f80b86de9e45d0ad32", + "timestamp": "1699892175988510843", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "6df8add0a3fcf6e96c64be1292c4ec1f789e0930b7124a58cd1dfeb48a16b9e9", + "reference": "48JNP5mrSVJOmuAUZjb7Mi18vN0gizUjlPqMglVI", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892162840856585", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.referralProgram.requiredParticipation", + "value": "0.00001" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.referralProgram.requiredParticipation to 0.00001 from the previous value", + "title": "Update governance.proposal.referralProgram.requiredParticipation" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "6df8add0a3fcf6e96c64be1292c4ec1f789e0930b7124a58cd1dfeb48a16b9e9", + "timestamp": "1699892176699434033", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "b826da73dcd90551915d41bb7c5f48790badee5f09e196224e47df9c00a1cb78", + "reference": "0i2LXYNTLejQssvF7fh2AxjaJetKmSXNJ5ICruhb", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892162840856585", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.VolumeDiscountProgram.minClose", + "value": "48h0m0s" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.VolumeDiscountProgram.minClose to 48h0m0s from the previous value", + "title": "Update governance.proposal.VolumeDiscountProgram.minClose" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "b826da73dcd90551915d41bb7c5f48790badee5f09e196224e47df9c00a1cb78", + "timestamp": "1699892175353756695", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "31a448202808c9fa5d09797014de8602f54920b01f8c0fad41693bf4134118b2", + "reference": "UrvP7EIvGx5zRvtEc8MsoRiN1rJqPe4NoOzePL9R", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892162840856585", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.referralProgram.minClose", + "value": "48h0m0s" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.referralProgram.minClose to 48h0m0s from the previous value", + "title": "Update governance.proposal.referralProgram.minClose" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "31a448202808c9fa5d09797014de8602f54920b01f8c0fad41693bf4134118b2", + "timestamp": "1699892175988510843", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "df4164186ac1af3fc7092e9ace5a6a761f938c8c61abdefc18a406e52de03462", + "reference": "3vfYGjJOiWslfQPYRzk1AMzOBOObxIGgPngy5jrS", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892162840856585", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "rewards.activityStreak.minQuantumOpenVolume", + "value": "100" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of rewards.activityStreak.minQuantumOpenVolume to 100 from the previous value", + "title": "Update rewards.activityStreak.minQuantumOpenVolume" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "df4164186ac1af3fc7092e9ace5a6a761f938c8c61abdefc18a406e52de03462", + "timestamp": "1699892175988510843", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "ad72ce243157f8c6368552fdc3a7b8dd9c2b02cce0d2f09341db87eeff654b2e", + "reference": "5FoIA0wbfFPQBIQRTqcjmxxTNACe0froZ0R4ZxGM", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892162840856585", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.VolumeDiscountProgram.minVoterBalance", + "value": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.VolumeDiscountProgram.minVoterBalance to 1 from the previous value", + "title": "Update governance.proposal.VolumeDiscountProgram.minVoterBalance" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "ad72ce243157f8c6368552fdc3a7b8dd9c2b02cce0d2f09341db87eeff654b2e", + "timestamp": "1699892176699434033", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "992e86bea7461f6163c1fa3337eff20e6701a32487bc86093132f70a476b9723", + "reference": "5HImlJVXcLdo7Kw2O6ODM78dpYFVIfoSQMB0nTtk", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892162840856585", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.referralProgram.minEnact", + "value": "48h0m0s" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.referralProgram.minEnact to 48h0m0s from the previous value", + "title": "Update governance.proposal.referralProgram.minEnact" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "992e86bea7461f6163c1fa3337eff20e6701a32487bc86093132f70a476b9723", + "timestamp": "1699892175988510843", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "46e5057ab8a855d72bea141c07baa671703c9838dcb54cf061a2b04d61e94a90", + "reference": "Nmvl8ccyEXSKn6p2mATpaBPDmg1bUddn6lJlPiMQ", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892163467156559", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "referralProgram.maxReferralRewardFactor", + "value": "0.2" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of referralProgram.maxReferralRewardFactor to 0.2 from the previous value", + "title": "Update referralProgram.maxReferralRewardFactor" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "46e5057ab8a855d72bea141c07baa671703c9838dcb54cf061a2b04d61e94a90", + "timestamp": "1699892175988510843", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "a9467c50b180e59360078ceabcdc6062fe43ce4144038da26cb6b491fff9380b", + "reference": "80DB4Q2TiFh0jo7Gzp1uLG36tq0WEjnbTIJmOFDk", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892163467156559", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "validators.epoch.length", + "value": "30m" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of validators.epoch.length to 30m from the previous value", + "title": "Update validators.epoch.length" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "a9467c50b180e59360078ceabcdc6062fe43ce4144038da26cb6b491fff9380b", + "timestamp": "1699892175988510843", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "75e3e2cf9c94e6b5a51a894d115f9e6b85a2d57be1a10baa1a2653b079c6b702", + "reference": "pzgqsuUNQ0AsFagChkUPtZfE0DCtSBuRATWpEILb", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892163467156559", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "rewards.activityStreak.minQuantumTradeVolume", + "value": "100" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of rewards.activityStreak.minQuantumTradeVolume to 100 from the previous value", + "title": "Update rewards.activityStreak.minQuantumTradeVolume" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "75e3e2cf9c94e6b5a51a894d115f9e6b85a2d57be1a10baa1a2653b079c6b702", + "timestamp": "1699892176699434033", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "dfc7f0d34e37e95578d787fb03d8d5960c7e7cbef2782631979805aba5e7df4c", + "reference": "u344kspSYjSQTPCdpRDEsG9xULUkQJVcdAWFdiBw", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892163467156559", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "volumeDiscountProgram.maxVolumeDiscountFactor", + "value": "0.4" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of volumeDiscountProgram.maxVolumeDiscountFactor to 0.4 from the previous value", + "title": "Update volumeDiscountProgram.maxVolumeDiscountFactor" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "dfc7f0d34e37e95578d787fb03d8d5960c7e7cbef2782631979805aba5e7df4c", + "timestamp": "1699892175353756695", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "4b83d728f58ff527cd58428cdd44678fd1e5bf1679e55bfa6579f6c1bc8915d2", + "reference": "sPB4BmstH8aVJPsZVCo3meR0HKBqS7dJUWk29GLc", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892163467156559", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "rewards.activityStreak.inactivityLimit", + "value": "24" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of rewards.activityStreak.inactivityLimit to 24 from the previous value", + "title": "Update rewards.activityStreak.inactivityLimit" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "4b83d728f58ff527cd58428cdd44678fd1e5bf1679e55bfa6579f6c1bc8915d2", + "timestamp": "1699892175988510843", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "7dc7ee42ff749fc3aa6c4f503a1e6d4cd99a8f7f083c8b15549da46187d015dc", + "reference": "BEKGfJ3j3glZuIhEHWgRJcNwkjE4T0bfxj9zTdmV", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892163467156559", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.VolumeDiscountProgram.requiredParticipation", + "value": "0.00001" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.VolumeDiscountProgram.requiredParticipation to 0.00001 from the previous value", + "title": "Update governance.proposal.VolumeDiscountProgram.requiredParticipation" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "7dc7ee42ff749fc3aa6c4f503a1e6d4cd99a8f7f083c8b15549da46187d015dc", + "timestamp": "1699892175988510843", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "772d25c22405a27d12357b35b2072e3c7b74d1991d1104663462c8e38d3e36f0", + "reference": "3hWpk9Eu4Kdo7fXHbf7ZxLS0UaObC8qkOO102qIq", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892164118791476", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.VolumeDiscountProgram.minProposerBalance", + "value": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.VolumeDiscountProgram.minProposerBalance to 1 from the previous value", + "title": "Update governance.proposal.VolumeDiscountProgram.minProposerBalance" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "772d25c22405a27d12357b35b2072e3c7b74d1991d1104663462c8e38d3e36f0", + "timestamp": "1699892175988510843", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "518a46fc477c053472d8bc92177735cf8b99cd6e2d1057329c4bf18f542626c6", + "reference": "uNNT49qksASAEglHJIrRmIysX0suQivaHIYlNt0a", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892164118791476", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "rewards.vesting.baseRate", + "value": "0.0055" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of rewards.vesting.baseRate to 0.0055 from the previous value", + "title": "Update rewards.vesting.baseRate" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "518a46fc477c053472d8bc92177735cf8b99cd6e2d1057329c4bf18f542626c6", + "timestamp": "1699892175988510843", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "dc493dbdbbdf356e904808cfb3f7006275be6e99694ebb6f4754266d5d711b03", + "reference": "UxPt6YPWqsRnNwGliJPLVTtuvJIUp9VCYlvZC3gI", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892164118791476", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.transfer.minEnact", + "value": "1m" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.transfer.minEnact to 1m from the previous value", + "title": "Update governance.proposal.transfer.minEnact" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "dc493dbdbbdf356e904808cfb3f7006275be6e99694ebb6f4754266d5d711b03", + "timestamp": "1699892176699434033", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "476c8849287be022cf2eb25786a7af72074fc80ad77a76af8ac1d1ddd8a4b1ca", + "reference": "Hjcx9hV9tQUbUNlUOdVqHYH1z4I5LjZ5XqOnjiZF", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892164118791476", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.referralProgram.minVoterBalance", + "value": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.referralProgram.minVoterBalance to 1 from the previous value", + "title": "Update governance.proposal.referralProgram.minVoterBalance" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "476c8849287be022cf2eb25786a7af72074fc80ad77a76af8ac1d1ddd8a4b1ca", + "timestamp": "1699892175353756695", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "c94d6e4ef33fd8d3948f0d8d79cf148f8522c9a9555d53e2febec00b3a7e3eba", + "reference": "FaG2D75mvFiHNykpAKkqZlr8owDb998ZPPZSondD", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892164118791476", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "referralProgram.maxReferralDiscountFactor", + "value": "0.1" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of referralProgram.maxReferralDiscountFactor to 0.1 from the previous value", + "title": "Update referralProgram.maxReferralDiscountFactor" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "c94d6e4ef33fd8d3948f0d8d79cf148f8522c9a9555d53e2febec00b3a7e3eba", + "timestamp": "1699892175353756695", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "6821facc8060996b542f80dd94f1aead62ddfe42b31cf071fca087283bfd2dfb", + "reference": "CRG9Bw7mpPbeejW9IBzzAX8DJFUpKSm5MqDY1CzQ", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892164118791476", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "rewards.activityStreak.benefitTiers", + "value": "{\"tiers\": [{\"minimum_activity_streak\": 1, \"reward_multiplier\": \"1.05\", \"vesting_multiplier\": \"1.05\"}, {\"minimum_activity_streak\": 6, \"reward_multiplier\": \"1.10\", \"vesting_multiplier\": \"1.10\"}, {\"minimum_activity_streak\": 24, \"reward_multiplier\": \"1.10\", \"vesting_multiplier\": \"1.15\"}, {\"minimum_activity_streak\": 72, \"reward_multiplier\": \"1.20\", \"vesting_multiplier\": \"1.20\"}]}" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of rewards.activityStreak.benefitTiers to {\"tiers\": [{\"minimum_activity_streak\": 1, \"reward_multiplier\": \"1.05\", \"vesting_multiplier\": \"1.05\"}, {\"minimum_activity_streak\": 6, \"reward_multiplier\": \"1.10\", \"vesting_multiplier\": \"1.10\"}, {\"minimum_activity_streak\": 24, \"reward_multiplier\": \"1.10\", \"vesting_multiplier\": \"1.15\"}, {\"minimum_activity_streak\": 72, \"reward_multiplier\": \"1.20\", \"vesting_multiplier\": \"1.20\"}]} from the previous value", + "title": "Update rewards.activityStreak.benefitTiers" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "6821facc8060996b542f80dd94f1aead62ddfe42b31cf071fca087283bfd2dfb", + "timestamp": "1699892175988510843", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "51993a4cfc2f2d7a56c661c211d72e82da1a22ac6ef1e7f02df13a605083c3b2", + "reference": "OTAQ8lCOSbCfPE5dmkYJNtpEEIbGsENmJ631eMuA", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699892164118791476", + "terms": { + "closingTimestamp": "1699892186", + "enactmentTimestamp": "1699892201", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.referralProgram.minProposerBalance", + "value": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.referralProgram.minProposerBalance to 1 from the previous value", + "title": "Update governance.proposal.referralProgram.minProposerBalance" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "51993a4cfc2f2d7a56c661c211d72e82da1a22ac6ef1e7f02df13a605083c3b2", + "timestamp": "1699892176699434033", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "a0b23dd16ccf749487b1c6cc2a3356edbd6638b9691250038a4805b0f15c0dc4", + "reference": "p78e6hq3mRoAPY3LQSyiCO2mEYt3oAXAnEk3dkRu", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894298461410992", + "terms": { + "closingTimestamp": "1699894322", + "enactmentTimestamp": "1699894337", + "newMarket": { + "changes": { + "instrument": { + "name": "ETH/USD Perpetual", + "code": "ETHEREUM.PERP", + "perpetual": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USDT", + "marginFundingFactor": "0.95", + "interestRate": "0", + "clampLowerBound": "0", + "clampUpperBound": "0", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1699894337", + "every": "1800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x694AA1769357215DE4FAC081bf1f309aDC325306", + "abi": "[{\"inputs\":[],\"name\":\"latestAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + "method": "latestAnswer", + "trigger": { + "timeTrigger": { + "initial": "1699894337", + "every": "30" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "8" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "11155111" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "eth.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + } + } + }, + "decimalPlaces": "2", + "metadata": [ + "formerly:70657270657468757364", + "base:ETH", + "quote:USD", + "class:fx/crypto", + "monthly", + "managed:vega/ops", + "sector:crypto", + "auto:perpetual_eth_usd" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 1 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.000009506426342, + "params": { + "r": 0.016, + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "An Ethereum (ETH) Perpetual Market denominated in USD and settled in USDT", + "title": "ETH/USD Perpetual" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "a0b23dd16ccf749487b1c6cc2a3356edbd6638b9691250038a4805b0f15c0dc4", + "timestamp": "1699894307934515827", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "1c49476272bd5a5a3516bfecf5e12b48a121ce1061f34ba6a316397214056ab5", + "reference": "hBknyl6SKXSjy2lhtYpuEVQEw7X4QDhudnOSg8k0", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894298461410992", + "terms": { + "closingTimestamp": "1699894322", + "enactmentTimestamp": "1699894337", + "newMarket": { + "changes": { + "instrument": { + "name": "BTCUSDT Perp", + "code": "BTCUSDT.PERP", + "perpetual": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USDT", + "marginFundingFactor": "0.95", + "interestRate": "0", + "clampLowerBound": "0", + "clampUpperBound": "0", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1699894337", + "every": "1800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43", + "abi": "[{\"inputs\":[],\"name\":\"latestAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + "method": "latestAnswer", + "trigger": { + "timeTrigger": { + "initial": "1699894337", + "every": "30" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "8" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "11155111" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "btc.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + } + } + }, + "decimalPlaces": "1", + "metadata": [ + "formerly:50657270657475616c", + "base:BTC", + "quote:USD", + "class:fx/crypto", + "perpetual", + "managed:vega/ops", + "sector:crypto", + "auto:perpetual_btc_usd" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "4320", + "probability": "0.99", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.99", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.99", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.00000380258, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.015", + "commitmentMinTimeFraction": "0.6", + "slaCompetitionFactor": "0.2" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\nThis proposal requests to list BTCUSDT Perp as a market with USDT as a settlement asset", + "title": "BTCUSDT Perp" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "1c49476272bd5a5a3516bfecf5e12b48a121ce1061f34ba6a316397214056ab5", + "timestamp": "1699894307934515827", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "5a9b394e734f849b90e650915259a47bbf15ef735df5dd6fa33d9636905f4ff1", + "reference": "yF0o3B8PJE94IOfSzmhRPX5dDHFFIDiSCrxkMTYu", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894395621957908", + "terms": { + "closingTimestamp": "1699894420", + "enactmentTimestamp": "1699894435", + "updateNetworkParameter": { + "changes": { + "key": "referralProgram.maxReferralRewardFactor", + "value": "0.02" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of referralProgram.maxReferralRewardFactor to 0.02 from the previous value", + "title": "Update referralProgram.maxReferralRewardFactor" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "5a9b394e734f849b90e650915259a47bbf15ef735df5dd6fa33d9636905f4ff1", + "timestamp": "1699894406894073428", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "bc8b242877e45feb11e821905d5247a8dd8962ab7bb2dab1f359cc01e96b6218", + "reference": "Qhhl8FWfiTVLkx635kFTnfABNMeYKGqNokPXh6Aq", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894395621957908", + "terms": { + "closingTimestamp": "1699894420", + "enactmentTimestamp": "1699894435", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.referralProgram.minEnact", + "value": "5s" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.referralProgram.minEnact to 5s from the previous value", + "title": "Update governance.proposal.referralProgram.minEnact" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "bc8b242877e45feb11e821905d5247a8dd8962ab7bb2dab1f359cc01e96b6218", + "timestamp": "1699894406894073428", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "738249eebc12b958c8efb328eb02fd88a1f762626a1c50760a705381d67a15d2", + "reference": "DPzNkU7BMQlJa3FLuYp3cWHNUQ5qzEv6YtcthghB", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894396401092407", + "terms": { + "closingTimestamp": "1699894420", + "enactmentTimestamp": "1699894435", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.referralProgram.minClose", + "value": "5s" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.referralProgram.minClose to 5s from the previous value", + "title": "Update governance.proposal.referralProgram.minClose" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "738249eebc12b958c8efb328eb02fd88a1f762626a1c50760a705381d67a15d2", + "timestamp": "1699894405373814084", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "d9c9961389cb39f83709b56532bdc69e1cd6bcc83cd4fa568f5ced25ed312e03", + "reference": "HWitDArJwWJ24fdfPL1zO1di1AcRg3XA8UnO8Td8", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894396401092407", + "terms": { + "closingTimestamp": "1699894420", + "enactmentTimestamp": "1699894435", + "updateNetworkParameter": { + "changes": { + "key": "referralProgram.maxReferralDiscountFactor", + "value": "0.02" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of referralProgram.maxReferralDiscountFactor to 0.02 from the previous value", + "title": "Update referralProgram.maxReferralDiscountFactor" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "d9c9961389cb39f83709b56532bdc69e1cd6bcc83cd4fa568f5ced25ed312e03", + "timestamp": "1699894405373814084", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "70c76b55efd728655105a9abaaf8c1ec85cdb66e22572b5cd23dd172c01099f2", + "reference": "8buXIBeSgZKZNPBdRcCGFmrEGAYbw8jA4BZnanUj", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894440391086263", + "terms": { + "closingTimestamp": "1699894465", + "enactmentTimestamp": "1699894480", + "updateReferralProgram": { + "changes": { + "benefitTiers": [ + { + "minimumRunningNotionalTakerVolume": "10000", + "minimumEpochs": "1", + "referralRewardFactor": "0.001", + "referralDiscountFactor": "0.001" + }, + { + "minimumRunningNotionalTakerVolume": "500000", + "minimumEpochs": "6", + "referralRewardFactor": "0.005", + "referralDiscountFactor": "0.005" + }, + { + "minimumRunningNotionalTakerVolume": "1000000", + "minimumEpochs": "24", + "referralRewardFactor": "0.01", + "referralDiscountFactor": "0.01" + } + ], + "endOfProgramTimestamp": "1794502440", + "windowLength": "3", + "stakingTiers": [ + { + "minimumStakedTokens": "1", + "referralRewardMultiplier": "1" + }, + { + "minimumStakedTokens": "2", + "referralRewardMultiplier": "2" + }, + { + "minimumStakedTokens": "5", + "referralRewardMultiplier": "3" + } + ] + } + } + }, + "rationale": { + "description": "## Summary\n\nUpdates the referral program", + "title": "Update the referral program" + }, + "requiredParticipation": "0.00001", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "70c76b55efd728655105a9abaaf8c1ec85cdb66e22572b5cd23dd172c01099f2", + "timestamp": "1699894451614488957", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "a932359ba060962a60648adf487e6b9377c160703f8aeb733c9f9f7e35a488d6", + "reference": "oadRFe9CFR35VChkOt5tEynMne4busu6vhwNcvnw", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894507060017198", + "terms": { + "closingTimestamp": "1699894530", + "enactmentTimestamp": "1699894545", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.VolumeDiscountProgram.minEnact", + "value": "5s" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.VolumeDiscountProgram.minEnact to 5s from the previous value", + "title": "Update governance.proposal.VolumeDiscountProgram.minEnact" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "a932359ba060962a60648adf487e6b9377c160703f8aeb733c9f9f7e35a488d6", + "timestamp": "1699894515972972592", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "10ffc707dc5d6e33a91f7681d4ab3d5f0e8b07411fb50e4d72f3e1800ede7b2c", + "reference": "Y2z0lzkdcSg8rbAYBcwD9Zbmc1CiJdZaVPbJccyz", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894507060017198", + "terms": { + "closingTimestamp": "1699894530", + "enactmentTimestamp": "1699894545", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.VolumeDiscountProgram.minClose", + "value": "5s" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.VolumeDiscountProgram.minClose to 5s from the previous value", + "title": "Update governance.proposal.VolumeDiscountProgram.minClose" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "10ffc707dc5d6e33a91f7681d4ab3d5f0e8b07411fb50e4d72f3e1800ede7b2c", + "timestamp": "1699894515972972592", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "fac1ccd328acb1024a426e38a31b24ccfdf67f555aaff1ffc403c17ce814aa1c", + "reference": "aWTLpzJBRh0eJjkKo8pqeYVGXTTrPqnqklGYgVhz", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894551310113508", + "terms": { + "closingTimestamp": "1699894575", + "enactmentTimestamp": "1699894590", + "updateVolumeDiscountProgram": { + "changes": { + "benefitTiers": [ + { + "minimumRunningNotionalTakerVolume": "10000", + "volumeDiscountFactor": "0.05" + }, + { + "minimumRunningNotionalTakerVolume": "50000", + "volumeDiscountFactor": "0.1" + }, + { + "minimumRunningNotionalTakerVolume": "100000", + "volumeDiscountFactor": "0.15" + }, + { + "minimumRunningNotionalTakerVolume": "250000", + "volumeDiscountFactor": "0.2" + }, + { + "minimumRunningNotionalTakerVolume": "500000", + "volumeDiscountFactor": "0.25" + }, + { + "minimumRunningNotionalTakerVolume": "1000000", + "volumeDiscountFactor": "0.3" + }, + { + "minimumRunningNotionalTakerVolume": "1500000", + "volumeDiscountFactor": "0.35" + }, + { + "minimumRunningNotionalTakerVolume": "2000000", + "volumeDiscountFactor": "0.4" + } + ], + "endOfProgramTimestamp": "1794502550", + "windowLength": "7" + } + } + }, + "rationale": { + "description": "## Summary\n\nUpdates the volume discount program", + "title": "Update the Volume Discount program" + }, + "requiredParticipation": "0.00001", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "fac1ccd328acb1024a426e38a31b24ccfdf67f555aaff1ffc403c17ce814aa1c", + "timestamp": "1699894561744104950", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "c44759cb46f687a62bbdcb4814e3bdbe2dec581ef1b1138d460864b1c7945f07", + "reference": "qR21An6M0RLzrNLjdRPGC8rExCKGWrQMkmCSuSkQ", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894702341510856", + "terms": { + "closingTimestamp": "1699894726", + "enactmentTimestamp": "1699894741", + "updateNetworkParameter": { + "changes": { + "key": "referralProgram.maxReferralDiscountFactor", + "value": "0.1" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of referralProgram.maxReferralDiscountFactor to 0.1 from the previous value", + "title": "Update referralProgram.maxReferralDiscountFactor" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "c44759cb46f687a62bbdcb4814e3bdbe2dec581ef1b1138d460864b1c7945f07", + "timestamp": "1699894712494706185", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "6385a98c953d1ef325a0615af2e9100ed498e75787a59dd8e2c24ba085888461", + "reference": "Ygga4vC0lMLuqvqLo31REBeZEiUgWl8VLgkksprE", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894702341510856", + "terms": { + "closingTimestamp": "1699894726", + "enactmentTimestamp": "1699894741", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.referralProgram.minClose", + "value": "48h0m0s" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.referralProgram.minClose to 48h0m0s from the previous value", + "title": "Update governance.proposal.referralProgram.minClose" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "6385a98c953d1ef325a0615af2e9100ed498e75787a59dd8e2c24ba085888461", + "timestamp": "1699894713356497682", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "8863ec9708190714729eee4931347ce921f295feda4a0bf92e346ee35b987f1e", + "reference": "rEU72aNTZAmv7WFR30qAbGWF8p5WvYFGvBqQnXK3", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894702341510856", + "terms": { + "closingTimestamp": "1699894726", + "enactmentTimestamp": "1699894741", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.referralProgram.minEnact", + "value": "48h0m0s" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.referralProgram.minEnact to 48h0m0s from the previous value", + "title": "Update governance.proposal.referralProgram.minEnact" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "8863ec9708190714729eee4931347ce921f295feda4a0bf92e346ee35b987f1e", + "timestamp": "1699894713356497682", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "87f6f15eb0c213cfc1dd792835c453fc31b558ea4866e53d59cfb62f2b571e4e", + "reference": "tOvM4q9rwJPJsJAOmvGoG02qERHYsGknn3BocOgp", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894702341510856", + "terms": { + "closingTimestamp": "1699894726", + "enactmentTimestamp": "1699894741", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.VolumeDiscountProgram.minClose", + "value": "48h0m0s" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.VolumeDiscountProgram.minClose to 48h0m0s from the previous value", + "title": "Update governance.proposal.VolumeDiscountProgram.minClose" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "87f6f15eb0c213cfc1dd792835c453fc31b558ea4866e53d59cfb62f2b571e4e", + "timestamp": "1699894713356497682", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "1cc3cdda1e5b03b921b66a7b46f3dfcc989ee00cf39286a7c7db6350d6442455", + "reference": "Xr74Ib3zIl94pVhepSOJWNeUsDVkxwbLJz0cXgO5", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894702341510856", + "terms": { + "closingTimestamp": "1699894726", + "enactmentTimestamp": "1699894741", + "updateNetworkParameter": { + "changes": { + "key": "governance.proposal.VolumeDiscountProgram.minEnact", + "value": "48h0m0s" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of governance.proposal.VolumeDiscountProgram.minEnact to 48h0m0s from the previous value", + "title": "Update governance.proposal.VolumeDiscountProgram.minEnact" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "1cc3cdda1e5b03b921b66a7b46f3dfcc989ee00cf39286a7c7db6350d6442455", + "timestamp": "1699894713356497682", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "09a9caee2af56c26b2c95f5cd71e4e951801ed0136b259d8cf7a459e1b9e1107", + "reference": "u4VLNJ5RZ0IocEGc0eNfnEKdgYWo03Xak8lz3gv8", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699894702969872688", + "terms": { + "closingTimestamp": "1699894726", + "enactmentTimestamp": "1699894741", + "updateNetworkParameter": { + "changes": { + "key": "referralProgram.maxReferralRewardFactor", + "value": "0.2" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of referralProgram.maxReferralRewardFactor to 0.2 from the previous value", + "title": "Update referralProgram.maxReferralRewardFactor" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "09a9caee2af56c26b2c95f5cd71e4e951801ed0136b259d8cf7a459e1b9e1107", + "timestamp": "1699894712494706185", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "1935931527b56e3f6c0fedb81186e20180d94c5eeadfe94298ddbf43869265d1", + "reference": "JGqjb4A3plK7FYVF1nfO2g0E1tXaSJ2hmlJWIV4X", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1699896173261983368", + "terms": { + "closingTimestamp": "1699896197", + "enactmentTimestamp": "1699896212", + "updateNetworkParameter": { + "changes": { + "key": "spam.protection.maxUserTransfersPerEpoch", + "value": "803" + } + } + }, + "rationale": { + "description": "## Summary\n\nChange value of spam.protection.maxUserTransfersPerEpoch to 803 from the previous value", + "title": "Update spam.protection.maxUserTransfersPerEpoch" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "1935931527b56e3f6c0fedb81186e20180d94c5eeadfe94298ddbf43869265d1", + "timestamp": "1699896183503319577", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "7e649b0cfc1f09d95ede5756b8951397bf95e9d13daf394574ecdafe7d6014e0", + "reference": "Z24iNgZlVDzWLJ7iresz86zsYofHWzI8MFl8QhBy", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1703077284786817246", + "terms": { + "closingTimestamp": "1703079228", + "enactmentTimestamp": "1703079328", + "updateMarket": { + "marketId": "40f22f1012e971d3532df04f4c9c15bbda43715dd46304612eeb6bd17d5eb3a4", + "changes": { + "instrument": { + "code": "ETHBTC.QM21", + "future": { + "quoteName": "BTC", + "dataSourceSpecForSettlementData": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "prices.ETH.value", + "type": "TYPE_INTEGER" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "oracle": { + "signers": [ + { + "pubKey": { + "key": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f" + } + } + ], + "filters": [ + { + "key": { + "name": "termination.ETH.value", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "1" + } + ] + } + ] + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "prices.ETH.value", + "tradingTerminationProperty": "termination.ETH.value" + } + } + }, + "metadata": [ + "formerly:1F0BB6EB5703B099", + "base:ETH", + "quote:BTC", + "class:fx/crypto", + "quarterly", + "managed:vega/ops", + "sector:crypto", + "auto:ethbtc", + "some-metadata" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "600" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 10 + } + }, + "logNormal": { + "riskAversionParameter": 0.01, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.3 + } + }, + "linearSlippageFactor": "0.1", + "liquiditySlaParameters": { + "priceRange": "0.05", + "commitmentMinTimeFraction": "0.95", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.9" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "New BTC market", + "title": "New BTC market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "e4eb7a055934f23201fbf7d06cc5cd38c507ddad59699d8f93b232c3a7a23177", + "value": "VALUE_YES", + "proposalId": "7e649b0cfc1f09d95ede5756b8951397bf95e9d13daf394574ecdafe7d6014e0", + "timestamp": "1703077306363982907", + "totalGovernanceTokenBalance": "15000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0.9999999999999869" + } + ] + }, + { + "proposal": { + "id": "288adf344ca12ee2142316d142f6be068c208dc329f4798b1ac65a123250e48e", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707382772683060862", + "terms": { + "closingTimestamp": "1707383709", + "enactmentTimestamp": "1707383809", + "updateMarketState": { + "changes": { + "marketId": "74ea9b5f3441189dcd7b1fbff42f200bb77653cac76f14d21123a80267c2730b", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Terminate market", + "title": "Terminate market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "288adf344ca12ee2142316d142f6be068c208dc329f4798b1ac65a123250e48e", + "timestamp": "1707382983844690984", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "9e999f3b3153632012b554e7f8b9e0e42cd84ff1a0f0ab9bf671ef342022a8b2", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707382773628934288", + "terms": { + "closingTimestamp": "1707383709", + "enactmentTimestamp": "1707383809", + "updateMarketState": { + "changes": { + "marketId": "7cf3abfe9c3310de14dd613523caf8d52cd27a7bd7befb958693b4ec9abee6ae", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Terminate market", + "title": "Terminate market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "9e999f3b3153632012b554e7f8b9e0e42cd84ff1a0f0ab9bf671ef342022a8b2", + "timestamp": "1707382983844690984", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "bd9df32945bf886bd4242031bfea4938228a8f6f282ccb93eac5bad590d19bf4", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707382774791537287", + "terms": { + "closingTimestamp": "1707383709", + "enactmentTimestamp": "1707383809", + "updateMarketState": { + "changes": { + "marketId": "4ea4c96f3a498c2384fa5b3362fc97da157f5bc17260627c7d7c5ea92392da1c", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Terminate market", + "title": "Terminate market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "bd9df32945bf886bd4242031bfea4938228a8f6f282ccb93eac5bad590d19bf4", + "timestamp": "1707382985574975070", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "25d7d13f2123187f46381969376af022dc86f0792a7cd96400d30b090793b384", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707382775507359072", + "terms": { + "closingTimestamp": "1707383709", + "enactmentTimestamp": "1707383809", + "updateMarketState": { + "changes": { + "marketId": "7314703a4424f74e88869196e27beaac5bac5f4da86cdfe41b036bf7a66e9cfb", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Terminate market", + "title": "Terminate market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "25d7d13f2123187f46381969376af022dc86f0792a7cd96400d30b090793b384", + "timestamp": "1707382985574975070", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "718be2e694ef372a4fcf1b1431813f221eb2f940af81f2fb5f2bff4a5ffca5a1", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707382776203953923", + "terms": { + "closingTimestamp": "1707383709", + "enactmentTimestamp": "1707383809", + "updateMarketState": { + "changes": { + "marketId": "66aa425859126386468555ee489d9ef657e6d70061e01f70913500c9cb74a237", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Terminate market", + "title": "Terminate market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "718be2e694ef372a4fcf1b1431813f221eb2f940af81f2fb5f2bff4a5ffca5a1", + "timestamp": "1707382986338700765", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "040b9179f244e31574cde7907e0fa5844a05ed8910225527c9ad1903c7cabfc8", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707382776800458079", + "terms": { + "closingTimestamp": "1707383709", + "enactmentTimestamp": "1707383809", + "updateMarketState": { + "changes": { + "marketId": "40f22f1012e971d3532df04f4c9c15bbda43715dd46304612eeb6bd17d5eb3a4", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Terminate market", + "title": "Terminate market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "040b9179f244e31574cde7907e0fa5844a05ed8910225527c9ad1903c7cabfc8", + "timestamp": "1707382987201009169", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "a02ac2ae166ec22217b7d1bb973dcea6563e66b6c20766a6a4ee7c5b088d7273", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707382777431639985", + "terms": { + "closingTimestamp": "1707383709", + "enactmentTimestamp": "1707383809", + "updateMarketState": { + "changes": { + "marketId": "498a96130727446e28efb6df6b2da9590b369142216a31f9a844bee1ced2d3bd", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Terminate market", + "title": "Terminate market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "a02ac2ae166ec22217b7d1bb973dcea6563e66b6c20766a6a4ee7c5b088d7273", + "timestamp": "1707382988714082396", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "49514ae0fa09567283a3886cb8aa6ad0e0e5123c3778a654d4c1186e73fb788b", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707382778069785078", + "terms": { + "closingTimestamp": "1707383709", + "enactmentTimestamp": "1707383809", + "updateMarketState": { + "changes": { + "marketId": "a0b23dd16ccf749487b1c6cc2a3356edbd6638b9691250038a4805b0f15c0dc4", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Terminate market", + "title": "Terminate market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "49514ae0fa09567283a3886cb8aa6ad0e0e5123c3778a654d4c1186e73fb788b", + "timestamp": "1707382989565352570", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "7bcada7d263ecfdd1bf20253567900eda866821254ca3bc66c71c811c5cd7043", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707382778810065198", + "terms": { + "closingTimestamp": "1707383709", + "enactmentTimestamp": "1707383809", + "updateMarketState": { + "changes": { + "marketId": "1b0d91c8422f6dfb3037f0d2beea9b41a6045e42341b6b9deeefa956cead18fb", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Terminate market", + "title": "Terminate market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "7bcada7d263ecfdd1bf20253567900eda866821254ca3bc66c71c811c5cd7043", + "timestamp": "1707382990500772259", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "20c2007ec0f9a8c24a49469708cf3e80633b0e6ce240dcc76b053bc2ad8afe56", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707382779347803001", + "terms": { + "closingTimestamp": "1707383709", + "enactmentTimestamp": "1707383809", + "updateMarketState": { + "changes": { + "marketId": "c2697de7929f37adf10b4e91a99fe4133f2f1d0209c6089ff8a41b6519214238", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Terminate market", + "title": "Terminate market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "20c2007ec0f9a8c24a49469708cf3e80633b0e6ce240dcc76b053bc2ad8afe56", + "timestamp": "1707382990500772259", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "e331b4686c9ef8a60badcd47dcd9e628f3533dad82bd382e5fdc24bbe9e6fba3", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707382779939844996", + "terms": { + "closingTimestamp": "1707383709", + "enactmentTimestamp": "1707383809", + "updateMarketState": { + "changes": { + "marketId": "d5f5b8d3bdb4f918b86bc3e6609b3ded911b8b47ea4ca7170869dddee2eb2639", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Terminate market", + "title": "Terminate market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "e331b4686c9ef8a60badcd47dcd9e628f3533dad82bd382e5fdc24bbe9e6fba3", + "timestamp": "1707382991856526548", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "cd46f373e343af102fd40bed49f7434f55c5e4a3dcca653270518328cb17c559", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707382780551956057", + "terms": { + "closingTimestamp": "1707383709", + "enactmentTimestamp": "1707383809", + "updateMarketState": { + "changes": { + "marketId": "1c49476272bd5a5a3516bfecf5e12b48a121ce1061f34ba6a316397214056ab5", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Terminate market", + "title": "Terminate market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "cd46f373e343af102fd40bed49f7434f55c5e4a3dcca653270518328cb17c559", + "timestamp": "1707382992589530601", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "279b6e238a2af1e057e63e24bc5a503dea0f86036fb6e5a6adce7bf93dec0f64", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707387043461824855", + "terms": { + "closingTimestamp": "1707387627", + "enactmentTimestamp": "1707387727", + "newMarket": { + "changes": { + "instrument": { + "name": "INJ/USDT-Perp", + "code": "INJ/USDT-PERP", + "perpetual": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1707387727", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x9eb2EBD260D82410592758B3091F74977E4A404c", + "abi": "[{\"inputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"twapInterval\",\"type\":\"uint32\"}],\"name\":\"priceFromEthPoolInUsdt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + "method": "priceFromEthPoolInUsdt", + "args": [ + { + "stringValue": "0x6c063a6e8cd45869b5eb75291e65a3de298f3aa8" + }, + { + "numberValue": 300 + } + ], + "trigger": { + "timeTrigger": { + "initial": "1707387727", + "every": "300" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "inj.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "inj.price", + "expression": "$[0]" + } + ], + "sourceChainId": "11155111" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "inj.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + } + } + }, + "decimalPlaces": "3", + "metadata": [ + "base:INJ", + "quote:USDT", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-04T15:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "1", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\nThis proposal requests to list INJ/USDT Perpetual as a market with USDT as a settlement asset", + "title": "VMP-29 Create market INJ/USDT Perpetual" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "279b6e238a2af1e057e63e24bc5a503dea0f86036fb6e5a6adce7bf93dec0f64", + "timestamp": "1707387170428409377", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "de0f57d1ec1e5f7868cc47bcab0aabf896a376e9db1c8bec83d00fda3cd53bd8", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707387043929797179", + "terms": { + "closingTimestamp": "1707387627", + "enactmentTimestamp": "1707387727", + "newMarket": { + "changes": { + "instrument": { + "name": "LDO/USDT-Perp", + "code": "LDO/USDT-PERP", + "perpetual": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1707387727", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x9eb2EBD260D82410592758B3091F74977E4A404c", + "abi": "[{\"inputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"twapInterval\",\"type\":\"uint32\"}],\"name\":\"priceFromEthPoolInUsdt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + "method": "priceFromEthPoolInUsdt", + "args": [ + { + "stringValue": "0xa3f558aebaecaf0e11ca4b2199cc5ed341edfd74" + }, + { + "numberValue": 300 + } + ], + "trigger": { + "timeTrigger": { + "initial": "1707387727", + "every": "300" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "ldo.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "ldo.price", + "expression": "$[0]" + } + ], + "sourceChainId": "11155111" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "ldo.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + } + } + }, + "decimalPlaces": "4", + "metadata": [ + "base:LDO", + "quote:USDT", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-04T15:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "1", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\nThis proposal requests to list LDO/USDT Perpetual as a market with USDT as a settlement asset", + "title": "VMP-28 Create market LDO/USDT Perpetual" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "de0f57d1ec1e5f7868cc47bcab0aabf896a376e9db1c8bec83d00fda3cd53bd8", + "timestamp": "1707387171052298993", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "53d34c0b8cb45d0ff6232e605191b5d215fc8b0d949b2efb495dbf223448192d", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707387044563878593", + "terms": { + "closingTimestamp": "1707387627", + "enactmentTimestamp": "1707387727", + "newMarket": { + "changes": { + "instrument": { + "name": "SNX/USDT-Perp", + "code": "SNX/USDT-PERP", + "perpetual": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1707387727", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x9eb2EBD260D82410592758B3091F74977E4A404c", + "abi": "[{\"inputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"twapInterval\",\"type\":\"uint32\"}],\"name\":\"priceFromEthPoolInUsdt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + "method": "priceFromEthPoolInUsdt", + "args": [ + { + "stringValue": "0xede8dd046586d22625ae7ff2708f879ef7bdb8cf" + }, + { + "numberValue": 300 + } + ], + "trigger": { + "timeTrigger": { + "initial": "1707387727", + "every": "300" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "snx.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "snx.price", + "expression": "$[0]" + } + ], + "sourceChainId": "11155111" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "snx.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + } + } + }, + "decimalPlaces": "3", + "metadata": [ + "base:SNX", + "quote:USDT", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-03T14:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "1", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\nThis proposal requests to list SNX/USDT Perpetual as a market with USDT as a settlement asset", + "title": "VMP-26 Create market SNX/USDT Perpetual" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "53d34c0b8cb45d0ff6232e605191b5d215fc8b0d949b2efb495dbf223448192d", + "timestamp": "1707387171793523420", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "00788b763b999ef555ac5da17de155ff4237dd14aa6671a303d1285f27f094f0", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707392820351859025", + "terms": { + "closingTimestamp": "1707393126", + "enactmentTimestamp": "1707393226", + "newMarket": { + "changes": { + "instrument": { + "name": "BTC/USD(USDT)-Perp", + "code": "BTC/USD-PERP", + "perpetual": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1707393226", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "abi": "[{\"inputs\":[],\"name\":\"latestAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + "method": "latestAnswer", + "trigger": { + "timeTrigger": { + "initial": "1707393226", + "every": "300" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "8" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "11155111" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "btc.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + } + } + }, + "decimalPlaces": "1", + "metadata": [ + "base:BTC", + "quote:USDT", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2023-12-04T12:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.00000380258, + "params": { + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "4", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\nThis proposal requests to list BTC/USD Perpetual as a market with USDT as a settlement asset", + "title": "VMP-13 Create market BTC/USD Perpetual" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "00788b763b999ef555ac5da17de155ff4237dd14aa6671a303d1285f27f094f0", + "timestamp": "1707392899249459332", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "ac7fc86bddf26748c6ba32a67037fe13c623cd4b53480aac4eaf29fbbd22ac31", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1707392951160027077", + "terms": { + "closingTimestamp": "1707393226", + "enactmentTimestamp": "1707393326", + "newMarket": { + "changes": { + "instrument": { + "name": "ETH/USD(USDT)-PERP", + "code": "ETH/USD-PERP", + "perpetual": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USD", + "marginFundingFactor": "0.95", + "interestRate": "0", + "clampLowerBound": "0", + "clampUpperBound": "0", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1707393326", + "every": "1800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "abi": "[{\"inputs\":[],\"name\":\"latestAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + "method": "latestAnswer", + "trigger": { + "timeTrigger": { + "initial": "1707393326", + "every": "30" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "8" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "11155111" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "eth.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + } + } + }, + "decimalPlaces": "2", + "metadata": [ + "enactment:2023-11-19T02:00:00Z", + "base:ETH", + "quote:USD", + "class:fx/crypto", + "perpetual", + "sector:defi" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 1 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.000009506426342, + "params": { + "r": 0.016, + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "3", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "This is a perpetual futures market for Ethereum (ETH) denominated in USD and settled in USDT.", + "title": "VMP-12 - Create Market - ETH/USD(USDT)-PERP" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "ac7fc86bddf26748c6ba32a67037fe13c623cd4b53480aac4eaf29fbbd22ac31", + "timestamp": "1707392969213245211", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "3a662911e482d58c15b65c771fda88ecfcd41b24fe6d16477b4015aefcdc84dc", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708413923441344402", + "terms": { + "closingTimestamp": "1708414025", + "enactmentTimestamp": "1708414065", + "updateNetworkParameter": { + "changes": { + "key": "market.liquidity.probabilityOfTrading.tau.scaling", + "value": "10" + } + } + }, + "rationale": { + "description": "Update market.liquidity.probabilityOfTrading.tau.scaling to 10", + "title": "Update market.liquidity.probabilityOfTrading.tau.scaling to 10" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "3a662911e482d58c15b65c771fda88ecfcd41b24fe6d16477b4015aefcdc84dc", + "timestamp": "1708413942509379131", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "3bf7c71497fc3fb79569a940698bc550a43ca592b3b737500a64a27896253874", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708420939898200117", + "terms": { + "closingTimestamp": "1708421293", + "enactmentTimestamp": "1708421353", + "updateMarket": { + "marketId": "00788b763b999ef555ac5da17de155ff4237dd14aa6671a303d1285f27f094f0", + "changes": { + "instrument": { + "code": "BTCUSDT.PERP", + "name": "Bitcoin / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708421353", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708421353", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "btc.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "1", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "btc.price" + } + ] + } + } + }, + "metadata": [ + "base:BTC", + "quote:USD", + "oracle:pyth", + "chain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "4320", + "probability": "0.99", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.99", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.99", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.00000380258, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.685", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidationStrategy": { + "disposalTimeStep": "30", + "disposalFraction": "0.1", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "5000000", + "sourceWeights": [ + "0", + "0", + "0", + "1" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "btc.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "e2bd2f75e07001b19aae12ce9b7dfb0613802c85264a3ff61fb347c23e0a0dce" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "e2bd2f75e07001b19aae12ce9b7dfb0613802c85264a3ff61fb347c23e0a0dce", + "timestamp": "1708420977196394583", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "edbc9c6e257ccb4e987b9ae9c0935f204af8208b7aa3034a72d23bdddee01b71", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708420939898200117", + "terms": { + "closingTimestamp": "1708421293", + "enactmentTimestamp": "1708421353", + "updateMarket": { + "marketId": "ac7fc86bddf26748c6ba32a67037fe13c623cd4b53480aac4eaf29fbbd22ac31", + "changes": { + "instrument": { + "code": "ETHUSDT.PERP", + "name": "Ether / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708421353", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708421353", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "eth.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "1", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "eth.price" + } + ] + } + } + }, + "metadata": [ + "base:ETH", + "quote:USD", + "oracle:pyth", + "chain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "4320", + "probability": "0.99", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.99", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.99", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.00000380258, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.685", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidationStrategy": { + "disposalTimeStep": "30", + "disposalFraction": "0.1", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "5000000", + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_MEDIAN", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "eth.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "e2bd2f75e07001b19aae12ce9b7dfb0613802c85264a3ff61fb347c23e0a0dce" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "e2bd2f75e07001b19aae12ce9b7dfb0613802c85264a3ff61fb347c23e0a0dce", + "timestamp": "1708420977196394583", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "16d4315d4e85c3697a579f61c615c773d455735dca5e05f87cf03d1c97c1bfcf", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708420939898200117", + "terms": { + "closingTimestamp": "1708421293", + "enactmentTimestamp": "1708421653", + "updateMarketState": { + "changes": { + "marketId": "00788b763b999ef555ac5da17de155ff4237dd14aa6671a303d1285f27f094f0", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "e2bd2f75e07001b19aae12ce9b7dfb0613802c85264a3ff61fb347c23e0a0dce" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "e2bd2f75e07001b19aae12ce9b7dfb0613802c85264a3ff61fb347c23e0a0dce", + "timestamp": "1708420977196394583", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "cec0929f99117d4095481320a2d961078510b1628001413fe7fe8ae3d57b4616", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708420939898200117", + "terms": { + "closingTimestamp": "1708421293", + "enactmentTimestamp": "1708421653", + "updateMarketState": { + "changes": { + "marketId": "ac7fc86bddf26748c6ba32a67037fe13c623cd4b53480aac4eaf29fbbd22ac31", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "e2bd2f75e07001b19aae12ce9b7dfb0613802c85264a3ff61fb347c23e0a0dce" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "e2bd2f75e07001b19aae12ce9b7dfb0613802c85264a3ff61fb347c23e0a0dce", + "timestamp": "1708420977196394583", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "604117a2b739c8ce0d5c593803bc427cbb390b9d5a133c5ce1de7e1004e14948", + "reference": "some-reference1234", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708515136240038512", + "terms": { + "closingTimestamp": "1708515288", + "enactmentTimestamp": "1708515388", + "updateMarket": { + "marketId": "00788b763b999ef555ac5da17de155ff4237dd14aa6671a303d1285f27f094f0", + "changes": { + "instrument": { + "code": "BTC/USDT", + "name": "Bitcoin / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708515388", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708515388", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "btc.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "btc.price" + } + ] + } + } + }, + "metadata": [ + "base:BTC", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2023-12-01T18:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.000003995, + "params": { + "sigma": 1 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_MEDIAN", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "btc.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c", + "timestamp": "1708515192118400139", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "0.9998025782212833", + "totalEquityLikeShareWeight": "0" + } + ], + "no": [ + { + "partyId": "134e5b2fdf11352a85511ec1ae5c0f876977f4bffd52ad08aa04836bf6bf8585", + "value": "VALUE_NO", + "proposalId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c", + "timestamp": "1708515214746954256", + "totalGovernanceTokenBalance": "9876000000000000000000", + "totalGovernanceTokenWeight": "0.0001974217787167", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "e13ee1d32a955d2d6dc9ae27f54b3428ed9ef54964bc9c69c81f4a5af057cfc8", + "reference": "some-reference1234", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708515136240038512", + "terms": { + "closingTimestamp": "1708515288", + "enactmentTimestamp": "1708515388", + "updateMarket": { + "marketId": "ac7fc86bddf26748c6ba32a67037fe13c623cd4b53480aac4eaf29fbbd22ac31", + "changes": { + "instrument": { + "code": "ETH/USDT", + "name": "Ether / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708515388", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708515388", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "eth.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "eth.price" + } + ] + } + } + }, + "metadata": [ + "base:ETH", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2023-11-19T02:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.000009506426342, + "params": { + "r": 0.016, + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_MEDIAN", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "eth.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c", + "timestamp": "1708515192118400139", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "0.9998025782212833", + "totalEquityLikeShareWeight": "0" + } + ], + "no": [ + { + "partyId": "134e5b2fdf11352a85511ec1ae5c0f876977f4bffd52ad08aa04836bf6bf8585", + "value": "VALUE_NO", + "proposalId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c", + "timestamp": "1708515214746954256", + "totalGovernanceTokenBalance": "9876000000000000000000", + "totalGovernanceTokenWeight": "0.0001974217787167", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "eca14bf6cac541a584a0030bd785ec9bfa8c4d02b7e00eed5d9ca2549836010d", + "reference": "some-reference1234", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708515136240038512", + "terms": { + "closingTimestamp": "1708515288", + "enactmentTimestamp": "1708515388", + "updateMarket": { + "marketId": "279b6e238a2af1e057e63e24bc5a503dea0f86036fb6e5a6adce7bf93dec0f64", + "changes": { + "instrument": { + "code": "INJ/USDT", + "name": "Injective / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708515388", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "elvB0rVq0CkEjNY5ZLOtJ3bq34Eu3BpDoxQGy1S/9ZI=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708515388", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "inj.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "inj.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "inj.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "elvB0rVq0CkEjNY5ZLOtJ3bq34Eu3BpDoxQGy1S/9ZI=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "inj.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "inj.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "inj.price" + } + ] + } + } + }, + "metadata": [ + "base:INJ", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-04T15:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "0", + "sourceWeights": [ + "0", + "0", + "1", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "elvB0rVq0CkEjNY5ZLOtJ3bq34Eu3BpDoxQGy1S/9ZI=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "inj.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "inj.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "inj.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c", + "timestamp": "1708515192118400139", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "0.9998025782212833", + "totalEquityLikeShareWeight": "0" + } + ], + "no": [ + { + "partyId": "134e5b2fdf11352a85511ec1ae5c0f876977f4bffd52ad08aa04836bf6bf8585", + "value": "VALUE_NO", + "proposalId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c", + "timestamp": "1708515214746954256", + "totalGovernanceTokenBalance": "9876000000000000000000", + "totalGovernanceTokenWeight": "0.0001974217787167", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "505f587e0fd7d50e5aa0ae4b454dd7f3a01b74c744a6a1c642304f51e3e5cc21", + "reference": "some-reference1234", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708515136240038512", + "terms": { + "closingTimestamp": "1708515288", + "enactmentTimestamp": "1708515388", + "updateMarket": { + "marketId": "53d34c0b8cb45d0ff6232e605191b5d215fc8b0d949b2efb495dbf223448192d", + "changes": { + "instrument": { + "code": "SNX/USDT", + "name": "Synthetix / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708515388", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "OdAg9gmC7Ykqu81KBqJ2qfm3v7zgAyBMEQtuSI9QLaM=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708515388", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "snx.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "snx.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "snx.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "OdAg9gmC7Ykqu81KBqJ2qfm3v7zgAyBMEQtuSI9QLaM=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "snx.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "snx.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "snx.price" + } + ] + } + } + }, + "metadata": [ + "base:SNX", + "quote:USDT", + "oracle:pyth", + "oraclChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-03T14:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "0", + "sourceWeights": [ + "0", + "0", + "1", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "OdAg9gmC7Ykqu81KBqJ2qfm3v7zgAyBMEQtuSI9QLaM=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "snx.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "snx.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "snx.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c", + "timestamp": "1708515192118400139", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "0.9998025782212833", + "totalEquityLikeShareWeight": "0" + } + ], + "no": [ + { + "partyId": "134e5b2fdf11352a85511ec1ae5c0f876977f4bffd52ad08aa04836bf6bf8585", + "value": "VALUE_NO", + "proposalId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c", + "timestamp": "1708515214746954256", + "totalGovernanceTokenBalance": "9876000000000000000000", + "totalGovernanceTokenWeight": "0.0001974217787167", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "d6672c6eb0306d87f8ac2afef8982d04997b5c3fb210de588c117124a49d0750", + "reference": "some-reference1234", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708515136240038512", + "terms": { + "closingTimestamp": "1708515288", + "enactmentTimestamp": "1708515388", + "updateMarket": { + "marketId": "de0f57d1ec1e5f7868cc47bcab0aabf896a376e9db1c8bec83d00fda3cd53bd8", + "changes": { + "instrument": { + "code": "LDO/USDT", + "name": "Lido / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708515388", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "xj4qfzegTl5hTAcji+2yXcw4kn+6j+iQWXpZPAsvpK0=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708515388", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "ldo.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "ldo.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "ldo.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "xj4qfzegTl5hTAcji+2yXcw4kn+6j+iQWXpZPAsvpK0=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "ldo.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "ldo.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "ldo.price" + } + ] + } + } + }, + "metadata": [ + "base:LDO", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-04T15:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "0", + "sourceWeights": [ + "0", + "0", + "1", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "xj4qfzegTl5hTAcji+2yXcw4kn+6j+iQWXpZPAsvpK0=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "ldo.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "ldo.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "ldo.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c", + "timestamp": "1708515192118400139", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "0.9998025782212833", + "totalEquityLikeShareWeight": "0" + } + ], + "no": [ + { + "partyId": "134e5b2fdf11352a85511ec1ae5c0f876977f4bffd52ad08aa04836bf6bf8585", + "value": "VALUE_NO", + "proposalId": "53cb79c5b30e39ed810097bcb02940d32f36ca19af08c59eb562f973a1708a7c", + "timestamp": "1708515214746954256", + "totalGovernanceTokenBalance": "9876000000000000000000", + "totalGovernanceTokenWeight": "0.0001974217787167", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "3902a5c7c2ff151362f51814678c4d7bbb0d0381e49e56045095167f9e1b8662", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708530407237604637", + "terms": { + "closingTimestamp": "1708530495", + "enactmentTimestamp": "1708530595", + "updateNetworkParameter": { + "changes": { + "key": "blockchains.ethereumRpcAndEvmCompatDataSourcesConfig", + "value": "{\"configs\":[{\"network_id\":\"100\",\"chain_id\":\"100\",\"confirmations\":3,\"name\":\"Gnosis Chain\", \"block_interval\": 4}, {\"network_id\":\"42161\",\"chain_id\":\"42161\",\"confirmations\":3,\"name\":\"Arbitrum One\", \"block_interval\": 100}]}" + } + } + }, + "rationale": { + "description": "As per title", + "title": "Update L2 block intervals" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "134e5b2fdf11352a85511ec1ae5c0f876977f4bffd52ad08aa04836bf6bf8585", + "value": "VALUE_YES", + "proposalId": "3902a5c7c2ff151362f51814678c4d7bbb0d0381e49e56045095167f9e1b8662", + "timestamp": "1708530437102588782", + "totalGovernanceTokenBalance": "9876000000000000000000", + "totalGovernanceTokenWeight": "0.0001974217787167", + "totalEquityLikeShareWeight": "0" + }, + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "3902a5c7c2ff151362f51814678c4d7bbb0d0381e49e56045095167f9e1b8662", + "timestamp": "1708530443235537728", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "0.9998025782212833", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "ec1017a0d92a15d0e142ae036f1b327b78b240d0e48900957748f2dd223ff0fd", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708513105716700938", + "terms": { + "closingTimestamp": "1708534769", + "enactmentTimestamp": "1708534869", + "updateMarket": { + "marketId": "00788b763b999ef555ac5da17de155ff4237dd14aa6671a303d1285f27f094f0", + "changes": { + "instrument": { + "code": "BTCUSDT.PERP", + "name": "Bitcoin / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708534869", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708534869", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "btc.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "1", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "btc.price" + } + ] + } + } + }, + "metadata": [ + "base:BTC", + "quote:USD", + "oracle:pyth", + "chain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "4320", + "probability": "0.99", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.99", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.99", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.00000380258, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.685", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidationStrategy": { + "disposalTimeStep": "30", + "disposalFraction": "0.1", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "5000000", + "sourceWeights": [ + "0", + "0", + "0", + "1" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "btc.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "9fc3781600b7e97b42dbf00578f23811db15e89d81e4daea3a528b5e7a39947d" + }, + "yes": [ + { + "partyId": "134e5b2fdf11352a85511ec1ae5c0f876977f4bffd52ad08aa04836bf6bf8585", + "value": "VALUE_YES", + "proposalId": "9fc3781600b7e97b42dbf00578f23811db15e89d81e4daea3a528b5e7a39947d", + "timestamp": "1708513484871312014", + "totalGovernanceTokenBalance": "9876000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "b9be9499eb206f333e7c06772a0db387984528496700876602a3a70a3bd96d06", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708513105716700938", + "terms": { + "closingTimestamp": "1708534769", + "enactmentTimestamp": "1708534869", + "updateMarket": { + "marketId": "ac7fc86bddf26748c6ba32a67037fe13c623cd4b53480aac4eaf29fbbd22ac31", + "changes": { + "instrument": { + "code": "ETHUSDT.PERP", + "name": "Ether / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708534869", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708534869", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "eth.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "1", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "eth.price" + } + ] + } + } + }, + "metadata": [ + "base:ETH", + "quote:USD", + "oracle:pyth", + "chain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "4320", + "probability": "0.99", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.99", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.99", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.00000380258, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.685", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidationStrategy": { + "disposalTimeStep": "30", + "disposalFraction": "0.1", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "5000000", + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_MEDIAN", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"id\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPrice\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "eth.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "9fc3781600b7e97b42dbf00578f23811db15e89d81e4daea3a528b5e7a39947d" + }, + "yes": [ + { + "partyId": "134e5b2fdf11352a85511ec1ae5c0f876977f4bffd52ad08aa04836bf6bf8585", + "value": "VALUE_YES", + "proposalId": "9fc3781600b7e97b42dbf00578f23811db15e89d81e4daea3a528b5e7a39947d", + "timestamp": "1708513484871312014", + "totalGovernanceTokenBalance": "9876000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "1365dc7a3f74349c477d912573a17f4ba598ee7f69baac19191ed9c5e9e9d9d2", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_FAILED", + "timestamp": "1708513105716700938", + "terms": { + "closingTimestamp": "1708534769", + "enactmentTimestamp": "1708535769", + "updateMarketState": { + "changes": { + "marketId": "00788b763b999ef555ac5da17de155ff4237dd14aa6671a303d1285f27f094f0", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + } + }, + "reason": "PROPOSAL_ERROR_INVALID_MARKET_STATE_UPDATE", + "errorDetails": "invalid state update request. Market for resume is not suspended", + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "9fc3781600b7e97b42dbf00578f23811db15e89d81e4daea3a528b5e7a39947d" + }, + "yes": [ + { + "partyId": "134e5b2fdf11352a85511ec1ae5c0f876977f4bffd52ad08aa04836bf6bf8585", + "value": "VALUE_YES", + "proposalId": "9fc3781600b7e97b42dbf00578f23811db15e89d81e4daea3a528b5e7a39947d", + "timestamp": "1708513484871312014", + "totalGovernanceTokenBalance": "9876000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "f4df6c88858a3e203944ab40a246486ac306f481bd08a80f60169be4ece00575", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_FAILED", + "timestamp": "1708513105716700938", + "terms": { + "closingTimestamp": "1708534769", + "enactmentTimestamp": "1708535769", + "updateMarketState": { + "changes": { + "marketId": "ac7fc86bddf26748c6ba32a67037fe13c623cd4b53480aac4eaf29fbbd22ac31", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + } + }, + "reason": "PROPOSAL_ERROR_INVALID_MARKET_STATE_UPDATE", + "errorDetails": "invalid state update request. Market for resume is not suspended", + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "9fc3781600b7e97b42dbf00578f23811db15e89d81e4daea3a528b5e7a39947d" + }, + "yes": [ + { + "partyId": "134e5b2fdf11352a85511ec1ae5c0f876977f4bffd52ad08aa04836bf6bf8585", + "value": "VALUE_YES", + "proposalId": "9fc3781600b7e97b42dbf00578f23811db15e89d81e4daea3a528b5e7a39947d", + "timestamp": "1708513484871312014", + "totalGovernanceTokenBalance": "9876000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "64c2a4adead6637ee313efc2bb14fd693b5bd026690b81d7d293234bab1d9471", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708590252032290455", + "terms": { + "closingTimestamp": "1708590407", + "enactmentTimestamp": "1708590427", + "updateNetworkParameter": { + "changes": { + "key": "blockchains.ethereumRpcAndEvmCompatDataSourcesConfig", + "value": "{\"configs\":[{\"network_id\":\"100\",\"chain_id\":\"100\",\"confirmations\":3,\"name\":\"Gnosis Chain\", \"block_interval\": 3}, {\"network_id\":\"42161\",\"chain_id\":\"42161\",\"confirmations\":3,\"name\":\"Arbitrum One\", \"block_interval\": 50}]}" + } + } + }, + "rationale": { + "description": "As per title", + "title": "Update L2 block intervals" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "64c2a4adead6637ee313efc2bb14fd693b5bd026690b81d7d293234bab1d9471", + "timestamp": "1708590287021703876", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "d191dc59660adec1a7353c69bdc96ab87895171d233d379632a2d31c4d1641d6", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708611156018439913", + "terms": { + "closingTimestamp": "1708611205", + "enactmentTimestamp": "1708611305", + "updateMarket": { + "marketId": "00788b763b999ef555ac5da17de155ff4237dd14aa6671a303d1285f27f094f0", + "changes": { + "instrument": { + "code": "BTC/USDT", + "name": "Bitcoin / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708611305", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708611305", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "btc.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "btc.price" + } + ] + } + } + }, + "metadata": [ + "base:BTC", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2023-12-01T18:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.000003995, + "params": { + "sigma": 1 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_MEDIAN", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "btc.price" + }, + { + "priceSourceProperty": "btc.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "f6b6a87c39b18807447f8dbc33e8607e8bb43faf50e004568e08275547aef552" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "f6b6a87c39b18807447f8dbc33e8607e8bb43faf50e004568e08275547aef552", + "timestamp": "1708611169603962615", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "e5e96711ccb0903433f8ef138a3e2ee36d76de6e849506de548386e262ca0fe9", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708611156018439913", + "terms": { + "closingTimestamp": "1708611205", + "enactmentTimestamp": "1708611305", + "updateMarket": { + "marketId": "ac7fc86bddf26748c6ba32a67037fe13c623cd4b53480aac4eaf29fbbd22ac31", + "changes": { + "instrument": { + "code": "ETH/USDT", + "name": "Ether / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708611305", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708611305", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "eth.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "eth.price" + } + ] + } + } + }, + "metadata": [ + "base:ETH", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2023-11-19T02:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.000009506426342, + "params": { + "r": 0.016, + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_MEDIAN", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "eth.price" + }, + { + "priceSourceProperty": "eth.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "f6b6a87c39b18807447f8dbc33e8607e8bb43faf50e004568e08275547aef552" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "f6b6a87c39b18807447f8dbc33e8607e8bb43faf50e004568e08275547aef552", + "timestamp": "1708611169603962615", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "c740257efe6e930f6a79b733a066044713edaeb3f81a48782f4ac1de4fa66a10", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708611156018439913", + "terms": { + "closingTimestamp": "1708611205", + "enactmentTimestamp": "1708611305", + "updateMarket": { + "marketId": "279b6e238a2af1e057e63e24bc5a503dea0f86036fb6e5a6adce7bf93dec0f64", + "changes": { + "instrument": { + "code": "INJ/USDT", + "name": "Injective / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708611305", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "elvB0rVq0CkEjNY5ZLOtJ3bq34Eu3BpDoxQGy1S/9ZI=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708611305", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "inj.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "inj.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "inj.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "elvB0rVq0CkEjNY5ZLOtJ3bq34Eu3BpDoxQGy1S/9ZI=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "inj.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "inj.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "inj.price" + } + ] + } + } + }, + "metadata": [ + "base:INJ", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-04T15:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "0", + "sourceWeights": [ + "0", + "0", + "1", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "elvB0rVq0CkEjNY5ZLOtJ3bq34Eu3BpDoxQGy1S/9ZI=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "inj.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "inj.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "inj.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "f6b6a87c39b18807447f8dbc33e8607e8bb43faf50e004568e08275547aef552" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "f6b6a87c39b18807447f8dbc33e8607e8bb43faf50e004568e08275547aef552", + "timestamp": "1708611169603962615", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "99083ea3b150bd5e7babfcb17d86d2a30b8a5a579c4f1c4ee7ede6e5308f1297", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708611156018439913", + "terms": { + "closingTimestamp": "1708611205", + "enactmentTimestamp": "1708611305", + "updateMarket": { + "marketId": "53d34c0b8cb45d0ff6232e605191b5d215fc8b0d949b2efb495dbf223448192d", + "changes": { + "instrument": { + "code": "SNX/USDT", + "name": "Synthetix / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708611305", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "OdAg9gmC7Ykqu81KBqJ2qfm3v7zgAyBMEQtuSI9QLaM=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708611305", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "snx.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "snx.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "snx.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "OdAg9gmC7Ykqu81KBqJ2qfm3v7zgAyBMEQtuSI9QLaM=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "snx.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "snx.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "snx.price" + } + ] + } + } + }, + "metadata": [ + "base:SNX", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-03T14:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "0", + "sourceWeights": [ + "0", + "0", + "1", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "OdAg9gmC7Ykqu81KBqJ2qfm3v7zgAyBMEQtuSI9QLaM=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "snx.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "snx.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "snx.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "f6b6a87c39b18807447f8dbc33e8607e8bb43faf50e004568e08275547aef552" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "f6b6a87c39b18807447f8dbc33e8607e8bb43faf50e004568e08275547aef552", + "timestamp": "1708611169603962615", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "9bdbe5796683c35ea3d163f628d4b065002598a6f399399f905403b866d8c69a", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708611156018439913", + "terms": { + "closingTimestamp": "1708611205", + "enactmentTimestamp": "1708611305", + "updateMarket": { + "marketId": "de0f57d1ec1e5f7868cc47bcab0aabf896a376e9db1c8bec83d00fda3cd53bd8", + "changes": { + "instrument": { + "code": "LDO/USDT", + "name": "Lido / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708611305", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "xj4qfzegTl5hTAcji+2yXcw4kn+6j+iQWXpZPAsvpK0=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708611305", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "ldo.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "ldo.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "ldo.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "xj4qfzegTl5hTAcji+2yXcw4kn+6j+iQWXpZPAsvpK0=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "ldo.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "ldo.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "ldo.price" + } + ] + } + } + }, + "metadata": [ + "base:LDO", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-04T15:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "0", + "sourceWeights": [ + "0", + "0", + "1", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "xj4qfzegTl5hTAcji+2yXcw4kn+6j+iQWXpZPAsvpK0=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "ldo.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "ldo.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "ldo.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "f6b6a87c39b18807447f8dbc33e8607e8bb43faf50e004568e08275547aef552" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "f6b6a87c39b18807447f8dbc33e8607e8bb43faf50e004568e08275547aef552", + "timestamp": "1708611169603962615", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "dcfdccbd0dde103102f8c39b69546a94aa927af23ce63dca8a3d365e173ae93b", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708613489405479152", + "terms": { + "closingTimestamp": "1708613547", + "enactmentTimestamp": "1708613647", + "newMarket": { + "changes": { + "instrument": { + "name": "Solana / Tether USD (Perpetual)", + "code": "SOL/USDT", + "perpetual": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708613647", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "7w2Lb9os66QdoV1AldHaOSoNL47Qxse8D0z6yMKAtW0=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708613647", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "sol.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "sol.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "sol.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.01", + "fundingRateUpperBound": "0.01", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "7w2Lb9os66QdoV1AldHaOSoNL47Qxse8D0z6yMKAtW0=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "sol.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "sol.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "sol.price" + } + ] + } + } + }, + "decimalPlaces": "3", + "metadata": [ + "base:SOL", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-22T02:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.000009506426342, + "params": { + "r": 0.016, + "sigma": 1.5 + } + }, + "positionDecimalPlaces": "1", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.5" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_MEDIAN", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "7w2Lb9os66QdoV1AldHaOSoNL47Qxse8D0z6yMKAtW0=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "sol.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "sol.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "7w2Lb9os66QdoV1AldHaOSoNL47Qxse8D0z6yMKAtW0=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "sol.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "sol.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "sol.price" + }, + { + "priceSourceProperty": "sol.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Create SOL/USDT market", + "title": "Create SOL/USDT market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "batchId": "ba2f50e0d95e5ff77a95c84ac4c63949895f7d17078ec14602c8eca900f5cc96" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "ba2f50e0d95e5ff77a95c84ac4c63949895f7d17078ec14602c8eca900f5cc96", + "timestamp": "1708613504511444455", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "02cf075abf8af872f05352a3606dd3772f6171231c0d60f82081e649c308fa55", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708697033649737018", + "terms": { + "closingTimestamp": "1708697065", + "enactmentTimestamp": "1708697165", + "updateMarketState": { + "changes": { + "marketId": "00788b763b999ef555ac5da17de155ff4237dd14aa6671a303d1285f27f094f0", + "updateType": "MARKET_STATE_UPDATE_TYPE_SUSPEND" + } + } + }, + "rationale": { + "description": "Suspend markets\n\t- BTC/USDT\n\t- SNX/USDT\n\t- LDO/USDT\n\t- ETH/USDT\n\t- BTC/USDT\n\t- SOL/USDT", + "title": "Suspend markets for mainnet proposal testing" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "9244935c5c4b36751648f619dc2cbe40136af165746ff47cb8b696cbda55d92d" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "9244935c5c4b36751648f619dc2cbe40136af165746ff47cb8b696cbda55d92d", + "timestamp": "1708697058734103887", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "96e32c128ae1d04324d841bb396a67f2244f208d4e628534086acda3de551c14", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708697033649737018", + "terms": { + "closingTimestamp": "1708697065", + "enactmentTimestamp": "1708697165", + "updateMarketState": { + "changes": { + "marketId": "53d34c0b8cb45d0ff6232e605191b5d215fc8b0d949b2efb495dbf223448192d", + "updateType": "MARKET_STATE_UPDATE_TYPE_SUSPEND" + } + } + }, + "rationale": { + "description": "Suspend markets\n\t- BTC/USDT\n\t- SNX/USDT\n\t- LDO/USDT\n\t- ETH/USDT\n\t- BTC/USDT\n\t- SOL/USDT", + "title": "Suspend markets for mainnet proposal testing" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "9244935c5c4b36751648f619dc2cbe40136af165746ff47cb8b696cbda55d92d" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "9244935c5c4b36751648f619dc2cbe40136af165746ff47cb8b696cbda55d92d", + "timestamp": "1708697058734103887", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "97ed4683c58423a0db7426a0b729416a5059c417ac59a142d09c68c22b6bacf0", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708697033649737018", + "terms": { + "closingTimestamp": "1708697065", + "enactmentTimestamp": "1708697165", + "updateMarketState": { + "changes": { + "marketId": "de0f57d1ec1e5f7868cc47bcab0aabf896a376e9db1c8bec83d00fda3cd53bd8", + "updateType": "MARKET_STATE_UPDATE_TYPE_SUSPEND" + } + } + }, + "rationale": { + "description": "Suspend markets\n\t- BTC/USDT\n\t- SNX/USDT\n\t- LDO/USDT\n\t- ETH/USDT\n\t- BTC/USDT\n\t- SOL/USDT", + "title": "Suspend markets for mainnet proposal testing" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "9244935c5c4b36751648f619dc2cbe40136af165746ff47cb8b696cbda55d92d" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "9244935c5c4b36751648f619dc2cbe40136af165746ff47cb8b696cbda55d92d", + "timestamp": "1708697058734103887", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "7e079038a57e6fb1f3ccf5eee56e73596b630d54a130a565e1a2deebcc95c173", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708697033649737018", + "terms": { + "closingTimestamp": "1708697065", + "enactmentTimestamp": "1708697165", + "updateMarketState": { + "changes": { + "marketId": "ac7fc86bddf26748c6ba32a67037fe13c623cd4b53480aac4eaf29fbbd22ac31", + "updateType": "MARKET_STATE_UPDATE_TYPE_SUSPEND" + } + } + }, + "rationale": { + "description": "Suspend markets\n\t- BTC/USDT\n\t- SNX/USDT\n\t- LDO/USDT\n\t- ETH/USDT\n\t- BTC/USDT\n\t- SOL/USDT", + "title": "Suspend markets for mainnet proposal testing" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "9244935c5c4b36751648f619dc2cbe40136af165746ff47cb8b696cbda55d92d" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "9244935c5c4b36751648f619dc2cbe40136af165746ff47cb8b696cbda55d92d", + "timestamp": "1708697058734103887", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "c8d389067fcc34a8aa73024585a9c23af8a2a7c6e9d6546dac8107b6a76a5fef", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708697033649737018", + "terms": { + "closingTimestamp": "1708697065", + "enactmentTimestamp": "1708697165", + "updateMarketState": { + "changes": { + "marketId": "dcfdccbd0dde103102f8c39b69546a94aa927af23ce63dca8a3d365e173ae93b", + "updateType": "MARKET_STATE_UPDATE_TYPE_SUSPEND" + } + } + }, + "rationale": { + "description": "Suspend markets\n\t- BTC/USDT\n\t- SNX/USDT\n\t- LDO/USDT\n\t- ETH/USDT\n\t- BTC/USDT\n\t- SOL/USDT", + "title": "Suspend markets for mainnet proposal testing" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "9244935c5c4b36751648f619dc2cbe40136af165746ff47cb8b696cbda55d92d" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "9244935c5c4b36751648f619dc2cbe40136af165746ff47cb8b696cbda55d92d", + "timestamp": "1708697058734103887", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "d141945ceb47cc519dc62b17bf8323911091c789f4b8601fd5ab5b8618233c60", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708698056341644342", + "terms": { + "closingTimestamp": "1708698554", + "enactmentTimestamp": "1708698604", + "updateMarket": { + "marketId": "00788b763b999ef555ac5da17de155ff4237dd14aa6671a303d1285f27f094f0", + "changes": { + "instrument": { + "code": "BTC/USDT", + "name": "Bitcoin / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708698604", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708698604", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "btc.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.001", + "fundingRateUpperBound": "0.001", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "btc.price" + } + ] + } + } + }, + "metadata": [ + "base:BTC", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2023-12-01T18:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.000003995, + "params": { + "sigma": 1 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.75", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_MEDIAN", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "btc.price" + }, + { + "priceSourceProperty": "btc.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "65cac1cf2b58f7a9d2e24cca31054c0946dfda81666876b61a33aba36ca3b9ff" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "65cac1cf2b58f7a9d2e24cca31054c0946dfda81666876b61a33aba36ca3b9ff", + "timestamp": "1708698317624339309", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "df14158b9c28334230cedebd8975b7085268e244ec0e495441297d3269c86199", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708698056341644342", + "terms": { + "closingTimestamp": "1708698554", + "enactmentTimestamp": "1708698604", + "updateMarket": { + "marketId": "ac7fc86bddf26748c6ba32a67037fe13c623cd4b53480aac4eaf29fbbd22ac31", + "changes": { + "instrument": { + "code": "ETH/USDT", + "name": "Ether / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708698604", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708698604", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "eth.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.001", + "fundingRateUpperBound": "0.001", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "eth.price" + } + ] + } + } + }, + "metadata": [ + "base:ETH", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2023-11-19T02:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.000009506426342, + "params": { + "r": 0.016, + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.75", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_MEDIAN", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "eth.price" + }, + { + "priceSourceProperty": "eth.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "65cac1cf2b58f7a9d2e24cca31054c0946dfda81666876b61a33aba36ca3b9ff" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "65cac1cf2b58f7a9d2e24cca31054c0946dfda81666876b61a33aba36ca3b9ff", + "timestamp": "1708698317624339309", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "0e452adbbae3165ce4000bfce13b214deb9326ac6b97f2baa455d13a8e26842e", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708698056341644342", + "terms": { + "closingTimestamp": "1708698554", + "enactmentTimestamp": "1708698604", + "updateMarket": { + "marketId": "279b6e238a2af1e057e63e24bc5a503dea0f86036fb6e5a6adce7bf93dec0f64", + "changes": { + "instrument": { + "code": "INJ/USDT", + "name": "Injective / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708698604", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "elvB0rVq0CkEjNY5ZLOtJ3bq34Eu3BpDoxQGy1S/9ZI=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708698604", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "inj.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "inj.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "inj.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.001", + "fundingRateUpperBound": "0.001", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "elvB0rVq0CkEjNY5ZLOtJ3bq34Eu3BpDoxQGy1S/9ZI=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "inj.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "inj.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "inj.price" + } + ] + } + } + }, + "metadata": [ + "base:INJ", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-04T15:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.75", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "0", + "sourceWeights": [ + "0", + "0", + "1", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "elvB0rVq0CkEjNY5ZLOtJ3bq34Eu3BpDoxQGy1S/9ZI=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "inj.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "inj.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "inj.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "65cac1cf2b58f7a9d2e24cca31054c0946dfda81666876b61a33aba36ca3b9ff" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "65cac1cf2b58f7a9d2e24cca31054c0946dfda81666876b61a33aba36ca3b9ff", + "timestamp": "1708698317624339309", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "06f95b6116a956b18b081f1fb84b97809736fb1bb720034544dfe3257c6732dc", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708698056341644342", + "terms": { + "closingTimestamp": "1708698554", + "enactmentTimestamp": "1708698604", + "updateMarket": { + "marketId": "53d34c0b8cb45d0ff6232e605191b5d215fc8b0d949b2efb495dbf223448192d", + "changes": { + "instrument": { + "code": "SNX/USDT", + "name": "Synthetix / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708698604", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "OdAg9gmC7Ykqu81KBqJ2qfm3v7zgAyBMEQtuSI9QLaM=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708698604", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "snx.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "snx.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "snx.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.001", + "fundingRateUpperBound": "0.001", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "OdAg9gmC7Ykqu81KBqJ2qfm3v7zgAyBMEQtuSI9QLaM=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "snx.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "snx.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "snx.price" + } + ] + } + } + }, + "metadata": [ + "base:SNX", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-03T14:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.75", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "0", + "sourceWeights": [ + "0", + "0", + "1", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "OdAg9gmC7Ykqu81KBqJ2qfm3v7zgAyBMEQtuSI9QLaM=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "snx.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "snx.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "snx.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "65cac1cf2b58f7a9d2e24cca31054c0946dfda81666876b61a33aba36ca3b9ff" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "65cac1cf2b58f7a9d2e24cca31054c0946dfda81666876b61a33aba36ca3b9ff", + "timestamp": "1708698317624339309", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "ce885bb8c978a348ec70e870d8a2f857312640bec44ab49ce256f839bc540c04", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708698056341644342", + "terms": { + "closingTimestamp": "1708698554", + "enactmentTimestamp": "1708698604", + "updateMarket": { + "marketId": "de0f57d1ec1e5f7868cc47bcab0aabf896a376e9db1c8bec83d00fda3cd53bd8", + "changes": { + "instrument": { + "code": "LDO/USDT", + "name": "Lido / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708698604", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "xj4qfzegTl5hTAcji+2yXcw4kn+6j+iQWXpZPAsvpK0=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708698604", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "ldo.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "ldo.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "ldo.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "0.00001", + "fundingRateLowerBound": "-0.001", + "fundingRateUpperBound": "0.001", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "xj4qfzegTl5hTAcji+2yXcw4kn+6j+iQWXpZPAsvpK0=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "ldo.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "ldo.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "ldo.price" + } + ] + } + } + }, + "metadata": [ + "base:LDO", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-04T15:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.75", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "0", + "sourceWeights": [ + "0", + "0", + "1", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "xj4qfzegTl5hTAcji+2yXcw4kn+6j+iQWXpZPAsvpK0=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "ldo.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "ldo.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "ldo.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD", + "title": "Update Markets to support new v0.74.x features" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "65cac1cf2b58f7a9d2e24cca31054c0946dfda81666876b61a33aba36ca3b9ff" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "65cac1cf2b58f7a9d2e24cca31054c0946dfda81666876b61a33aba36ca3b9ff", + "timestamp": "1708698317624339309", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "f869f287ab8e8fb6cf2bccb9fb17db2c19e1841f7532b29b15a769e91d7076cf", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708699084520350553", + "terms": { + "closingTimestamp": "1708699354", + "enactmentTimestamp": "1708699384", + "updateMarketState": { + "changes": { + "marketId": "00788b763b999ef555ac5da17de155ff4237dd14aa6671a303d1285f27f094f0", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba", + "timestamp": "1708699106158721669", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "016e48cfd05d44d09d5b40d62dfdf8e811c0bcb62a920090fe954c7c6db03c93", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708699084520350553", + "terms": { + "closingTimestamp": "1708699354", + "enactmentTimestamp": "1708699384", + "updateMarketState": { + "changes": { + "marketId": "279b6e238a2af1e057e63e24bc5a503dea0f86036fb6e5a6adce7bf93dec0f64", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba", + "timestamp": "1708699106158721669", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "70bd06b9c74cfc3c28c70afa9737671c1f2f09000de9a2701e826a3afc4b51a8", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708699084520350553", + "terms": { + "closingTimestamp": "1708699354", + "enactmentTimestamp": "1708699384", + "updateMarketState": { + "changes": { + "marketId": "53d34c0b8cb45d0ff6232e605191b5d215fc8b0d949b2efb495dbf223448192d", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba", + "timestamp": "1708699106158721669", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "fd91e2a05385ac766e69c07879678cf077b5ad0b67da7ee638bb0b3b7379e369", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708699084520350553", + "terms": { + "closingTimestamp": "1708699354", + "enactmentTimestamp": "1708699384", + "updateMarketState": { + "changes": { + "marketId": "de0f57d1ec1e5f7868cc47bcab0aabf896a376e9db1c8bec83d00fda3cd53bd8", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba", + "timestamp": "1708699106158721669", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "14f05595dcdeea344dcd41d840e0354b6310401dff97e3ad7cd0e8ef5140dfac", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708699084520350553", + "terms": { + "closingTimestamp": "1708699354", + "enactmentTimestamp": "1708699384", + "updateMarketState": { + "changes": { + "marketId": "ac7fc86bddf26748c6ba32a67037fe13c623cd4b53480aac4eaf29fbbd22ac31", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba", + "timestamp": "1708699106158721669", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "9347918290bb33fa1b1c162408c0713147cf81e159615e37b639a39ab6b2e9ae", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708699084520350553", + "terms": { + "closingTimestamp": "1708699354", + "enactmentTimestamp": "1708699384", + "updateMarket": { + "marketId": "00788b763b999ef555ac5da17de155ff4237dd14aa6671a303d1285f27f094f0", + "changes": { + "instrument": { + "code": "BTC/USDT", + "name": "Bitcoin / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708699384", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708699384", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "btc.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "1", + "fundingRateLowerBound": "-0.001", + "fundingRateUpperBound": "0.001", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "btc.price" + } + ] + } + } + }, + "metadata": [ + "base:BTC", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2023-12-01T18:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.000003995, + "params": { + "sigma": 1 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.75", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_MEDIAN", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "5i32yLSoX+GmfbRNwS3l2zMPesZrctxliv7fD0pBW0M=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "btc.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "btc.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "btc.price" + }, + { + "priceSourceProperty": "btc.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba", + "timestamp": "1708699106158721669", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "01bd99739f551dda693b7537da85cecb12230c32efc2d71461dafc15539e44e5", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708699084520350553", + "terms": { + "closingTimestamp": "1708699354", + "enactmentTimestamp": "1708699384", + "updateMarket": { + "marketId": "ac7fc86bddf26748c6ba32a67037fe13c623cd4b53480aac4eaf29fbbd22ac31", + "changes": { + "instrument": { + "code": "ETH/USDT", + "name": "Ether / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708699384", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708699384", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "eth.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "1", + "fundingRateLowerBound": "-0.001", + "fundingRateUpperBound": "0.001", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "eth.price" + } + ] + } + } + }, + "metadata": [ + "base:ETH", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2023-11-19T02:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.000009506426342, + "params": { + "r": 0.016, + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.75", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_MEDIAN", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "/2FJGpMREt3xvYFHzRtkE3X3n1glEm1mVICHRjT9Cs4=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "eth.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "eth.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "eth.price" + }, + { + "priceSourceProperty": "eth.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba", + "timestamp": "1708699106158721669", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "f6c2f6697bcfb98099cc77d1d6bb56947ca1984f68ef7133c33a672e141c5f0c", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708699084520350553", + "terms": { + "closingTimestamp": "1708699354", + "enactmentTimestamp": "1708699384", + "updateMarket": { + "marketId": "279b6e238a2af1e057e63e24bc5a503dea0f86036fb6e5a6adce7bf93dec0f64", + "changes": { + "instrument": { + "code": "INJ/USDT", + "name": "Injective / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708699384", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "elvB0rVq0CkEjNY5ZLOtJ3bq34Eu3BpDoxQGy1S/9ZI=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708699384", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "inj.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "inj.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "inj.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "1", + "fundingRateLowerBound": "-0.001", + "fundingRateUpperBound": "0.001", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "elvB0rVq0CkEjNY5ZLOtJ3bq34Eu3BpDoxQGy1S/9ZI=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "inj.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "inj.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "inj.price" + } + ] + } + } + }, + "metadata": [ + "base:INJ", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-04T15:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.75", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "0", + "sourceWeights": [ + "0", + "0", + "1", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "elvB0rVq0CkEjNY5ZLOtJ3bq34Eu3BpDoxQGy1S/9ZI=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "inj.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "inj.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "inj.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba", + "timestamp": "1708699106158721669", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "cea4ef428dffd3a21b6ca18eb22677df5b0bcd2519fd3770b8512f0753bba854", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708699084520350553", + "terms": { + "closingTimestamp": "1708699354", + "enactmentTimestamp": "1708699384", + "updateMarket": { + "marketId": "53d34c0b8cb45d0ff6232e605191b5d215fc8b0d949b2efb495dbf223448192d", + "changes": { + "instrument": { + "code": "SNX/USDT", + "name": "Synthetix / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708699384", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "OdAg9gmC7Ykqu81KBqJ2qfm3v7zgAyBMEQtuSI9QLaM=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708699384", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "snx.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "snx.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "snx.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "1", + "fundingRateLowerBound": "-0.001", + "fundingRateUpperBound": "0.001", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "OdAg9gmC7Ykqu81KBqJ2qfm3v7zgAyBMEQtuSI9QLaM=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "snx.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "snx.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "snx.price" + } + ] + } + } + }, + "metadata": [ + "base:SNX", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-03T14:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.75", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "0", + "sourceWeights": [ + "0", + "0", + "1", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "OdAg9gmC7Ykqu81KBqJ2qfm3v7zgAyBMEQtuSI9QLaM=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "snx.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "snx.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "snx.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba", + "timestamp": "1708699106158721669", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "aedc2873b02d71714a852dc1a6ac91012c1a4711d4a8126ac0f7fc5de747010d", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708699084520350553", + "terms": { + "closingTimestamp": "1708699354", + "enactmentTimestamp": "1708699384", + "updateMarket": { + "marketId": "de0f57d1ec1e5f7868cc47bcab0aabf896a376e9db1c8bec83d00fda3cd53bd8", + "changes": { + "instrument": { + "code": "LDO/USDT", + "name": "Lido / Tether USD (Perpetual)", + "perpetual": { + "quoteName": "USDT", + "marginFundingFactor": "0.9", + "interestRate": "0.1095", + "clampLowerBound": "-0.0005", + "clampUpperBound": "0.0005", + "dataSourceSpecForSettlementSchedule": { + "internal": { + "timeTrigger": { + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ], + "triggers": [ + { + "initial": "1708699384", + "every": "28800" + } + ] + } + } + }, + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "xj4qfzegTl5hTAcji+2yXcw4kn+6j+iQWXpZPAsvpK0=" + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708699384", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "ldo.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "ldo.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "ldo.price", + "settlementScheduleProperty": "vegaprotocol.builtin.timetrigger" + }, + "fundingRateScalingFactor": "1", + "fundingRateLowerBound": "-0.001", + "fundingRateUpperBound": "0.001", + "internalCompositePriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "50000000", + "sourceWeights": [ + "0", + "0.999", + "0.001", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "10m0s", + "10m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "xj4qfzegTl5hTAcji+2yXcw4kn+6j+iQWXpZPAsvpK0=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "ldo.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "ldo.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "ldo.price" + } + ] + } + } + }, + "metadata": [ + "base:LDO", + "quote:USDT", + "oracle:pyth", + "oracleChain:gnosis", + "class:fx/crypto", + "perpetual", + "sector:defi", + "enactment:2024-02-04T15:00:00Z" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "86400" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "180" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "120" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.000001, + "tau": 0.0000071, + "params": { + "sigma": 1.5 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.03", + "commitmentMinTimeFraction": "0.75", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "1", + "disposalFraction": "1", + "fullDisposalSize": "1000000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "0", + "sourceWeights": [ + "0", + "0", + "1", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED", + "dataSourcesSpec": [ + { + "external": { + "ethOracle": { + "address": "0x719abd606155442c21b7d561426d42bd0e40a776", + "abi": "[{\"inputs\": [{\"internalType\": \"bytes32\", \"name\": \"id\", \"type\": \"bytes32\"}], \"name\": \"getPrice\", \"outputs\": [{\"internalType\": \"int256\", \"name\": \"\", \"type\": \"int256\" }], \"stateMutability\": \"view\", \"type\": \"function\"}]", + "method": "getPrice", + "args": [ + { + "stringValue": "xj4qfzegTl5hTAcji+2yXcw4kn+6j+iQWXpZPAsvpK0=" + } + ], + "trigger": { + "timeTrigger": { + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "ldo.price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "ldo.price", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + } + ], + "dataSourcesSpecBinding": [ + { + "priceSourceProperty": "ldo.price" + } + ] + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "29dbc8065ab426b90d481cfbbe467a52da4f0db584c2b5e84762e21e8f5823ba", + "timestamp": "1708699106158721669", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "79bf55147ec90be6c0b1c4486dd0b045f1191f1a30d82e946bbc78044fa91d2d", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_FAILED", + "timestamp": "1708700888539235021", + "terms": { + "closingTimestamp": "1708701086", + "enactmentTimestamp": "1708701086", + "updateMarketState": { + "changes": { + "marketId": "00788b763b999ef555ac5da17de155ff4237dd14aa6671a303d1285f27f094f0", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + } + }, + "reason": "PROPOSAL_ERROR_INVALID_MARKET_STATE_UPDATE", + "errorDetails": "invalid state update request. Market for resume is not suspended", + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "6232d4351f88cfdafe2b211b0dfe342082526bfa9cf21f254b776565c67446a8" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "6232d4351f88cfdafe2b211b0dfe342082526bfa9cf21f254b776565c67446a8", + "timestamp": "1708700914340081051", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "3cd2ce6615ea36e4897dff9addbb65748caed0b5413ee3399a4ff4d178f45976", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_FAILED", + "timestamp": "1708700888539235021", + "terms": { + "closingTimestamp": "1708701086", + "enactmentTimestamp": "1708701086", + "updateMarketState": { + "changes": { + "marketId": "279b6e238a2af1e057e63e24bc5a503dea0f86036fb6e5a6adce7bf93dec0f64", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + } + }, + "reason": "PROPOSAL_ERROR_INVALID_MARKET_STATE_UPDATE", + "errorDetails": "invalid state update request. Market for resume is not suspended", + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "6232d4351f88cfdafe2b211b0dfe342082526bfa9cf21f254b776565c67446a8" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "6232d4351f88cfdafe2b211b0dfe342082526bfa9cf21f254b776565c67446a8", + "timestamp": "1708700914340081051", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "0d4a9c73d35b894436c61f8ccdc1503aeda76dc6fe77b49cea28f3169aceba2d", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_FAILED", + "timestamp": "1708700888539235021", + "terms": { + "closingTimestamp": "1708701086", + "enactmentTimestamp": "1708701086", + "updateMarketState": { + "changes": { + "marketId": "53d34c0b8cb45d0ff6232e605191b5d215fc8b0d949b2efb495dbf223448192d", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + } + }, + "reason": "PROPOSAL_ERROR_INVALID_MARKET_STATE_UPDATE", + "errorDetails": "invalid state update request. Market for resume is not suspended", + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "6232d4351f88cfdafe2b211b0dfe342082526bfa9cf21f254b776565c67446a8" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "6232d4351f88cfdafe2b211b0dfe342082526bfa9cf21f254b776565c67446a8", + "timestamp": "1708700914340081051", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "2c62d91e07c964fba84c243e397daeeee077290791267486178d447f37a409a9", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_FAILED", + "timestamp": "1708700888539235021", + "terms": { + "closingTimestamp": "1708701086", + "enactmentTimestamp": "1708701086", + "updateMarketState": { + "changes": { + "marketId": "de0f57d1ec1e5f7868cc47bcab0aabf896a376e9db1c8bec83d00fda3cd53bd8", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + } + }, + "reason": "PROPOSAL_ERROR_INVALID_MARKET_STATE_UPDATE", + "errorDetails": "invalid state update request. Market for resume is not suspended", + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "6232d4351f88cfdafe2b211b0dfe342082526bfa9cf21f254b776565c67446a8" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "6232d4351f88cfdafe2b211b0dfe342082526bfa9cf21f254b776565c67446a8", + "timestamp": "1708700914340081051", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "89169d2fed4538d12559cb9e99acb9e77c55fda0244dcfbc52816e188fa50862", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_FAILED", + "timestamp": "1708700888539235021", + "terms": { + "closingTimestamp": "1708701086", + "enactmentTimestamp": "1708701086", + "updateMarketState": { + "changes": { + "marketId": "ac7fc86bddf26748c6ba32a67037fe13c623cd4b53480aac4eaf29fbbd22ac31", + "updateType": "MARKET_STATE_UPDATE_TYPE_RESUME" + } + } + }, + "reason": "PROPOSAL_ERROR_INVALID_MARKET_STATE_UPDATE", + "errorDetails": "invalid state update request. Market for resume is not suspended", + "rationale": { + "description": "Update market BTC/USD and ETH/USD to set the fundingRateScalingFactor to 1.0 in both market. Also add two market state proposal to resume trading on both markets", + "title": "Update Markets and resume trading on BTC/USD and ETH/USD" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "6232d4351f88cfdafe2b211b0dfe342082526bfa9cf21f254b776565c67446a8" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "6232d4351f88cfdafe2b211b0dfe342082526bfa9cf21f254b776565c67446a8", + "timestamp": "1708700914340081051", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "de99c2f716f24bb3db2f79bbc9577341d7e1d5c3b08d935a9ef21acffd2fa8c9", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708703522612080032", + "terms": { + "closingTimestamp": "1708703672", + "enactmentTimestamp": "1708703732", + "updateNetworkParameter": { + "changes": { + "key": "ethereum.oracles.enabled", + "value": "1" + } + } + }, + "rationale": { + "description": "## Summary\n\nThis proposal requests to change Eth oracle/.\n\n## Rationale\n\n- Reason 1.\n- Reason 2. \n- Reason 3.\n- Reason 4.", + "title": "Eth oracle" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "de99c2f716f24bb3db2f79bbc9577341d7e1d5c3b08d935a9ef21acffd2fa8c9", + "timestamp": "1708703600214609660", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "2723a7ada65b9637636ffd9dc5bbf1794e008463709727f21c88dff648330601", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708705195428299422", + "terms": { + "closingTimestamp": "1708705384", + "enactmentTimestamp": "1708705444", + "newMarket": { + "changes": { + "instrument": { + "name": "Oranges Daily UMA", + "code": "UMA.24h", + "future": { + "settlementAsset": "b340c130096819428a62e5df407fd6abe66e444b89ad64f670beb98621c9c663", + "quoteName": "tDAI", + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x9Dc85d557BF18441F20a2fC292730f956eC43466", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct SettlementOracle.Identifier\",\"components\":[{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "enactmentDate": { + "stringValue": "2024-02-22T02:00:00Z" + }, + "marketCode": { + "stringValue": "SOL/USDT" + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708705444", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "price", + "expression": "$[1]" + }, + { + "name": "resolved", + "expression": "$[0]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "ethOracle": { + "address": "0x7D6aa06a128f161945cD6aa6b267738f3e542551", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct TerminationOracle.Identifier\",\"components\":[{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"conditionalSettlementOracle\",\"type\":\"address\",\"internalType\":\"contract SettlementOracle\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "conditionalSettlementOracle": { + "stringValue": "0x9Dc85d557BF18441F20a2fC292730f956eC43466" + }, + "enactmentDate": { + "stringValue": "2024-02-22T02:00:00Z" + }, + "marketCode": { + "stringValue": "SOL/USDT" + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708705444", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "resolved", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + }, + { + "key": { + "name": "vegaprotocol.builtin.timestamp", + "type": "TYPE_TIMESTAMP" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "1708705804" + } + ] + }, + { + "key": { + "name": "terminated", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ], + "normalisers": [ + { + "name": "resolved", + "expression": "$[0]" + }, + { + "name": "terminated", + "expression": "$[2]" + }, + { + "name": "terminationTimestamp", + "expression": "$[1]" + } + ], + "sourceChainId": "100" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "price", + "tradingTerminationProperty": "terminated" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "enactment:2024-02-29T17:20:46Z", + "settlement:2024-02-28T17:20:46Z", + "source:docs.vega.xyz" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "1" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.00001, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.15 + } + }, + "positionDecimalPlaces": "5", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.1", + "commitmentMinTimeFraction": "0.1", + "performanceHysteresisEpochs": "10", + "slaCompetitionFactor": "0.2" + }, + "liquidityFeeSettings": { + "method": "METHOD_CONSTANT", + "feeConstant": "0.00005" + }, + "liquidationStrategy": { + "disposalTimeStep": "500", + "disposalFraction": "1", + "fullDisposalSize": "18446744073709551615", + "maxFractionConsumed": "1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "5000000", + "sourceWeights": [ + "0", + "1", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "UMA Oranges 35", + "title": "UMA Orange GO Johnny GOO" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "2723a7ada65b9637636ffd9dc5bbf1794e008463709727f21c88dff648330601", + "timestamp": "1708705205875565096", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "67761584ec650f06d47dc1af5d8c2ed6f789dc62395a1c330465153e861b5d75", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708963390186337803", + "terms": { + "closingTimestamp": "1708963565", + "enactmentTimestamp": "1708963565", + "updateNetworkParameter": { + "changes": { + "key": "blockchains.ethereumRpcAndEvmCompatDataSourcesConfig", + "value": "{\"configs\":[{\"network_id\":\"100\",\"chain_id\":\"100\",\"confirmations\":3,\"name\":\"Gnosis Chain\", \"block_interval\": 3}, {\"network_id\":\"42161\",\"chain_id\":\"42161\",\"confirmations\":3,\"name\":\"Arbitrum One\", \"block_interval\": 50},{\"network_id\":\"5\",\"chain_id\":\"5\",\"confirmations\":3,\"name\":\"Goerli\", \"block_interval\": 50}]}" + } + } + }, + "rationale": { + "description": "Add goerli network", + "title": "Add goerli network" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5", + "batchId": "0e90cae18ba86193ec8c248dd77b564c3e68701892cfb3e2c65a3d8c4b1b7cc6" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "0e90cae18ba86193ec8c248dd77b564c3e68701892cfb3e2c65a3d8c4b1b7cc6", + "timestamp": "1708963483063914706", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "cb89c79627e41579a7bffeb6d0e18fa0cb852019bd9f31a8b73c8a981caeebb4", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708963977883810738", + "terms": { + "closingTimestamp": "1708964081", + "enactmentTimestamp": "1708964081", + "updateNetworkParameter": { + "changes": { + "key": "blockchains.ethereumRpcAndEvmCompatDataSourcesConfig", + "value": "{\"configs\":[{\"network_id\":\"100\",\"chain_id\":\"100\",\"confirmations\":3,\"name\":\"Gnosis Chain\", \"block_interval\": 3}, {\"network_id\":\"42161\",\"chain_id\":\"42161\",\"confirmations\":3,\"name\":\"Arbitrum One\", \"block_interval\": 50},{\"network_id\":\"5\",\"chain_id\":\"5\",\"confirmations\":3,\"name\":\"Goerli\", \"block_interval\": 3}]}" + } + } + }, + "rationale": { + "description": "Add goerli network", + "title": "Add goerli network" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5", + "batchId": "3f00da99f2bb65121bfd52070c0e8e37867a7d7665910f2953a791601332d44c" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "3f00da99f2bb65121bfd52070c0e8e37867a7d7665910f2953a791601332d44c", + "timestamp": "1708964001596197500", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "b07b8b6ec7b65686dc5cd695a115b3197a388d5828e6e06ee2edf2c30d50a853", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708966073892953356", + "terms": { + "closingTimestamp": "1708966220", + "enactmentTimestamp": "1708966320", + "newMarket": { + "changes": { + "instrument": { + "name": "UMA settlement", + "code": "UMA.24h", + "future": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USDC", + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0xFe6Cbc9179a68f1029570269cF41333B9911b831", + "abi": "[{\"inputs\":[{\"components\":[{\"internalType\":\"contract IERC20\",\"name\":\"bondCurrency\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minimumBond\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumBond\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"liveness\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"marketCode\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"quoteName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"enactmentDate\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ipfsLink\",\"type\":\"string\"},{\"internalType\":\"contract SettlementOracle\",\"name\":\"conditionalSettlementOracle\",\"type\":\"address\"}],\"internalType\":\"struct TerminationOracle.Identifier\",\"name\":\"identifier\",\"type\":\"tuple\"}],\"name\":\"getData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6" + }, + "enactmentDate": { + "stringValue": "2024-02-22T02:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:foo.bar" + }, + "liveness": { + "numberValue": 120 + }, + "marketCode": { + "stringValue": "SOL/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 1000000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708966320", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "price", + "expression": "$[1]" + }, + { + "name": "resolved", + "expression": "$[0]" + } + ], + "sourceChainId": "5" + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "ethOracle": { + "address": "0xfe6cbc9179a68f1029570269cf41333b9911b831", + "abi": "[{\"inputs\":[{\"components\":[{\"internalType\":\"contract IERC20\",\"name\":\"bondCurrency\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minimumBond\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumBond\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"liveness\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"marketCode\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"quoteName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"enactmentDate\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ipfsLink\",\"type\":\"string\"},{\"internalType\":\"contract SettlementOracle\",\"name\":\"conditionalSettlementOracle\",\"type\":\"address\"}],\"internalType\":\"struct TerminationOracle.Identifier\",\"name\":\"identifier\",\"type\":\"tuple\"}],\"name\":\"getData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6" + }, + "enactmentDate": { + "stringValue": "2024-02-22T02:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:foo.bar" + }, + "liveness": { + "numberValue": 120 + }, + "marketCode": { + "stringValue": "SOL/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 1000000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708966320", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "resolved", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + }, + { + "key": { + "name": "terminated", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ], + "normalisers": [ + { + "name": "resolved", + "expression": "$[0]" + }, + { + "name": "terminated", + "expression": "$[2]" + } + ], + "sourceChainId": "5" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "price", + "tradingTerminationProperty": "terminated" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "enactment:2024-02-29T17:20:46Z", + "settlement:2024-02-28T17:20:46Z", + "source:docs.vega.xyz" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "43200", + "probability": "0.9999999", + "auctionExtension": "1" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.00001, + "tau": 0.0001140771161, + "params": { + "r": 0.016, + "sigma": 0.15 + } + }, + "positionDecimalPlaces": "5", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.1", + "commitmentMinTimeFraction": "0.1", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.2" + }, + "liquidityFeeSettings": { + "method": "METHOD_CONSTANT", + "feeConstant": "0.00005" + }, + "liquidationStrategy": { + "disposalTimeStep": "500", + "disposalFraction": "1", + "fullDisposalSize": "18446744073709551615", + "maxFractionConsumed": "1" + }, + "markPriceConfiguration": { + "decayWeight": "1", + "decayPower": "1", + "cashAmount": "5000000", + "sourceWeights": [ + "0", + "1", + "0" + ], + "sourceStalenessTolerance": [ + "1m0s", + "1m0s", + "1m0s" + ], + "compositePriceType": "COMPOSITE_PRICE_TYPE_WEIGHTED" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Create UMA sample market", + "title": "Create UMA sample market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "batchId": "db1c8d942b368d7599c0ecf5eae8b591eab2f1dca579b4bdbc6d2e948429b9fa" + }, + "yes": [ + { + "partyId": "134e5b2fdf11352a85511ec1ae5c0f876977f4bffd52ad08aa04836bf6bf8585", + "value": "VALUE_YES", + "proposalId": "db1c8d942b368d7599c0ecf5eae8b591eab2f1dca579b4bdbc6d2e948429b9fa", + "timestamp": "1708966096608820045", + "totalGovernanceTokenBalance": "9876000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "6951b419300086dd99a8e8183c6aa7d630c7a828fbf7c2bf4ffabeb134ea9ba4", + "reference": "**TO_UPDATE_OR_REMOVE**", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1708967601934960698", + "terms": { + "closingTimestamp": "1708967727", + "enactmentTimestamp": "1708967827", + "newMarket": { + "changes": { + "instrument": { + "name": "DogePoint / USDT (Points future market)", + "code": "DOGEP/USDT.POINTS", + "future": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USDT", + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0xB92997f94F4F3caCe123B13627EB68AdC3B7b091", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct SettlementOracle.Identifier\",\"components\":[{\"name\":\"liveness\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"bondCurrency\",\"type\":\"address\",\"internalType\":\"contract IERC20\"},{\"name\":\"minimumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"ipfsLink\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6" + }, + "enactmentDate": { + "stringValue": "2024-02-22T02:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:foo.bar" + }, + "liveness": { + "numberValue": 120 + }, + "marketCode": { + "stringValue": "SOL/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 1000000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708967827", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "price", + "expression": "$[1]" + }, + { + "name": "resolved", + "expression": "$[0]" + } + ], + "sourceChainId": "5" + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "ethOracle": { + "address": "0xfe6cbc9179a68f1029570269cf41333b9911b831", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct TerminationOracle.Identifier\",\"components\":[{\"name\":\"bondCurrency\",\"type\":\"address\",\"internalType\":\"contract IERC20\"},{\"name\":\"minimumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"liveness\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"ipfsLink\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"conditionalSettlementOracle\",\"type\":\"address\",\"internalType\":\"contract SettlementOracle\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6" + }, + "conditionalSettlementOracle": { + "stringValue": "0xB92997f94F4F3caCe123B13627EB68AdC3B7b091" + }, + "enactmentDate": { + "stringValue": "2024-02-22T02:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:foo.bar" + }, + "liveness": { + "numberValue": 120 + }, + "marketCode": { + "stringValue": "SOL/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 1000000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1708967827", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "resolved", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + }, + { + "key": { + "name": "terminated", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ], + "normalisers": [ + { + "name": "resolved", + "expression": "$[0]" + }, + { + "name": "terminated", + "expression": "$[2]" + } + ], + "sourceChainId": "5" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "price", + "tradingTerminationProperty": "terminated" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "base:DOGEPOINT", + "quote:USDT", + "enactment:2024-02-29T17:20:46Z", + "settlement:fromOracle", + "class:fx/crypto", + "oracle:uma", + "sector:defi", + "oracleChain:arbitrum" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "172800" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "1200" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.0001, + "tau": 0.002734, + "params": { + "sigma": 3 + } + }, + "positionDecimalPlaces": "-2", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.2", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_CONSTANT", + "feeConstant": "0.00005" + }, + "liquidationStrategy": { + "disposalTimeStep": "5", + "disposalFraction": "0.1", + "fullDisposalSize": "100", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "0", + "cashAmount": "0", + "compositePriceType": "COMPOSITE_PRICE_TYPE_LAST_TRADE" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Create UMA sample market", + "title": "Create UMA sample market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "batchId": "049c55ce0054c7e4848961a32aa6f5fda59b3d72d003b4d5b2e88cd8f5902c26" + }, + "yes": [ + { + "partyId": "134e5b2fdf11352a85511ec1ae5c0f876977f4bffd52ad08aa04836bf6bf8585", + "value": "VALUE_YES", + "proposalId": "049c55ce0054c7e4848961a32aa6f5fda59b3d72d003b4d5b2e88cd8f5902c26", + "timestamp": "1708967632329647775", + "totalGovernanceTokenBalance": "9876000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "695eb069a7a5d7fa355c7ca2e4258a97d142a400b8585bb23341067144590243", + "reference": "update-btc-b-team", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1709032580246746071", + "terms": { + "closingTimestamp": "1709032784", + "enactmentTimestamp": "1709032884", + "updateMarket": { + "marketId": "6951b419300086dd99a8e8183c6aa7d630c7a828fbf7c2bf4ffabeb134ea9ba4", + "changes": { + "instrument": { + "code": "DOGEP/USDT.POINTS", + "name": "DogePoint / USDT (Points future market)", + "future": { + "quoteName": "USDT", + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0xB49281A7F7878Cdf5B6378d8c7dC211Ffc1b5B60", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct SettlementOracle.Identifier\",\"components\":[{\"name\":\"liveness\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"bondCurrency\",\"type\":\"address\",\"internalType\":\"contract IERC20\"},{\"name\":\"minimumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"ipfsLink\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6" + }, + "enactmentDate": { + "stringValue": "2024-02-22T02:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:foo.bar" + }, + "liveness": { + "numberValue": 120 + }, + "marketCode": { + "stringValue": "SOL/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 1000000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1709032884", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "price", + "expression": "$[1]" + }, + { + "name": "resolved", + "expression": "$[0]" + } + ], + "sourceChainId": "5" + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "ethOracle": { + "address": "0xB92997f94F4F3caCe123B13627EB68AdC3B7b091", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct TerminationOracle.Identifier\",\"components\":[{\"name\":\"bondCurrency\",\"type\":\"address\",\"internalType\":\"contract IERC20\"},{\"name\":\"minimumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"liveness\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"ipfsLink\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"conditionalSettlementOracle\",\"type\":\"address\",\"internalType\":\"contract SettlementOracle\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6" + }, + "conditionalSettlementOracle": { + "stringValue": "0xB49281A7F7878Cdf5B6378d8c7dC211Ffc1b5B60" + }, + "enactmentDate": { + "stringValue": "2024-02-22T02:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:foo.bar" + }, + "liveness": { + "numberValue": 120 + }, + "marketCode": { + "stringValue": "SOL/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 1000000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1709032884", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "resolved", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + }, + { + "key": { + "name": "terminated", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ], + "normalisers": [ + { + "name": "resolved", + "expression": "$[0]" + }, + { + "name": "terminated", + "expression": "$[2]" + } + ], + "sourceChainId": "5" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "price", + "tradingTerminationProperty": "terminated" + } + } + }, + "metadata": [ + "base:DOGEPOINT", + "quote:USDT", + "enactment:2024-02-29T17:20:46Z", + "settlement:fromOracle", + "class:fx/crypto", + "oracle:uma", + "sector:defi", + "oracleChain:arbitrum" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "172800" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "1200" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.0001, + "tau": 0.002734, + "params": { + "sigma": 3 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.2", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_CONSTANT", + "feeConstant": "0.00005" + }, + "liquidationStrategy": { + "disposalTimeStep": "5", + "disposalFraction": "0.1", + "fullDisposalSize": "100", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "0", + "cashAmount": "0", + "compositePriceType": "COMPOSITE_PRICE_TYPE_LAST_TRADE" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update BTC-B-TEAM", + "title": "Update BTC-B-TEAM" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "134e5b2fdf11352a85511ec1ae5c0f876977f4bffd52ad08aa04836bf6bf8585", + "value": "VALUE_YES", + "proposalId": "695eb069a7a5d7fa355c7ca2e4258a97d142a400b8585bb23341067144590243", + "timestamp": "1709032607536490458", + "totalGovernanceTokenBalance": "9876000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "dcb23096047d592bfb1a8df19385403566ed750dad2e796ad21032ff8f785521", + "reference": "update-btc-b-team", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1709033808726123105", + "terms": { + "closingTimestamp": "1709033883", + "enactmentTimestamp": "1709033983", + "updateMarket": { + "marketId": "6951b419300086dd99a8e8183c6aa7d630c7a828fbf7c2bf4ffabeb134ea9ba4", + "changes": { + "instrument": { + "code": "DOGEP/USDT.POINTS", + "name": "DogePoint / USDT (Points future market)", + "future": { + "quoteName": "USDT", + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0xB49281A7F7878Cdf5B6378d8c7dC211Ffc1b5B60", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct SettlementOracle.Identifier\",\"components\":[{\"name\":\"liveness\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"bondCurrency\",\"type\":\"address\",\"internalType\":\"contract IERC20\"},{\"name\":\"minimumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"ipfsLink\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6" + }, + "enactmentDate": { + "stringValue": "2024-02-22T02:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:foo.bar" + }, + "liveness": { + "numberValue": 120 + }, + "marketCode": { + "stringValue": "SOL/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 1000000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1709033983", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "price", + "expression": "$[1]" + }, + { + "name": "resolved", + "expression": "$[0]" + } + ], + "sourceChainId": "5" + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "ethOracle": { + "address": "0x8744F73A5b404ef843A76A927dF89FE20ab071CB", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct TerminationOracle.Identifier\",\"components\":[{\"name\":\"bondCurrency\",\"type\":\"address\",\"internalType\":\"contract IERC20\"},{\"name\":\"minimumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"liveness\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"ipfsLink\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"conditionalSettlementOracle\",\"type\":\"address\",\"internalType\":\"contract SettlementOracle\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6" + }, + "conditionalSettlementOracle": { + "stringValue": "0xB49281A7F7878Cdf5B6378d8c7dC211Ffc1b5B60" + }, + "enactmentDate": { + "stringValue": "2024-02-22T02:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:foo.bar" + }, + "liveness": { + "numberValue": 120 + }, + "marketCode": { + "stringValue": "SOL/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 1000000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1709033983", + "every": "60" + } + }, + "requiredConfirmations": "3", + "filters": [ + { + "key": { + "name": "resolved", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + }, + { + "key": { + "name": "terminated", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ], + "normalisers": [ + { + "name": "resolved", + "expression": "$[0]" + }, + { + "name": "terminated", + "expression": "$[2]" + } + ], + "sourceChainId": "5" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "price", + "tradingTerminationProperty": "terminated" + } + } + }, + "metadata": [ + "base:DOGEPOINT", + "quote:USDT", + "enactment:2024-02-29T17:20:46Z", + "settlement:fromOracle", + "class:fx/crypto", + "oracle:uma", + "sector:defi", + "oracleChain:arbitrum" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "21600", + "probability": "0.9999999", + "auctionExtension": "172800" + }, + { + "horizon": "4320", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "1440", + "probability": "0.9999999", + "auctionExtension": "1200" + }, + { + "horizon": "360", + "probability": "0.9999999", + "auctionExtension": "300" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.0001, + "tau": 0.002734, + "params": { + "sigma": 3 + } + }, + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.2", + "commitmentMinTimeFraction": "0.85", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_CONSTANT", + "feeConstant": "0.00005" + }, + "liquidationStrategy": { + "disposalTimeStep": "5", + "disposalFraction": "0.1", + "fullDisposalSize": "100", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "0", + "cashAmount": "0", + "compositePriceType": "COMPOSITE_PRICE_TYPE_LAST_TRADE" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Update BTC-B-TEAM", + "title": "Update BTC-B-TEAM" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66" + }, + "yes": [ + { + "partyId": "134e5b2fdf11352a85511ec1ae5c0f876977f4bffd52ad08aa04836bf6bf8585", + "value": "VALUE_YES", + "proposalId": "dcb23096047d592bfb1a8df19385403566ed750dad2e796ad21032ff8f785521", + "timestamp": "1709033827307197153", + "totalGovernanceTokenBalance": "9876000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "68fbf3aad272c734e936174cdb1468af40badf709075b55042eae4368fc3abb3", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1709313344922849916", + "terms": { + "closingTimestamp": "1709313725", + "enactmentTimestamp": "1709313825", + "updateMarketState": { + "changes": { + "marketId": "53d34c0b8cb45d0ff6232e605191b5d215fc8b0d949b2efb495dbf223448192d", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Fix stagnet1", + "title": "Stagnet1 fix" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "b10fb7db9427d7628fba42bb7a69e12a64ac7008c1ed1a135835e52f58ea2321" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "b10fb7db9427d7628fba42bb7a69e12a64ac7008c1ed1a135835e52f58ea2321", + "timestamp": "1709313390616941018", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "d3a87b46881314d43cd3709acf4488a5b81a0801074215452785c4a416e24076", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1709313344922849916", + "terms": { + "closingTimestamp": "1709313725", + "enactmentTimestamp": "1709313825", + "updateMarketState": { + "changes": { + "marketId": "de0f57d1ec1e5f7868cc47bcab0aabf896a376e9db1c8bec83d00fda3cd53bd8", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Fix stagnet1", + "title": "Stagnet1 fix" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "b10fb7db9427d7628fba42bb7a69e12a64ac7008c1ed1a135835e52f58ea2321" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "b10fb7db9427d7628fba42bb7a69e12a64ac7008c1ed1a135835e52f58ea2321", + "timestamp": "1709313390616941018", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "e0667591990d1acd8f77e61b13d5c9a99ab46f193cb1b34e34c945cc1aee6012", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1709313344922849916", + "terms": { + "closingTimestamp": "1709313725", + "enactmentTimestamp": "1709313825", + "updateMarketState": { + "changes": { + "marketId": "dcfdccbd0dde103102f8c39b69546a94aa927af23ce63dca8a3d365e173ae93b", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Fix stagnet1", + "title": "Stagnet1 fix" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "b10fb7db9427d7628fba42bb7a69e12a64ac7008c1ed1a135835e52f58ea2321" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "b10fb7db9427d7628fba42bb7a69e12a64ac7008c1ed1a135835e52f58ea2321", + "timestamp": "1709313390616941018", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "04a75c86239304e31f544b835d65ba23c4607ee40a321e1dbf521c95f6ca2fcc", + "reference": "UPDATE_MARKET_LIKE_MAINNET", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1709313344922849916", + "terms": { + "closingTimestamp": "1709313725", + "enactmentTimestamp": "1709313825", + "updateMarketState": { + "changes": { + "marketId": "b07b8b6ec7b65686dc5cd695a115b3197a388d5828e6e06ee2edf2c30d50a853", + "updateType": "MARKET_STATE_UPDATE_TYPE_TERMINATE", + "price": "42377" + } + } + }, + "rationale": { + "description": "Fix stagnet1", + "title": "Stagnet1 fix" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "requiredLiquidityProviderParticipation": "0.00001", + "requiredLiquidityProviderMajority": "0.66", + "batchId": "b10fb7db9427d7628fba42bb7a69e12a64ac7008c1ed1a135835e52f58ea2321" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "b10fb7db9427d7628fba42bb7a69e12a64ac7008c1ed1a135835e52f58ea2321", + "timestamp": "1709313390616941018", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "397a7b58726b5d794a327df31b0827c85ed61733ff965dd67bdf871a3038acdc", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1709649169201167909", + "terms": { + "closingTimestamp": "1709649365", + "enactmentTimestamp": "1709649465", + "newMarket": { + "changes": { + "instrument": { + "name": "Doge Points 2 / USDT (Futures market)", + "code": "DOGEP2/USDT.POINTS", + "future": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USDT", + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x302461E6dBF45e59acb3BE9a9c84C0a997779612", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct SettlementOracle.Identifier\",\"components\":[{\"name\":\"liveness\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"bondCurrency\",\"type\":\"address\",\"internalType\":\"contract IERC20\"},{\"name\":\"minimumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"ipfsLink\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8" + }, + "enactmentDate": { + "stringValue": "2024-03-04T16:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:foo.bar" + }, + "liveness": { + "numberValue": 1 + }, + "marketCode": { + "stringValue": "DOGEP/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 500000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1709649465", + "every": "3600" + } + }, + "requiredConfirmations": "64", + "filters": [ + { + "key": { + "name": "resolved", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + }, + { + "key": { + "name": "price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "price", + "expression": "$[1]" + }, + { + "name": "resolved", + "expression": "$[0]" + } + ], + "sourceChainId": "42161" + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "ethOracle": { + "address": "0x6d0b3a00265b8b4a1d22cf466c331014133ba614", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct TerminationOracle.Identifier\",\"components\":[{\"name\":\"bondCurrency\",\"type\":\"address\",\"internalType\":\"contract IERC20\"},{\"name\":\"minimumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"liveness\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"ipfsLink\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"conditionalSettlementOracle\",\"type\":\"address\",\"internalType\":\"contract SettlementOracle\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8" + }, + "conditionalSettlementOracle": { + "stringValue": "0x302461E6dBF45e59acb3BE9a9c84C0a997779612" + }, + "enactmentDate": { + "stringValue": "2024-03-04T16:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:foo.bar" + }, + "liveness": { + "numberValue": 1 + }, + "marketCode": { + "stringValue": "DOGEP/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 500000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1709649465", + "every": "3600" + } + }, + "requiredConfirmations": "64", + "filters": [ + { + "key": { + "name": "resolved", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + }, + { + "key": { + "name": "terminated", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ], + "normalisers": [ + { + "name": "resolved", + "expression": "$[0]" + }, + { + "name": "terminated", + "expression": "$[2]" + } + ], + "sourceChainId": "42161" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "price", + "tradingTerminationProperty": "terminated" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "base:DOGEPOINT", + "quote:USDT", + "enactment:2024-03-04T16:00:00Z", + "settlement:fromOracle", + "class:fx/crypto", + "oracle:uma", + "sector:defi", + "oracleChain:arbitrum" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.0001, + "tau": 0.001368925394, + "params": { + "sigma": 5 + } + }, + "positionDecimalPlaces": "-2", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.2", + "commitmentMinTimeFraction": "0.5", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "5", + "disposalFraction": "0.1", + "fullDisposalSize": "10000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "0", + "cashAmount": "0", + "compositePriceType": "COMPOSITE_PRICE_TYPE_LAST_TRADE" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Create UMA sample market", + "title": "Create UMA sample market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "batchId": "651142d09c0662e8ce88686d47a62a53e8dc5663bf8847ef4429c870ab999b29" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "651142d09c0662e8ce88686d47a62a53e8dc5663bf8847ef4429c870ab999b29", + "timestamp": "1709649193631816901", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "c3e83bf7a5378989d9eee50d20012253a8adfc5fe09580c1f63346e5e38a858a", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1709649215618805040", + "terms": { + "closingTimestamp": "1709649465", + "enactmentTimestamp": "1709649495", + "newMarket": { + "changes": { + "instrument": { + "name": "Doge Points / USDT (Futures market)", + "code": "DOGEP/USDT.POINTS", + "future": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USDT", + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x302461E6dBF45e59acb3BE9a9c84C0a997779612", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct SettlementOracle.Identifier\",\"components\":[{\"name\":\"liveness\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"bondCurrency\",\"type\":\"address\",\"internalType\":\"contract IERC20\"},{\"name\":\"minimumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"ipfsLink\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8" + }, + "enactmentDate": { + "stringValue": "2024-03-04T16:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:foo.bar" + }, + "liveness": { + "numberValue": 1 + }, + "marketCode": { + "stringValue": "DOGEP/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 500000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1709649495", + "every": "3600" + } + }, + "requiredConfirmations": "64", + "filters": [ + { + "key": { + "name": "resolved", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + }, + { + "key": { + "name": "price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "price", + "expression": "$[1]" + }, + { + "name": "resolved", + "expression": "$[0]" + } + ], + "sourceChainId": "42161" + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "ethOracle": { + "address": "0x6d0b3a00265b8b4a1d22cf466c331014133ba614", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct TerminationOracle.Identifier\",\"components\":[{\"name\":\"bondCurrency\",\"type\":\"address\",\"internalType\":\"contract IERC20\"},{\"name\":\"minimumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"liveness\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"ipfsLink\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"conditionalSettlementOracle\",\"type\":\"address\",\"internalType\":\"contract SettlementOracle\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8" + }, + "conditionalSettlementOracle": { + "stringValue": "0x302461E6dBF45e59acb3BE9a9c84C0a997779612" + }, + "enactmentDate": { + "stringValue": "2024-03-04T16:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:foo.bar" + }, + "liveness": { + "numberValue": 1 + }, + "marketCode": { + "stringValue": "DOGEP/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 500000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1709649495", + "every": "3600" + } + }, + "requiredConfirmations": "64", + "filters": [ + { + "key": { + "name": "resolved", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + }, + { + "key": { + "name": "terminated", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ], + "normalisers": [ + { + "name": "resolved", + "expression": "$[0]" + }, + { + "name": "terminated", + "expression": "$[2]" + } + ], + "sourceChainId": "42161" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "price", + "tradingTerminationProperty": "terminated" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "base:DOGEPOINT", + "quote:USDT", + "enactment:2024-03-04T16:00:00Z", + "settlement:fromOracle", + "class:fx/crypto", + "oracle:uma", + "sector:defi", + "oracleChain:arbitrum" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 1.5865e-7, + "tau": 0.000009513, + "params": { + "sigma": 25 + } + }, + "positionDecimalPlaces": "-2", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.2", + "commitmentMinTimeFraction": "0.5", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "5", + "disposalFraction": "0.1", + "fullDisposalSize": "10000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "0", + "cashAmount": "0", + "compositePriceType": "COMPOSITE_PRICE_TYPE_LAST_TRADE" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Create UMA sample market", + "title": "Create UMA sample market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "batchId": "e50344792a58ae2151db87ce282b58d3dc14f9ac8c3210df4f6909e09b0b5be8" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "e50344792a58ae2151db87ce282b58d3dc14f9ac8c3210df4f6909e09b0b5be8", + "timestamp": "1709649242232206914", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "346d925ab76fca647e4dabb6f1e6ef9839e62a2b11a0f151368930613ce2108a", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1709651389423581194", + "terms": { + "closingTimestamp": "1709651585", + "enactmentTimestamp": "1709651685", + "newMarket": { + "changes": { + "instrument": { + "name": "Doge Points 2 / USDT (Futures market)", + "code": "DOGEP2/USDT.POINTS", + "future": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USDT", + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x302461E6dBF45e59acb3BE9a9c84C0a997779612", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct SettlementOracle.Identifier\",\"components\":[{\"name\":\"liveness\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"bondCurrency\",\"type\":\"address\",\"internalType\":\"contract IERC20\"},{\"name\":\"minimumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"ipfsLink\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8" + }, + "enactmentDate": { + "stringValue": "2024-03-04T16:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:bar.foo" + }, + "liveness": { + "numberValue": 1 + }, + "marketCode": { + "stringValue": "DOGEP/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 500000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1709651685", + "every": "3600" + } + }, + "requiredConfirmations": "64", + "filters": [ + { + "key": { + "name": "resolved", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + }, + { + "key": { + "name": "price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "price", + "expression": "$[1]" + }, + { + "name": "resolved", + "expression": "$[0]" + } + ], + "sourceChainId": "42161" + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "ethOracle": { + "address": "0x6d0b3a00265b8b4a1d22cf466c331014133ba614", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct TerminationOracle.Identifier\",\"components\":[{\"name\":\"bondCurrency\",\"type\":\"address\",\"internalType\":\"contract IERC20\"},{\"name\":\"minimumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"liveness\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"ipfsLink\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"conditionalSettlementOracle\",\"type\":\"address\",\"internalType\":\"contract SettlementOracle\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8" + }, + "conditionalSettlementOracle": { + "stringValue": "0x302461E6dBF45e59acb3BE9a9c84C0a997779612" + }, + "enactmentDate": { + "stringValue": "2024-03-04T16:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:bar.foo" + }, + "liveness": { + "numberValue": 1 + }, + "marketCode": { + "stringValue": "DOGEP/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 500000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1709651685", + "every": "3600" + } + }, + "requiredConfirmations": "64", + "filters": [ + { + "key": { + "name": "resolved", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + }, + { + "key": { + "name": "terminated", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ], + "normalisers": [ + { + "name": "resolved", + "expression": "$[0]" + }, + { + "name": "terminated", + "expression": "$[2]" + } + ], + "sourceChainId": "42161" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "price", + "tradingTerminationProperty": "terminated" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "base:DOGEPOINT", + "quote:USDT", + "enactment:2024-03-04T16:00:00Z", + "settlement:fromOracle", + "class:fx/crypto", + "oracle:uma", + "sector:defi", + "oracleChain:arbitrum" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 0.0001, + "tau": 0.001368925394, + "params": { + "sigma": 5 + } + }, + "positionDecimalPlaces": "-2", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.2", + "commitmentMinTimeFraction": "0.5", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "5", + "disposalFraction": "0.1", + "fullDisposalSize": "10000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "0", + "cashAmount": "0", + "compositePriceType": "COMPOSITE_PRICE_TYPE_LAST_TRADE" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Create UMA sample market", + "title": "Create UMA sample market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "batchId": "4c208ab9d0c5de97c098da7c3aca447f2271dca8093b6a69a7d21fd106b87c1e" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "4c208ab9d0c5de97c098da7c3aca447f2271dca8093b6a69a7d21fd106b87c1e", + "timestamp": "1709651421234986698", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "58a3dd6e4c49997d0fc94c7a8d4d0ea5363d3f20e444859abbaa754bd3bde37d", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1709651381437596385", + "terms": { + "closingTimestamp": "1709651585", + "enactmentTimestamp": "1709651685", + "newMarket": { + "changes": { + "instrument": { + "name": "Doge Points / USDT (Futures market)", + "code": "DOGEP/USDT.POINTS", + "future": { + "settlementAsset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "quoteName": "USDT", + "dataSourceSpecForSettlementData": { + "external": { + "ethOracle": { + "address": "0x302461E6dBF45e59acb3BE9a9c84C0a997779612", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct SettlementOracle.Identifier\",\"components\":[{\"name\":\"liveness\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"bondCurrency\",\"type\":\"address\",\"internalType\":\"contract IERC20\"},{\"name\":\"minimumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"ipfsLink\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8" + }, + "enactmentDate": { + "stringValue": "2024-03-04T16:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:bar.foo" + }, + "liveness": { + "numberValue": 1 + }, + "marketCode": { + "stringValue": "DOGEP/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 500000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1709651685", + "every": "3600" + } + }, + "requiredConfirmations": "64", + "filters": [ + { + "key": { + "name": "resolved", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + }, + { + "key": { + "name": "price", + "type": "TYPE_INTEGER", + "numberDecimalPlaces": "18" + }, + "conditions": [ + { + "operator": "OPERATOR_GREATER_THAN_OR_EQUAL", + "value": "0" + } + ] + } + ], + "normalisers": [ + { + "name": "price", + "expression": "$[1]" + }, + { + "name": "resolved", + "expression": "$[0]" + } + ], + "sourceChainId": "42161" + } + } + }, + "dataSourceSpecForTradingTermination": { + "external": { + "ethOracle": { + "address": "0x6d0b3a00265b8b4a1d22cf466c331014133ba614", + "abi": "[{\"type\":\"function\",\"name\":\"getData\",\"inputs\":[{\"name\":\"identifier\",\"type\":\"tuple\",\"internalType\":\"struct TerminationOracle.Identifier\",\"components\":[{\"name\":\"bondCurrency\",\"type\":\"address\",\"internalType\":\"contract IERC20\"},{\"name\":\"minimumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumBond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"liveness\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"marketCode\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"quoteName\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"enactmentDate\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"ipfsLink\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"conditionalSettlementOracle\",\"type\":\"address\",\"internalType\":\"contract SettlementOracle\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"}]", + "method": "getData", + "args": [ + { + "structValue": { + "fields": { + "bondCurrency": { + "stringValue": "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8" + }, + "conditionalSettlementOracle": { + "stringValue": "0x302461E6dBF45e59acb3BE9a9c84C0a997779612" + }, + "enactmentDate": { + "stringValue": "2024-03-04T16:00:00Z" + }, + "ipfsLink": { + "stringValue": "ipfs:bar.foo" + }, + "liveness": { + "numberValue": 1 + }, + "marketCode": { + "stringValue": "DOGEP/USDT" + }, + "maximumBond": { + "numberValue": 100000000000 + }, + "minimumBond": { + "numberValue": 500000000 + }, + "quoteName": { + "stringValue": "USDT" + } + } + } + } + ], + "trigger": { + "timeTrigger": { + "initial": "1709651685", + "every": "3600" + } + }, + "requiredConfirmations": "64", + "filters": [ + { + "key": { + "name": "resolved", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + }, + { + "key": { + "name": "terminated", + "type": "TYPE_BOOLEAN" + }, + "conditions": [ + { + "operator": "OPERATOR_EQUALS", + "value": "true" + } + ] + } + ], + "normalisers": [ + { + "name": "resolved", + "expression": "$[0]" + }, + { + "name": "terminated", + "expression": "$[2]" + } + ], + "sourceChainId": "42161" + } + } + }, + "dataSourceSpecBinding": { + "settlementDataProperty": "price", + "tradingTerminationProperty": "terminated" + } + } + }, + "decimalPlaces": "5", + "metadata": [ + "base:DOGEPOINT", + "quote:USDT", + "enactment:2024-03-04T16:00:00Z", + "settlement:fromOracle", + "class:fx/crypto", + "oracle:uma", + "sector:defi", + "oracleChain:arbitrum" + ], + "priceMonitoringParameters": { + "triggers": [ + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "120", + "probability": "0.9999999", + "auctionExtension": "60" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "200", + "probability": "0.9999999", + "auctionExtension": "300" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "400", + "probability": "0.9999999", + "auctionExtension": "900" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "500", + "probability": "0.9999999", + "auctionExtension": "1800" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "620", + "probability": "0.9999999", + "auctionExtension": "3600" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "750", + "probability": "0.9999999", + "auctionExtension": "7200" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + }, + { + "horizon": "800", + "probability": "0.9999999", + "auctionExtension": "28800" + } + ] + }, + "liquidityMonitoringParameters": { + "targetStakeParameters": { + "timeWindow": "3600", + "scalingFactor": 0.05 + } + }, + "logNormal": { + "riskAversionParameter": 1.5865e-7, + "tau": 0.000009513, + "params": { + "sigma": 25 + } + }, + "positionDecimalPlaces": "-2", + "linearSlippageFactor": "0.001", + "liquiditySlaParameters": { + "priceRange": "0.2", + "commitmentMinTimeFraction": "0.5", + "performanceHysteresisEpochs": "1", + "slaCompetitionFactor": "0.8" + }, + "liquidityFeeSettings": { + "method": "METHOD_MARGINAL_COST" + }, + "liquidationStrategy": { + "disposalTimeStep": "5", + "disposalFraction": "0.1", + "fullDisposalSize": "10000", + "maxFractionConsumed": "0.1" + }, + "markPriceConfiguration": { + "decayWeight": "0", + "cashAmount": "0", + "compositePriceType": "COMPOSITE_PRICE_TYPE_LAST_TRADE" + }, + "tickSize": "1" + } + } + }, + "rationale": { + "description": "Create UMA sample market", + "title": "Create UMA sample market" + }, + "requiredParticipation": "0", + "requiredMajority": "0.66", + "batchId": "fbf6d0a11e5835041af88af18fe1dc7894ab3ff0205d8d9d0c6df97c92338b98" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "fbf6d0a11e5835041af88af18fe1dc7894ab3ff0205d8d9d0c6df97c92338b98", + "timestamp": "1709651434957402174", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "e1938ad258e57bb8750e904f82e762e2a46c6da10af45b10ee47e041a0053169", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1709891118784159969", + "terms": { + "closingTimestamp": "1709891332", + "enactmentTimestamp": "1709891392", + "updateNetworkParameter": { + "changes": { + "key": "spam.protection.max.batchSize", + "value": "30" + } + } + }, + "rationale": { + "description": "Update spam.protection.max.batchSize to 30", + "title": "Update spam.protection.max.batchSize to 30" + }, + "requiredParticipation": "0", + "requiredMajority": "0.5" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "e1938ad258e57bb8750e904f82e762e2a46c6da10af45b10ee47e041a0053169", + "timestamp": "1709891148432937316", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "f041fd69fb0dde66a84a709954c8b721408fd1ea4888690b5ebc871be92b4072", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1710874980576138804", + "terms": { + "closingTimestamp": "1710875196", + "enactmentTimestamp": "1710875196", + "newTransfer": { + "changes": { + "sourceType": "ACCOUNT_TYPE_NETWORK_TREASURY", + "transferType": "GOVERNANCE_TRANSFER_TYPE_BEST_EFFORT", + "amount": "111000000", + "asset": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "fractionOfBalance": "0.1", + "destinationType": "ACCOUNT_TYPE_REWARD_AVERAGE_POSITION", + "recurring": { + "startEpoch": "116951", + "endEpoch": "117051", + "dispatchStrategy": { + "assetForMetric": "c9fe6fc24fce121b2cc72680543a886055abb560043fda394ba5376203b7527d", + "metric": "DISPATCH_METRIC_AVERAGE_POSITION", + "entityScope": "ENTITY_SCOPE_TEAMS", + "nTopPerformers": "0.5", + "notionalTimeWeightedAveragePositionRequirement": "25000000000", + "windowLength": "1", + "distributionStrategy": "DISTRIBUTION_STRATEGY_RANK", + "rankTable": [ + { + "startRank": 1, + "shareRatio": 3 + } + ] + } + } + } + } + }, + "rationale": { + "description": "ACCOUNT_TYPE_REWARD_AVERAGE_POSITION rewards II AVG position", + "title": "Reward for ACCOUNT_TYPE_REWARD_AVERAGE_POSITION II AVG position" + }, + "requiredParticipation": "0.00001", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "f041fd69fb0dde66a84a709954c8b721408fd1ea4888690b5ebc871be92b4072", + "timestamp": "1710875040684039445", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + }, + { + "proposal": { + "id": "07a52385be2dbbb74937a1cb3a69ab7c66008e8538fd409936e4f44e18815a78", + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "state": "STATE_ENACTED", + "timestamp": "1710951358272840929", + "terms": { + "closingTimestamp": "1710953527", + "enactmentTimestamp": "1710953597", + "validationTimestamp": "1710953427", + "newAsset": { + "changes": { + "name": "Axelar Wrapped aUSDC", + "symbol": "aUSDC", + "decimals": "6", + "quantum": "1", + "erc20": { + "contractAddress": "0x254d06f33bDc5b8ee05b2ea472107E300226659A", + "lifetimeLimit": "100000000000000000000", + "withdrawThreshold": "1" + } + } + } + }, + "rationale": { + "description": "TBD", + "title": "VAP-001 - Add Asset for Jeremy" + }, + "requiredParticipation": "0.5", + "requiredMajority": "0.66" + }, + "yes": [ + { + "partyId": "69464e35bcb8e8a2900ca0f87acaf252d50cf2ab2fc73694845a16b7c8a0dc6f", + "value": "VALUE_YES", + "proposalId": "07a52385be2dbbb74937a1cb3a69ab7c66008e8538fd409936e4f44e18815a78", + "timestamp": "1710951418844496879", + "totalGovernanceTokenBalance": "50015000000000000000000000", + "totalGovernanceTokenWeight": "1", + "totalEquityLikeShareWeight": "0" + } + ] + } + ] + } + }` + result, err := unmarshalGovernanceEnacted(t, jsonStr) + if err != nil { + log.Fatalf("Error: %v", err) + } + for _, r := range result.Proposals { + _, err := types.ProposalFromProto(r.Proposal) + require.NoError(t, err, r.Proposal.Id) + } +} diff --git a/core/types/snapshot.go b/core/types/snapshot.go index c96aaaee80..19adf01570 100644 --- a/core/types/snapshot.go +++ b/core/types/snapshot.go @@ -88,6 +88,7 @@ const ( FloatingPointConsensusSnapshot SnapshotNamespace = "floatingpoint" MarketActivityTrackerSnapshot SnapshotNamespace = "marketActivityTracker" ERC20MultiSigTopologySnapshot SnapshotNamespace = "erc20multisigtopology" + EVMMultiSigTopologiesSnapshot SnapshotNamespace = "evmmultisigtopologies" PoWSnapshot SnapshotNamespace = "pow" ProtocolUpgradeSnapshot SnapshotNamespace = "protocolUpgradeProposals" SettlementSnapshot SnapshotNamespace = "settlement" diff --git a/core/types/snapshot_nodes.go b/core/types/snapshot_nodes.go index bb7504fb6b..c534790828 100644 --- a/core/types/snapshot_nodes.go +++ b/core/types/snapshot_nodes.go @@ -26,7 +26,6 @@ import ( "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/protos/vega" checkpoint "code.vegaprotocol.io/vega/protos/vega/checkpoint/v1" - checkpointpb "code.vegaprotocol.io/vega/protos/vega/checkpoint/v1" eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" snapshot "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" ) @@ -51,7 +50,7 @@ type Snapshot struct { type Metadata struct { Version int64 // the version of the AVL tree NodeHashes []*NodeHash // the nodes of the AVL tree ordered such that it can be imported with identical shape - ChunkHashes []string // the hashes of each chunk so that we can verifiy they are complete when sent over state-sync + ChunkHashes []string // the hashes of each chunk so that we can verify they are complete when sent over state-sync ProtocolVersion string // the version of the protocol that generated this snapshot ProtocolUpgrade bool // whether or not this snapshot was taken for the purpose of a protocol upgrade } @@ -93,58 +92,6 @@ type PayloadProofOfWork struct { LastPruningBlock uint64 } -type PayloadActiveAssets struct { - ActiveAssets *ActiveAssets -} - -type PayloadPendingAssets struct { - PendingAssets *PendingAssets -} - -type PayloadPendingAssetUpdates struct { - PendingAssetUpdates *PendingAssetUpdates -} - -type PayloadBankingBridgeState struct { - BankingBridgeState *BankingBridgeState -} - -type PayloadBankingWithdrawals struct { - BankingWithdrawals *BankingWithdrawals -} - -type PayloadBankingDeposits struct { - BankingDeposits *BankingDeposits -} - -type PayloadBankingSeen struct { - BankingSeen *BankingSeen -} - -type PayloadBankingAssetActions struct { - BankingAssetActions *BankingAssetActions -} - -type PayloadBankingRecurringTransfers struct { - BankingRecurringTransfers *checkpointpb.RecurringTransfers -} - -type PayloadBankingScheduledTransfers struct { - BankingScheduledTransfers []*checkpointpb.ScheduledTransferAtTime -} - -type PayloadBankingRecurringGovernanceTransfers struct { - BankingRecurringGovernanceTransfers []*checkpointpb.GovernanceTransfer -} - -type PayloadBankingScheduledGovernanceTransfers struct { - BankingScheduledGovernanceTransfers []*checkpointpb.ScheduledGovernanceTransferAtTime -} - -type PayloadBankingTransferFeeDiscounts struct { - BankingTransferFeeDiscounts *snapshot.BankingTransferFeeDiscounts -} - type PayloadCheckpoint struct { Checkpoint *CPState } @@ -333,13 +280,6 @@ type Resource struct { Votes []string } -type PayloadEventForwarder struct { - // keys are deprecated, to be removed after 74 - Keys []string - // Buckets are used with the new upgrade - Buckets []*snapshot.EventForwarderBucket -} - type PayloadERC20MultiSigTopologyVerified struct { Verified *snapshot.ERC20MultiSigTopologyVerified } @@ -347,6 +287,9 @@ type PayloadERC20MultiSigTopologyVerified struct { type PayloadERC20MultiSigTopologyPending struct { Pending *snapshot.ERC20MultiSigTopologyPending } +type PayloadEVMMultisigTopologies struct { + Topologies []*snapshot.EVMMultisigTopology +} type PayloadLiquidityParameters struct { Parameters *snapshot.LiquidityParameters @@ -465,6 +408,7 @@ type ExecMarket struct { PartyMarginFactors []*snapshot.PartyMarginFactor MarkPriceCalculator *snapshot.CompositePriceCalculator InternalCompositePriceCalculator *snapshot.CompositePriceCalculator + MarketLiquidity *snapshot.MarketLiquidity } type ExecSpotMarket struct { @@ -490,6 +434,7 @@ type ExecSpotMarket struct { StopOrders *snapshot.StopOrders ExpiringStopOrders []*Order FeesStats *eventspb.FeesStats + MarketLiquidity *snapshot.MarketLiquidity } type PriceMonitor struct { @@ -525,8 +470,9 @@ type PriceBound struct { } type PriceRangeCache struct { - Bound *PriceBound - Range *PriceRange + BoundIndex int + Bound *PriceBound + Range *PriceRange } type PriceRange struct { @@ -600,66 +546,6 @@ type EquityShareLP struct { VStake num.Decimal } -type ActiveAssets struct { - Assets []*Asset -} - -type PendingAssets struct { - Assets []*Asset -} - -type PendingAssetUpdates struct { - Assets []*Asset -} - -type BankingBridgeState struct { - Active bool - BlockHeight uint64 - LogIndex uint64 -} - -type BankingWithdrawals struct { - Withdrawals []*RWithdrawal -} - -type RWithdrawal struct { - Ref string - Withdrawal *Withdrawal -} - -type BankingDeposits struct { - Deposit []*BDeposit -} - -type BDeposit struct { - ID string - Deposit *Deposit -} - -type BankingSeen struct { - Refs []string - LastSeenEthBlock uint64 -} - -type BankingAssetActions struct { - AssetAction []*AssetAction -} - -type AssetAction struct { - ID string - State uint32 - Asset string - BlockNumber uint64 - TxIndex uint64 - Hash string - BuiltinD *BuiltinAssetDeposit - Erc20D *ERC20Deposit - Erc20AL *ERC20AssetList - ERC20AssetLimitsUpdated *ERC20AssetLimitsUpdated - BridgeStopped bool - BridgeResume bool -} - type CPState struct { NextCp int64 } @@ -712,8 +598,9 @@ type GovernanceEnacted struct { } type GovernanceNode struct { - Proposals []*Proposal - ProposalData []*ProposalData + Proposals []*Proposal + ProposalData []*ProposalData + BatchProposalData []*snapshot.BatchProposalData } type ProposalData struct { @@ -856,8 +743,10 @@ func PayloadFromProto(p *snapshot.Payload) *Payload { ret.Data = PayloadPendingAssetsFromProto(dt) case *snapshot.Payload_PendingAssetUpdates: ret.Data = PayloadPendingAssetUpdatesFromProto(dt) - case *snapshot.Payload_BankingBridgeState: - ret.Data = PayloadBankingBridgeStateFromProto(dt) + case *snapshot.Payload_BankingPrimaryBridgeState: + ret.Data = PayloadBankingPrimaryBridgeStateFromProto(dt) + case *snapshot.Payload_BankingEvmBridgeStates: + ret.Data = PayloadBankingEVMBridgeStatesFromProto(dt) case *snapshot.Payload_BankingWithdrawals: ret.Data = PayloadBankingWithdrawalsFromProto(dt) case *snapshot.Payload_BankingDeposits: @@ -998,6 +887,8 @@ func PayloadFromProto(p *snapshot.Payload) *Payload { ret.Data = PayloadL2EthOraclesFromProto(dt) case *snapshot.Payload_EthOracleVerifierMisc: ret.Data = PayloadEthOracleVerifierMisc(dt) + case *snapshot.Payload_EvmMultisigTopologies: + ret.Data = PayloadEVMMultisigTopologiesFromProto(dt) default: panic(fmt.Errorf("missing support for payload %T", dt)) } @@ -1045,7 +936,9 @@ func (p Payload) IntoProto() *snapshot.Payload { ret.Data = dt case *snapshot.Payload_BankingDeposits: ret.Data = dt - case *snapshot.Payload_BankingBridgeState: + case *snapshot.Payload_BankingPrimaryBridgeState: + ret.Data = dt + case *snapshot.Payload_BankingEvmBridgeStates: ret.Data = dt case *snapshot.Payload_BankingWithdrawals: ret.Data = dt @@ -1187,6 +1080,8 @@ func (p Payload) IntoProto() *snapshot.Payload { ret.Data = dt case *snapshot.Payload_EthOracleVerifierMisc: ret.Data = dt + case *snapshot.Payload_EvmMultisigTopologies: + ret.Data = dt default: panic(fmt.Errorf("missing support for payload %T", dt)) } @@ -1217,7 +1112,7 @@ func (p *PayloadERC20MultiSigTopologyVerified) plToProto() interface{} { } } -func (*PayloadERC20MultiSigTopologyVerified) Namespace() SnapshotNamespace { +func (p *PayloadERC20MultiSigTopologyVerified) Namespace() SnapshotNamespace { return ERC20MultiSigTopologySnapshot } @@ -1241,7 +1136,7 @@ func (p *PayloadERC20MultiSigTopologyPending) plToProto() interface{} { } } -func (*PayloadERC20MultiSigTopologyPending) Namespace() SnapshotNamespace { +func (p *PayloadERC20MultiSigTopologyPending) Namespace() SnapshotNamespace { return ERC20MultiSigTopologySnapshot } @@ -1513,388 +1408,6 @@ func (p *PayloadSpotLiquidityTarget) Key() string { return fmt.Sprintf("target:%v", p.Target.MarketId) } -func PayloadActiveAssetsFromProto(paa *snapshot.Payload_ActiveAssets) *PayloadActiveAssets { - return &PayloadActiveAssets{ - ActiveAssets: ActiveAssetsFromProto(paa.ActiveAssets), - } -} - -func (p PayloadActiveAssets) IntoProto() *snapshot.Payload_ActiveAssets { - return &snapshot.Payload_ActiveAssets{ - ActiveAssets: p.ActiveAssets.IntoProto(), - } -} - -func (*PayloadActiveAssets) isPayload() {} - -func (p *PayloadActiveAssets) plToProto() interface{} { - return p.IntoProto() -} - -func (*PayloadActiveAssets) Namespace() SnapshotNamespace { - return AssetsSnapshot -} - -func (*PayloadActiveAssets) Key() string { - return "active" -} - -func PayloadPendingAssetsFromProto(ppa *snapshot.Payload_PendingAssets) *PayloadPendingAssets { - return &PayloadPendingAssets{ - PendingAssets: PendingAssetsFromProto(ppa.PendingAssets), - } -} - -func (p PayloadPendingAssets) IntoProto() *snapshot.Payload_PendingAssets { - return &snapshot.Payload_PendingAssets{ - PendingAssets: p.PendingAssets.IntoProto(), - } -} - -func (*PayloadPendingAssets) isPayload() {} - -func (p *PayloadPendingAssets) plToProto() interface{} { - return p.IntoProto() -} - -func (*PayloadPendingAssets) Key() string { - return "pending" -} - -func (*PayloadPendingAssets) Namespace() SnapshotNamespace { - return AssetsSnapshot -} - -func PayloadPendingAssetUpdatesFromProto(ppa *snapshot.Payload_PendingAssetUpdates) *PayloadPendingAssetUpdates { - return &PayloadPendingAssetUpdates{ - PendingAssetUpdates: PendingAssetUpdatesFromProto(ppa.PendingAssetUpdates), - } -} - -func (p PayloadPendingAssetUpdates) IntoProto() *snapshot.Payload_PendingAssetUpdates { - return &snapshot.Payload_PendingAssetUpdates{ - PendingAssetUpdates: p.PendingAssetUpdates.IntoProto(), - } -} - -func (*PayloadPendingAssetUpdates) isPayload() {} - -func (p *PayloadPendingAssetUpdates) plToProto() interface{} { - return p.IntoProto() -} - -func (*PayloadPendingAssetUpdates) Key() string { - return "pending_updates" -} - -func (*PayloadPendingAssetUpdates) Namespace() SnapshotNamespace { - return AssetsSnapshot -} - -func (a PendingAssetUpdates) IntoProto() *snapshot.PendingAssetUpdates { - ret := &snapshot.PendingAssetUpdates{ - Assets: make([]*vega.Asset, 0, len(a.Assets)), - } - for _, a := range a.Assets { - ret.Assets = append(ret.Assets, a.IntoProto()) - } - return ret -} - -func PendingAssetUpdatesFromProto(aa *snapshot.PendingAssetUpdates) *PendingAssetUpdates { - ret := PendingAssetUpdates{ - Assets: make([]*Asset, 0, len(aa.Assets)), - } - for _, a := range aa.Assets { - pa, err := AssetFromProto(a) - if err != nil { - panic(err) - } - ret.Assets = append(ret.Assets, pa) - } - return &ret -} - -func PayloadBankingBridgeStateFromProto(pbbs *snapshot.Payload_BankingBridgeState) *PayloadBankingBridgeState { - return &PayloadBankingBridgeState{ - BankingBridgeState: &BankingBridgeState{ - Active: pbbs.BankingBridgeState.BridgeState.Active, - BlockHeight: pbbs.BankingBridgeState.BridgeState.BlockHeight, - LogIndex: pbbs.BankingBridgeState.BridgeState.LogIndex, - }, - } -} - -func (p PayloadBankingBridgeState) IntoProto() *snapshot.Payload_BankingBridgeState { - return &snapshot.Payload_BankingBridgeState{ - BankingBridgeState: &snapshot.BankingBridgeState{ - BridgeState: &checkpointpb.BridgeState{ - Active: p.BankingBridgeState.Active, - BlockHeight: p.BankingBridgeState.BlockHeight, - LogIndex: p.BankingBridgeState.LogIndex, - }, - }, - } -} - -func (*PayloadBankingBridgeState) isPayload() {} - -func (p *PayloadBankingBridgeState) plToProto() interface{} { - return p.IntoProto() -} - -func (*PayloadBankingBridgeState) Key() string { - return "bridgeState" -} - -func (*PayloadBankingBridgeState) Namespace() SnapshotNamespace { - return BankingSnapshot -} - -func PayloadBankingWithdrawalsFromProto(pbw *snapshot.Payload_BankingWithdrawals) *PayloadBankingWithdrawals { - return &PayloadBankingWithdrawals{ - BankingWithdrawals: BankingWithdrawalsFromProto(pbw.BankingWithdrawals), - } -} - -func (p PayloadBankingWithdrawals) IntoProto() *snapshot.Payload_BankingWithdrawals { - return &snapshot.Payload_BankingWithdrawals{ - BankingWithdrawals: p.BankingWithdrawals.IntoProto(), - } -} - -func (*PayloadBankingWithdrawals) isPayload() {} - -func (p *PayloadBankingWithdrawals) plToProto() interface{} { - return p.IntoProto() -} - -func (*PayloadBankingWithdrawals) Key() string { - return "withdrawals" -} - -func (*PayloadBankingWithdrawals) Namespace() SnapshotNamespace { - return BankingSnapshot -} - -func PayloadBankingDepositsFromProto(pbd *snapshot.Payload_BankingDeposits) *PayloadBankingDeposits { - return &PayloadBankingDeposits{ - BankingDeposits: BankingDepositsFromProto(pbd.BankingDeposits), - } -} - -func (p PayloadBankingDeposits) IntoProto() *snapshot.Payload_BankingDeposits { - return &snapshot.Payload_BankingDeposits{ - BankingDeposits: p.BankingDeposits.IntoProto(), - } -} - -func (*PayloadBankingDeposits) isPayload() {} - -func (p *PayloadBankingDeposits) plToProto() interface{} { - return p.IntoProto() -} - -func (*PayloadBankingDeposits) Key() string { - return "deposits" -} - -func (*PayloadBankingDeposits) Namespace() SnapshotNamespace { - return BankingSnapshot -} - -func PayloadBankingRecurringGovernanceTransfersFromProto(pbd *snapshot.Payload_BankingRecurringGovernanceTransfers) *PayloadBankingRecurringGovernanceTransfers { - return &PayloadBankingRecurringGovernanceTransfers{ - BankingRecurringGovernanceTransfers: pbd.BankingRecurringGovernanceTransfers.RecurringTransfers, - } -} - -func (p PayloadBankingRecurringGovernanceTransfers) IntoProto() *snapshot.Payload_BankingRecurringGovernanceTransfers { - return &snapshot.Payload_BankingRecurringGovernanceTransfers{ - BankingRecurringGovernanceTransfers: &snapshot.BankingRecurringGovernanceTransfers{ - RecurringTransfers: p.BankingRecurringGovernanceTransfers, - }, - } -} - -func (*PayloadBankingRecurringGovernanceTransfers) isPayload() {} - -func (p *PayloadBankingRecurringGovernanceTransfers) plToProto() interface{} { - return p.IntoProto() -} - -func (*PayloadBankingRecurringGovernanceTransfers) Key() string { - return "recurringGovernanceTransfers" -} - -func (*PayloadBankingRecurringGovernanceTransfers) Namespace() SnapshotNamespace { - return BankingSnapshot -} - -func PayloadBankingRecurringTransfersFromProto(pbd *snapshot.Payload_BankingRecurringTransfers) *PayloadBankingRecurringTransfers { - return &PayloadBankingRecurringTransfers{ - BankingRecurringTransfers: pbd.BankingRecurringTransfers.RecurringTransfers, - } -} - -func (p PayloadBankingRecurringTransfers) IntoProto() *snapshot.Payload_BankingRecurringTransfers { - return &snapshot.Payload_BankingRecurringTransfers{ - BankingRecurringTransfers: &snapshot.BankingRecurringTransfers{ - RecurringTransfers: p.BankingRecurringTransfers, - }, - } -} - -func (*PayloadBankingRecurringTransfers) isPayload() {} - -func (p *PayloadBankingRecurringTransfers) plToProto() interface{} { - return p.IntoProto() -} - -func (*PayloadBankingRecurringTransfers) Key() string { - return "recurringTransfers" -} - -func (*PayloadBankingRecurringTransfers) Namespace() SnapshotNamespace { - return BankingSnapshot -} - -func PayloadBankingScheduledTransfersFromProto(pbd *snapshot.Payload_BankingScheduledTransfers) *PayloadBankingScheduledTransfers { - return &PayloadBankingScheduledTransfers{ - BankingScheduledTransfers: pbd.BankingScheduledTransfers.TransfersAtTime, - } -} - -func (p PayloadBankingScheduledTransfers) IntoProto() *snapshot.Payload_BankingScheduledTransfers { - return &snapshot.Payload_BankingScheduledTransfers{ - BankingScheduledTransfers: &snapshot.BankingScheduledTransfers{ - TransfersAtTime: p.BankingScheduledTransfers, - }, - } -} - -func (*PayloadBankingScheduledTransfers) isPayload() {} - -func (p *PayloadBankingScheduledTransfers) plToProto() interface{} { - return p.IntoProto() -} - -func (*PayloadBankingScheduledTransfers) Key() string { - return "scheduledTransfers" -} - -func (*PayloadBankingScheduledTransfers) Namespace() SnapshotNamespace { - return BankingSnapshot -} - -func PayloadBankingScheduledGovernanceTransfersFromProto(pbd *snapshot.Payload_BankingScheduledGovernanceTransfers) *PayloadBankingScheduledGovernanceTransfers { - return &PayloadBankingScheduledGovernanceTransfers{ - BankingScheduledGovernanceTransfers: pbd.BankingScheduledGovernanceTransfers.TransfersAtTime, - } -} - -func (p PayloadBankingScheduledGovernanceTransfers) IntoProto() *snapshot.Payload_BankingScheduledGovernanceTransfers { - return &snapshot.Payload_BankingScheduledGovernanceTransfers{ - BankingScheduledGovernanceTransfers: &snapshot.BankingScheduledGovernanceTransfers{ - TransfersAtTime: p.BankingScheduledGovernanceTransfers, - }, - } -} - -func (*PayloadBankingScheduledGovernanceTransfers) isPayload() {} - -func (p *PayloadBankingScheduledGovernanceTransfers) plToProto() interface{} { - return p.IntoProto() -} - -func (*PayloadBankingScheduledGovernanceTransfers) Key() string { - return "scheduledGovernanceTransfers" -} - -func (*PayloadBankingScheduledGovernanceTransfers) Namespace() SnapshotNamespace { - return BankingSnapshot -} - -func PayloadBankingTransferFeeDiscountsFromProto(pbd *snapshot.Payload_BankingTransferFeeDiscounts) *PayloadBankingTransferFeeDiscounts { - return &PayloadBankingTransferFeeDiscounts{ - BankingTransferFeeDiscounts: pbd.BankingTransferFeeDiscounts, - } -} - -func (p PayloadBankingTransferFeeDiscounts) IntoProto() *snapshot.Payload_BankingTransferFeeDiscounts { - return &snapshot.Payload_BankingTransferFeeDiscounts{ - BankingTransferFeeDiscounts: &snapshot.BankingTransferFeeDiscounts{ - PartyAssetDiscount: p.BankingTransferFeeDiscounts.PartyAssetDiscount, - }, - } -} - -func (*PayloadBankingTransferFeeDiscounts) isPayload() {} - -func (p *PayloadBankingTransferFeeDiscounts) plToProto() interface{} { - return p.IntoProto() -} - -func (*PayloadBankingTransferFeeDiscounts) Key() string { - return "transferFeeDiscounts" -} - -func (*PayloadBankingTransferFeeDiscounts) Namespace() SnapshotNamespace { - return BankingSnapshot -} - -func PayloadBankingSeenFromProto(pbs *snapshot.Payload_BankingSeen) *PayloadBankingSeen { - return &PayloadBankingSeen{ - BankingSeen: BankingSeenFromProto(pbs.BankingSeen), - } -} - -func (p PayloadBankingSeen) IntoProto() *snapshot.Payload_BankingSeen { - return &snapshot.Payload_BankingSeen{ - BankingSeen: p.BankingSeen.IntoProto(), - } -} - -func (*PayloadBankingSeen) isPayload() {} - -func (p *PayloadBankingSeen) plToProto() interface{} { - return p.IntoProto() -} - -func (*PayloadBankingSeen) Key() string { - return "seen" -} - -func (*PayloadBankingSeen) Namespace() SnapshotNamespace { - return BankingSnapshot -} - -func PayloadBankingAssetActionsFromProto(pbs *snapshot.Payload_BankingAssetActions) *PayloadBankingAssetActions { - return &PayloadBankingAssetActions{ - BankingAssetActions: BankingAssetActionsFromProto(pbs.BankingAssetActions), - } -} - -func (p PayloadBankingAssetActions) IntoProto() *snapshot.Payload_BankingAssetActions { - return &snapshot.Payload_BankingAssetActions{ - BankingAssetActions: p.BankingAssetActions.IntoProto(), - } -} - -func (*PayloadBankingAssetActions) isPayload() {} - -func (p *PayloadBankingAssetActions) plToProto() interface{} { - return p.IntoProto() -} - -func (*PayloadBankingAssetActions) Key() string { - return "assetActions" -} - -func (*PayloadBankingAssetActions) Namespace() SnapshotNamespace { - return BankingSnapshot -} - func PayloadCheckpointFromProto(pc *snapshot.Payload_Checkpoint) *PayloadCheckpoint { return &PayloadCheckpoint{ Checkpoint: CheckpointFromProto(pc.Checkpoint), @@ -2592,222 +2105,6 @@ func (*PayloadStakingAccounts) Namespace() SnapshotNamespace { return StakingSnapshot } -func ActiveAssetsFromProto(aa *snapshot.ActiveAssets) *ActiveAssets { - ret := ActiveAssets{ - Assets: make([]*Asset, 0, len(aa.Assets)), - } - for _, a := range aa.Assets { - aa, err := AssetFromProto(a) - if err != nil { - panic(err) - } - ret.Assets = append(ret.Assets, aa) - } - return &ret -} - -func (a ActiveAssets) IntoProto() *snapshot.ActiveAssets { - ret := &snapshot.ActiveAssets{ - Assets: make([]*vega.Asset, 0, len(a.Assets)), - } - for _, a := range a.Assets { - ret.Assets = append(ret.Assets, a.IntoProto()) - } - return ret -} - -func PendingAssetsFromProto(aa *snapshot.PendingAssets) *PendingAssets { - ret := PendingAssets{ - Assets: make([]*Asset, 0, len(aa.Assets)), - } - for _, a := range aa.Assets { - pa, err := AssetFromProto(a) - if err != nil { - panic(err) - } - ret.Assets = append(ret.Assets, pa) - } - return &ret -} - -func (a PendingAssets) IntoProto() *snapshot.PendingAssets { - ret := &snapshot.PendingAssets{ - Assets: make([]*vega.Asset, 0, len(a.Assets)), - } - for _, a := range a.Assets { - ret.Assets = append(ret.Assets, a.IntoProto()) - } - return ret -} - -func BankingWithdrawalsFromProto(bw *snapshot.BankingWithdrawals) *BankingWithdrawals { - ret := &BankingWithdrawals{ - Withdrawals: make([]*RWithdrawal, 0, len(bw.Withdrawals)), - } - for _, w := range bw.Withdrawals { - ret.Withdrawals = append(ret.Withdrawals, RWithdrawalFromProto(w)) - } - return ret -} - -func (b BankingWithdrawals) IntoProto() *snapshot.BankingWithdrawals { - ret := snapshot.BankingWithdrawals{ - Withdrawals: make([]*snapshot.Withdrawal, 0, len(b.Withdrawals)), - } - for _, w := range b.Withdrawals { - ret.Withdrawals = append(ret.Withdrawals, w.IntoProto()) - } - return &ret -} - -func RWithdrawalFromProto(rw *snapshot.Withdrawal) *RWithdrawal { - return &RWithdrawal{ - Ref: rw.Ref, - Withdrawal: WithdrawalFromProto(rw.Withdrawal), - } -} - -func (r RWithdrawal) IntoProto() *snapshot.Withdrawal { - return &snapshot.Withdrawal{ - Ref: r.Ref, - Withdrawal: r.Withdrawal.IntoProto(), - } -} - -func BankingDepositsFromProto(bd *snapshot.BankingDeposits) *BankingDeposits { - ret := &BankingDeposits{ - Deposit: make([]*BDeposit, 0, len(bd.Deposit)), - } - for _, d := range bd.Deposit { - ret.Deposit = append(ret.Deposit, BDepositFromProto(d)) - } - return ret -} - -func (b BankingDeposits) IntoProto() *snapshot.BankingDeposits { - ret := snapshot.BankingDeposits{ - Deposit: make([]*snapshot.Deposit, 0, len(b.Deposit)), - } - for _, d := range b.Deposit { - ret.Deposit = append(ret.Deposit, d.IntoProto()) - } - return &ret -} - -func BDepositFromProto(d *snapshot.Deposit) *BDeposit { - return &BDeposit{ - ID: d.Id, - Deposit: DepositFromProto(d.Deposit), - } -} - -func (b BDeposit) IntoProto() *snapshot.Deposit { - return &snapshot.Deposit{ - Id: b.ID, - Deposit: b.Deposit.IntoProto(), - } -} - -func BankingSeenFromProto(bs *snapshot.BankingSeen) *BankingSeen { - ret := BankingSeen{ - Refs: bs.Refs, - LastSeenEthBlock: bs.LastSeenEthBlock, - } - return &ret -} - -func (b BankingSeen) IntoProto() *snapshot.BankingSeen { - ret := snapshot.BankingSeen{ - Refs: b.Refs, - LastSeenEthBlock: b.LastSeenEthBlock, - } - return &ret -} - -func (a *BankingAssetActions) IntoProto() *snapshot.BankingAssetActions { - ret := snapshot.BankingAssetActions{ - AssetAction: make([]*checkpointpb.AssetAction, 0, len(a.AssetAction)), - } - for _, aa := range a.AssetAction { - ret.AssetAction = append(ret.AssetAction, aa.IntoProto()) - } - return &ret -} - -func (aa *AssetAction) IntoProto() *checkpointpb.AssetAction { - ret := &checkpointpb.AssetAction{ - Id: aa.ID, - State: aa.State, - Asset: aa.Asset, - BlockNumber: aa.BlockNumber, - TxIndex: aa.TxIndex, - Hash: aa.Hash, - Erc20BridgeStopped: aa.BridgeStopped, - Erc20BridgeResumed: aa.BridgeResume, - } - if aa.BuiltinD != nil { - ret.BuiltinDeposit = aa.BuiltinD.IntoProto() - } - if aa.Erc20D != nil { - ret.Erc20Deposit = aa.Erc20D.IntoProto() - } - if aa.Erc20AL != nil { - ret.AssetList = aa.Erc20AL.IntoProto() - } - if aa.ERC20AssetLimitsUpdated != nil { - ret.Erc20AssetLimitsUpdated = aa.ERC20AssetLimitsUpdated.IntoProto() - } - return ret -} - -func BankingAssetActionsFromProto(aa *snapshot.BankingAssetActions) *BankingAssetActions { - ret := BankingAssetActions{ - AssetAction: make([]*AssetAction, 0, len(aa.AssetAction)), - } - - for _, a := range aa.AssetAction { - ret.AssetAction = append(ret.AssetAction, AssetActionFromProto(a)) - } - return &ret -} - -func AssetActionFromProto(a *checkpointpb.AssetAction) *AssetAction { - aa := &AssetAction{ - ID: a.Id, - State: a.State, - Asset: a.Asset, - BlockNumber: a.BlockNumber, - TxIndex: a.TxIndex, - Hash: a.Hash, - BridgeStopped: a.Erc20BridgeStopped, - BridgeResume: a.Erc20BridgeResumed, - } - - if a.Erc20Deposit != nil { - erc20d, err := NewERC20DepositFromProto(a.Erc20Deposit) - if err == nil { - aa.Erc20D = erc20d - } - } - - if a.BuiltinDeposit != nil { - builtind, err := NewBuiltinAssetDepositFromProto(a.BuiltinDeposit) - if err == nil { - aa.BuiltinD = builtind - } - } - - if a.AssetList != nil { - aa.Erc20AL = NewERC20AssetListFromProto(a.AssetList) - } - - if a.Erc20AssetLimitsUpdated != nil { - aa.ERC20AssetLimitsUpdated = NewERC20AssetLimitsUpdatedFromProto(a.Erc20AssetLimitsUpdated) - } - - return aa -} - func CheckpointFromProto(c *snapshot.Checkpoint) *CPState { return &CPState{ NextCp: c.NextCp, @@ -2989,8 +2286,9 @@ func (g GovernanceEnacted) IntoProto() *snapshot.GovernanceEnacted { func GovernanceNodeFromProto(ge *snapshot.GovernanceNode) *GovernanceNode { ret := GovernanceNode{ - Proposals: make([]*Proposal, 0, len(ge.Proposals)), - ProposalData: make([]*ProposalData, 0, len(ge.ProposalData)), + Proposals: make([]*Proposal, 0, len(ge.Proposals)), + ProposalData: make([]*ProposalData, 0, len(ge.ProposalData)), + BatchProposalData: ge.BatchProposalData, } for _, p := range ge.Proposals { gn, _ := ProposalFromProto(p) @@ -3007,8 +2305,9 @@ func GovernanceNodeFromProto(ge *snapshot.GovernanceNode) *GovernanceNode { func (g GovernanceNode) IntoProto() *snapshot.GovernanceNode { ret := snapshot.GovernanceNode{ - Proposals: make([]*vega.Proposal, 0, len(g.Proposals)), - ProposalData: make([]*snapshot.ProposalData, 0, len(g.ProposalData)), + Proposals: make([]*vega.Proposal, 0, len(g.Proposals)), + ProposalData: make([]*snapshot.ProposalData, 0, len(g.ProposalData)), + BatchProposalData: g.BatchProposalData, } for _, p := range g.Proposals { ret.Proposals = append(ret.Proposals, p.IntoProto()) @@ -3430,16 +2729,20 @@ func (p PriceRange) IntoProto() *snapshot.PriceRange { } func PriceRangeCacheFromProto(prc *snapshot.PriceRangeCache) *PriceRangeCache { + BoundIndex := int(prc.BoundIndex) + if prc.Bound != nil { + BoundIndex = -1 + } return &PriceRangeCache{ - Bound: PriceBoundFromProto(prc.Bound), - Range: PriceRangeFromProto(prc.Range), + BoundIndex: BoundIndex, + Range: PriceRangeFromProto(prc.Range), } } func (p PriceRangeCache) IntoProto() *snapshot.PriceRangeCache { return &snapshot.PriceRangeCache{ - Bound: p.Bound.IntoProto(), - Range: p.Range.IntoProto(), + BoundIndex: uint64(p.BoundIndex), + Range: p.Range.IntoProto(), } } @@ -3613,6 +2916,8 @@ func ExecSpotMarketFromProto(em *snapshot.SpotMarket) *ExecSpotMarket { Closed: em.Closed, StopOrders: em.StopOrders, FeesStats: em.FeesStats, + HasTraded: em.HasTraded, + MarketLiquidity: em.MarketLiquidity, } for _, o := range em.ExpiringOrders { or, _ := OrderFromProto(o) @@ -3644,6 +2949,8 @@ func (e ExecSpotMarket) IntoProto() *snapshot.SpotMarket { Closed: e.Closed, StopOrders: e.StopOrders, FeesStats: e.FeesStats, + HasTraded: e.HasTraded, + MarketLiquidity: e.MarketLiquidity, } if e.CurrentMarkPrice != nil { ret.CurrentMarkPrice = e.CurrentMarkPrice.String() @@ -3725,6 +3032,7 @@ func ExecMarketFromProto(em *snapshot.Market) *ExecMarket { PartyMarginFactors: em.PartyMarginFactor, MarkPriceCalculator: em.MarkPriceCalculator, InternalCompositePriceCalculator: em.InternalCompositePriceCalculator, + MarketLiquidity: em.MarketLiquidity, } for _, o := range em.ExpiringOrders { @@ -3768,6 +3076,7 @@ func (e ExecMarket) IntoProto() *snapshot.Market { PartyMarginFactor: e.PartyMarginFactors, MarkPriceCalculator: e.MarkPriceCalculator, InternalCompositePriceCalculator: e.InternalCompositePriceCalculator, + MarketLiquidity: e.MarketLiquidity, } if e.CurrentMarkPrice != nil { @@ -4606,36 +3915,6 @@ func (*PayloadStakeVerifierDeposited) Namespace() SnapshotNamespace { return StakeVerifierSnapshot } -func PayloadEventForwarderFromProto(ef *snapshot.Payload_EventForwarder) *PayloadEventForwarder { - return &PayloadEventForwarder{ - Keys: ef.EventForwarder.AckedEvents, - Buckets: ef.EventForwarder.Buckets, - } -} - -func (p *PayloadEventForwarder) IntoProto() *snapshot.Payload_EventForwarder { - return &snapshot.Payload_EventForwarder{ - EventForwarder: &snapshot.EventForwarder{ - AckedEvents: p.Keys, - Buckets: p.Buckets, - }, - } -} - -func (*PayloadEventForwarder) isPayload() {} - -func (p *PayloadEventForwarder) plToProto() interface{} { - return p.IntoProto() -} - -func (*PayloadEventForwarder) Key() string { - return "all" -} - -func (*PayloadEventForwarder) Namespace() SnapshotNamespace { - return EventForwarderSnapshot -} - func PayloadWitnessFromProto(w *snapshot.Payload_Witness) *PayloadWitness { resources := make([]*Resource, 0, len(w.Witness.Resources)) for _, r := range w.Witness.Resources { @@ -4972,3 +4251,29 @@ func GetNodeKey(ns SnapshotNamespace, k string) string { k, }, ".") } + +func PayloadEVMMultisigTopologiesFromProto( + s *snapshot.Payload_EvmMultisigTopologies, +) *PayloadEVMMultisigTopologies { + return &PayloadEVMMultisigTopologies{ + Topologies: s.EvmMultisigTopologies.EvmMultisigTopology, + } +} + +func (*PayloadEVMMultisigTopologies) isPayload() {} + +func (p *PayloadEVMMultisigTopologies) plToProto() interface{} { + return &snapshot.Payload_EvmMultisigTopologies{ + EvmMultisigTopologies: &snapshot.EVMMultisigTopologies{ + EvmMultisigTopology: p.Topologies, + }, + } +} + +func (p *PayloadEVMMultisigTopologies) Namespace() SnapshotNamespace { + return EVMMultiSigTopologiesSnapshot +} + +func (p *PayloadEVMMultisigTopologies) Key() string { + return "all" +} diff --git a/core/types/stop_orders.go b/core/types/stop_orders.go index de74e548b5..fe2767ee2c 100644 --- a/core/types/stop_orders.go +++ b/core/types/stop_orders.go @@ -93,6 +93,7 @@ const ( StopOrderRejectionLinkedPercentageInvalid StopOrderRejectionReason = vega.StopOrder_REJECTION_REASON_STOP_ORDER_LINKED_PERCENTAGE_INVALID StopOrderRejectionNotAllowedDuringOpeningAuction StopOrderRejectionReason = vega.StopOrder_REJECTION_REASON_STOP_ORDER_NOT_ALLOWED_DURING_OPENING_AUCTION StopOrderRejectionOCONotAllowedSameExpiryTime StopOrderRejectionReason = vega.StopOrder_REJECTION_REASON_STOP_ORDER_CANNOT_MATCH_OCO_EXPIRY_TIMES + StopOrderRejectionSizeOverrideUnsupportedForSpot StopOrderRejectionReason = vega.StopOrder_REJECTION_REASON_STOP_ORDER_SIZE_OVERRIDE_UNSUPPORTED_FOR_SPOT ) type StopOrderExpiry struct { @@ -223,7 +224,7 @@ func StopOrderSetupFromProto( expiry.ExpiryStrategy = psetup.ExpiryStrategy } - var sizeOverrideValue StopOrderSizeOverrideValue + var sizeOverrideValue *StopOrderSizeOverrideValue var sizeOverrideSetting StopOrderSizeOverrideSetting = vega.StopOrder_SIZE_OVERRIDE_SETTING_UNSPECIFIED if psetup.SizeOverrideValue != nil { @@ -231,7 +232,7 @@ func StopOrderSetupFromProto( if err != nil { return nil, err } - sizeOverrideValue = StopOrderSizeOverrideValue{PercentageSize: value} + sizeOverrideValue = &StopOrderSizeOverrideValue{PercentageSize: value} } if psetup.SizeOverrideSetting != nil { @@ -242,7 +243,7 @@ func StopOrderSetupFromProto( Expiry: expiry, Trigger: trigger, SizeOverrideSetting: sizeOverrideSetting, - SizeOverrideValue: &sizeOverrideValue, + SizeOverrideValue: sizeOverrideValue, }, nil } @@ -351,8 +352,13 @@ func (s *StopOrder) String() string { if s.RejectionReason != nil { rejectionReason = s.RejectionReason.String() } + sizeOverrideValue := "nil" + if s.SizeOverrideValue != nil { + sizeOverrideValue = s.SizeOverrideValue.PercentageSize.String() + } + return fmt.Sprintf( - "id(%v) party(%v) market(%v) orderSubmission(%v) orderId(%v) ocoLink(%v) expiry(%v) trigger(%v) status(%v) createdAt(%v) updatedAt(%v) rejectionReason(%v)", + "id(%v) party(%v) market(%v) orderSubmission(%v) orderId(%v) ocoLink(%v) expiry(%v) trigger(%v) status(%v) createdAt(%v) updatedAt(%v) rejectionReason(%v) sizeOverrideSetting(%v) sizeOverrideValue(%v)", s.ID, s.Party, s.Market, @@ -362,9 +368,11 @@ func (s *StopOrder) String() string { s.Expiry.String(), s.Trigger.String(), s.Status, - s.CreatedAt, - s.UpdatedAt, + s.CreatedAt.UTC(), + s.UpdatedAt.UTC(), rejectionReason, + s.SizeOverrideSetting, + sizeOverrideValue, ) } @@ -437,19 +445,26 @@ func (s *StopOrder) ToProtoEvent() *eventspb.StopOrderEvent { ocoLinkID = ptr.From(s.OCOLinkID) } + var sizeOverrideValue *vega.StopOrder_SizeOverrideValue + if s.SizeOverrideSetting == StopOrderSizeOverrideSettingPosition { + sizeOverrideValue = &vega.StopOrder_SizeOverrideValue{Percentage: s.SizeOverrideValue.PercentageSize.String()} + } + ev := &eventspb.StopOrderEvent{ Submission: s.OrderSubmission.IntoProto(), StopOrder: &vega.StopOrder{ - Id: s.ID, - PartyId: s.Party, - MarketId: s.Market, - OrderId: s.OrderID, - OcoLinkId: ocoLinkID, - Status: s.Status, - CreatedAt: s.CreatedAt.UnixNano(), - UpdatedAt: updatedAt, - TriggerDirection: s.Trigger.Direction, - RejectionReason: s.RejectionReason, + Id: s.ID, + PartyId: s.Party, + MarketId: s.Market, + OrderId: s.OrderID, + OcoLinkId: ocoLinkID, + Status: s.Status, + CreatedAt: s.CreatedAt.UnixNano(), + UpdatedAt: updatedAt, + TriggerDirection: s.Trigger.Direction, + RejectionReason: s.RejectionReason, + SizeOverrideSetting: s.SizeOverrideSetting, + SizeOverrideValue: sizeOverrideValue, }, } diff --git a/core/types/stop_orders_test.go b/core/types/stop_orders_test.go new file mode 100644 index 0000000000..608fac5f87 --- /dev/null +++ b/core/types/stop_orders_test.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 types_test + +import ( + "testing" + "time" + + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/protos/vega" + commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" + + "github.com/stretchr/testify/require" +) + +func TestStopOrdersProtoConversion(t *testing.T) { + position := vega.StopOrder_SIZE_OVERRIDE_SETTING_POSITION + none := vega.StopOrder_SIZE_OVERRIDE_SETTING_NONE + + submissionProto := &commandspb.StopOrdersSubmission{ + FallsBelow: &commandspb.StopOrderSetup{ + OrderSubmission: &commandspb.OrderSubmission{ + MarketId: "123", + Price: "100", + Size: 20, + Side: vega.Side_SIDE_BUY, + TimeInForce: vega.Order_TIME_IN_FORCE_FOK, + ExpiresAt: 12345, + Type: vega.Order_TYPE_LIMIT, + Reference: "ref_buy", + }, + SizeOverrideSetting: &position, + SizeOverrideValue: &vega.StopOrder_SizeOverrideValue{Percentage: "0.5"}, + }, + RisesAbove: &commandspb.StopOrderSetup{ + OrderSubmission: &commandspb.OrderSubmission{ + MarketId: "456", + Price: "200", + Size: 10, + Side: vega.Side_SIDE_SELL, + TimeInForce: vega.Order_TIME_IN_FORCE_GFA, + ExpiresAt: 54321, + Type: vega.Order_TYPE_MARKET, + Reference: "ref_sell", + }, + SizeOverrideSetting: &none, + SizeOverrideValue: nil, + }, + } + submission, err := types.NewStopOrderSubmissionFromProto(submissionProto) + require.NoError(t, err) + now := time.Date(2024, 3, 29, 10, 0, 0, 0, time.UTC) + fallsBelow, risesAbove := submission.IntoStopOrders("party1", "1", "2", now) + + fallsBelowEvent := fallsBelow.ToProtoEvent() + risesAboveEvent := risesAbove.ToProtoEvent() + + fallsBelowFromEvent := types.NewStopOrderFromProto(fallsBelowEvent) + risesAboveFromEvent := types.NewStopOrderFromProto(risesAboveEvent) + require.Equal(t, fallsBelow.String(), fallsBelowFromEvent.String()) + require.Equal(t, risesAbove.String(), risesAboveFromEvent.String()) +} diff --git a/core/validators/erc20multisig/erc20multisig.go b/core/validators/erc20multisig/erc20multisig.go index 1bd898928f..2c2be88b3c 100644 --- a/core/validators/erc20multisig/erc20multisig.go +++ b/core/validators/erc20multisig/erc20multisig.go @@ -29,24 +29,44 @@ func NewERC20MultisigTopology( config Config, log *logging.Logger, witness Witness, + broker broker.Interface, ethClient EthereumClient, ethConfirmation EthConfirmations, netp *netparams.Store, + scope string, ) *Topology { ocv := NewOnChainVerifier(config, log, ethClient, ethConfirmation) - _ = netp.Watch(netparams.WatchParam{ - Param: netparams.BlockchainsEthereumConfig, - Watcher: func(_ context.Context, cfg interface{}) error { - ethCfg, err := types.EthereumConfigFromUntypedProto(cfg) - if err != nil { - return fmt.Errorf("staking didn't receive a valid Ethereum configuration: %w", err) - } + top := NewTopology(config, log, witness, ocv, broker, scope) - ocv.UpdateMultiSigAddress(ethCfg.MultiSigControl().Address()) - return nil - }, - }) + if scope == "primary" { + _ = netp.Watch(netparams.WatchParam{ + Param: netparams.BlockchainsPrimaryEthereumConfig, + Watcher: func(_ context.Context, cfg interface{}) error { + ethCfg, err := types.EthereumConfigFromUntypedProto(cfg) + if err != nil { + return fmt.Errorf("ERC20 multisig didn't receive a valid Ethereum configuration: %w", err) + } + ocv.UpdateMultiSigAddress(ethCfg.MultiSigControl().Address(), ethCfg.ChainID()) + top.SetChainID(ethCfg.ChainID()) + return nil + }, + }) + } else { + _ = netp.Watch(netparams.WatchParam{ + Param: netparams.BlockchainsEVMBridgeConfigs, + Watcher: func(_ context.Context, cfg interface{}) error { + cfgs, err := types.EVMChainConfigFromUntypedProto(cfg) + if err != nil { + return fmt.Errorf("ERC20 multisig didn't receive a valid Ethereum configuration: %w", err) + } + ethCfg := cfgs.Configs[0] + ocv.UpdateMultiSigAddress(ethCfg.MultiSigControl().Address(), ethCfg.ChainID()) + top.SetChainID(ethCfg.ChainID()) + return nil + }, + }) + } - return NewTopology(config, log, witness, ocv, broker) + return top } diff --git a/core/validators/erc20multisig/evm_topologies.go b/core/validators/erc20multisig/evm_topologies.go new file mode 100644 index 0000000000..3214c0b6f6 --- /dev/null +++ b/core/validators/erc20multisig/evm_topologies.go @@ -0,0 +1,114 @@ +// 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 erc20multisig + +import ( + "context" + + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/libs/proto" + "code.vegaprotocol.io/vega/logging" + snapshotpb "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" +) + +// Topology keeps track of all the validators +// registered in the erc20 bridge. +type EVMTopologies struct { + topologies []*Topology +} + +func NewEVMTopologies( + secondBridge *Topology, +) *EVMTopologies { + return &EVMTopologies{ + topologies: []*Topology{secondBridge}, + } +} + +func (t *EVMTopologies) Namespace() types.SnapshotNamespace { + return types.EVMMultiSigTopologiesSnapshot +} + +func (t *EVMTopologies) Keys() []string { + return []string{ + (&types.PayloadEventForwarder{}).Key(), + } +} + +func (t *EVMTopologies) GetState(k string) ([]byte, []types.StateProvider, error) { + if k != (&types.PayloadEventForwarder{}).Key() { + return nil, nil, types.ErrSnapshotKeyDoesNotExist + } + data, err := t.serialise() + return data, nil, err +} + +func (t *EVMTopologies) Stopped() bool { + return false +} + +func (t *EVMTopologies) 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.PayloadEVMMultisigTopologies: + return nil, t.restore(ctx, pl.Topologies) + default: + return nil, types.ErrUnknownSnapshotType + } +} + +// get the serialised form of the given key. +func (t *EVMTopologies) restore(ctx context.Context, topologies []*snapshotpb.EVMMultisigTopology) error { + secondBridge := t.topologies[0] + if err := secondBridge.restorePendingState(ctx, topologies[0].Pending); err != nil { + return err + } + if err := secondBridge.restoreVerifiedState(ctx, topologies[0].Verified); err != nil { + return err + } + return nil +} + +// get the serialised form of the given key. +func (t *EVMTopologies) serialise() ([]byte, error) { + payload := types.Payload{ + Data: &types.PayloadEVMMultisigTopologies{ + Topologies: []*snapshotpb.EVMMultisigTopology{ + { + Verified: t.topologies[0].constructVerifiedState(), + Pending: t.topologies[0].constructPendingState(), + ChainId: t.topologies[0].chainID, + }, + }, + }, + } + return proto.Marshal(payload.IntoProto()) +} + +func (t *EVMTopologies) OnStateLoaded(ctx context.Context) error { + // tell the internal EEF where it got up to so we do not resend events we're already seen + + topology := t.topologies[0] + lastSeen := topology.getLastBlockSeen() + if lastSeen != 0 { + topology.log.Info("restoring multisig starting block", logging.Uint64("block", lastSeen), logging.String("chain-id", topology.chainID)) + topology.ethEventSource.UpdateMultisigControlStartingBlock(topology.getLastBlockSeen()) + } + return nil +} diff --git a/core/validators/erc20multisig/on_chain_verifier.go b/core/validators/erc20multisig/on_chain_verifier.go index 41faab201b..9b0e4e9e05 100644 --- a/core/validators/erc20multisig/on_chain_verifier.go +++ b/core/validators/erc20multisig/on_chain_verifier.go @@ -52,6 +52,7 @@ type OnChainVerifier struct { mu sync.RWMutex multiSigAddress ethcmn.Address + chainID string } func NewOnChainVerifier( @@ -71,14 +72,16 @@ func NewOnChainVerifier( } } -func (o *OnChainVerifier) UpdateMultiSigAddress(multiSigAddress ethcmn.Address) { +func (o *OnChainVerifier) UpdateMultiSigAddress(multiSigAddress ethcmn.Address, chainID string) { o.mu.Lock() defer o.mu.Unlock() o.multiSigAddress = multiSigAddress + o.chainID = chainID if o.log.GetLevel() <= logging.DebugLevel { o.log.Debug("multi sig bridge addresses updated", + logging.String("chain-id", chainID), logging.String("addresses", o.multiSigAddress.Hex())) } } @@ -89,6 +92,7 @@ func (o *OnChainVerifier) CheckSignerEvent(event *types.SignerEvent) error { if o.log.GetLevel() <= logging.DebugLevel { o.log.Debug("checking signer event on chain", + logging.String("chain-id", o.chainID), logging.String("contract-address", o.multiSigAddress.Hex()), logging.String("event", event.String()), ) @@ -100,6 +104,7 @@ func (o *OnChainVerifier) CheckSignerEvent(event *types.SignerEvent) error { ) if err != nil { o.log.Error("could not instantiate multisig control filterer", + logging.String("chain-id", o.chainID), logging.Error(err)) return err } @@ -125,6 +130,7 @@ func (o *OnChainVerifier) CheckThresholdSetEvent( if o.log.GetLevel() <= logging.DebugLevel { o.log.Debug("checking threshold set event on chain", + logging.String("chain-id", o.chainID), logging.String("contract-address", o.multiSigAddress.Hex()), logging.String("event", event.String()), ) @@ -136,6 +142,7 @@ func (o *OnChainVerifier) CheckThresholdSetEvent( ) if err != nil { o.log.Error("could not instantiate multisig control filterer", + logging.String("chain-id", o.chainID), logging.Error(err)) return err } @@ -152,6 +159,7 @@ func (o *OnChainVerifier) CheckThresholdSetEvent( ) if err != nil { o.log.Error("Couldn't start filtering on signer added event", + logging.String("chain-id", o.chainID), logging.Error(err)) return err } @@ -160,6 +168,7 @@ func (o *OnChainVerifier) CheckThresholdSetEvent( for iter.Next() { if o.log.GetLevel() <= logging.DebugLevel { o.log.Debug("found threshold set event on chain", + logging.String("chain-id", o.chainID), logging.Uint16("new-threshold", iter.Event.NewThreshold), ) } @@ -194,6 +203,7 @@ func (o *OnChainVerifier) filterSignerAdded( ) if err != nil { o.log.Error("Couldn't start filtering on signer added event", + logging.String("chain-id", o.chainID), logging.Error(err)) return err } @@ -202,6 +212,7 @@ func (o *OnChainVerifier) filterSignerAdded( for iter.Next() { if o.log.GetLevel() <= logging.DebugLevel { o.log.Debug("found signer added event on chain", + logging.String("chain-id", o.chainID), logging.String("new-signer", iter.Event.NewSigner.Hex()), ) } @@ -236,6 +247,7 @@ func (o *OnChainVerifier) filterSignerRemoved( ) if err != nil { o.log.Error("Couldn't start filtering on signer removed event", + logging.String("chain-id", o.chainID), logging.Error(err)) return err } @@ -244,6 +256,7 @@ func (o *OnChainVerifier) filterSignerRemoved( for iter.Next() { if o.log.GetLevel() <= logging.DebugLevel { o.log.Debug("found signer removed event on chain", + logging.String("chain-id", o.chainID), logging.String("old-signer", iter.Event.OldSigner.Hex()), ) } diff --git a/core/validators/erc20multisig/topology.go b/core/validators/erc20multisig/topology.go index f6100f7ed8..9db3b9f485 100644 --- a/core/validators/erc20multisig/topology.go +++ b/core/validators/erc20multisig/topology.go @@ -59,8 +59,9 @@ type EthereumEventSource interface { // Topology keeps track of all the validators // registered in the erc20 bridge. type Topology struct { - config Config - log *logging.Logger + config Config + log *logging.Logger + chainID string currentTime time.Time @@ -90,8 +91,6 @@ type Topology struct { witnessedThresholds map[string]struct{} witnessedSigners map[string]struct{} - // snapshot state - tss *topologySnapshotState ethEventSource EthereumEventSource } @@ -101,7 +100,8 @@ type pendingSigner struct { check func() error } -func (p pendingSigner) GetID() string { return p.ID } +func (p pendingSigner) GetID() string { return p.ID } +func (p pendingSigner) GetChainID() string { return p.ChainID } func (p pendingSigner) GetType() types.NodeVoteType { var ty types.NodeVoteType switch p.Kind { @@ -121,10 +121,12 @@ type pendingThresholdSet struct { check func() error } -func (p pendingThresholdSet) GetID() string { return p.ID } +func (p pendingThresholdSet) GetID() string { return p.ID } +func (p pendingThresholdSet) GetChainID() string { return p.ChainID } func (p pendingThresholdSet) GetType() types.NodeVoteType { return types.NodeVoteTypeSignerThresholdSet } + func (p *pendingThresholdSet) Check(ctx context.Context) error { return p.check() } func NewTopology( @@ -133,6 +135,7 @@ func NewTopology( witness Witness, ocv MultiSigOnChainVerifier, broker broker.Interface, + scope string, ) *Topology { log = log.Named(namedLogger + ".topology") log.SetLevel(config.Level.Get()) @@ -149,11 +152,19 @@ func NewTopology( seen: map[string]struct{}{}, witnessedThresholds: map[string]struct{}{}, witnessedSigners: map[string]struct{}{}, - tss: &topologySnapshotState{}, } return t } +// SetChainID sets the chainID of the EVM chain this multisig tracker belongs to. +func (t *Topology) SetChainID(chainID string) { + t.chainID = chainID +} + +func (t *Topology) ChainID() string { + return t.chainID +} + func (t *Topology) SetWitness(w Witness) { t.witness = w } @@ -209,6 +220,7 @@ func (t *Topology) GetThreshold() uint32 { func (t *Topology) ProcessSignerEvent(event *types.SignerEvent) error { if ok := t.ensureNotDuplicate(event.Hash()); !ok { t.log.Error("signer event already exists", + logging.String("chain-id", t.chainID), logging.String("event", event.String())) return ErrDuplicatedSignerEvent } @@ -219,6 +231,7 @@ func (t *Topology) ProcessSignerEvent(event *types.SignerEvent) error { } t.pendingSigners[event.ID] = pending t.log.Info("signer event received, starting validation", + logging.String("chain-id", t.chainID), logging.String("event", event.String())) return t.witness.StartCheck( @@ -228,6 +241,7 @@ func (t *Topology) ProcessSignerEvent(event *types.SignerEvent) error { func (t *Topology) ProcessThresholdEvent(event *types.SignerThresholdSetEvent) error { if ok := t.ensureNotDuplicate(event.Hash()); !ok { t.log.Error("threshold event already exists", + logging.String("chain-id", t.chainID), logging.String("event", event.String())) return ErrDuplicatedThresholdEvent } @@ -238,6 +252,7 @@ func (t *Topology) ProcessThresholdEvent(event *types.SignerThresholdSetEvent) e } t.pendingThresholds[event.ID] = pending t.log.Info("signer threshold set event received, starting validation", + logging.String("chain-id", t.chainID), logging.String("event", event.String())) return t.witness.StartCheck( @@ -272,7 +287,9 @@ func (t *Topology) onEventVerified(event interface{}, ok bool) { } t.witnessedThresholds[e.ID] = struct{}{} default: - t.log.Error("stake verifier received invalid event") + t.log.Error("multisig verifier received invalid event", + logging.String("chain-id", t.chainID), + ) return } } diff --git a/core/validators/erc20multisig/topology_snapshot_state.go b/core/validators/erc20multisig/topology_snapshot_state.go index dfd2b7a9f6..5c57c5fc2c 100644 --- a/core/validators/erc20multisig/topology_snapshot_state.go +++ b/core/validators/erc20multisig/topology_snapshot_state.go @@ -36,11 +36,6 @@ var ( } ) -type topologySnapshotState struct { - serialisedVerifiedState []byte - serialisedPendingState []byte -} - func (t *Topology) Namespace() types.SnapshotNamespace { return types.ERC20MultiSigTopologySnapshot } @@ -65,16 +60,16 @@ func (t *Topology) LoadState(ctx context.Context, payload *types.Payload) ([]typ switch pl := payload.Data.(type) { case *types.PayloadERC20MultiSigTopologyVerified: - return nil, t.restoreVerifiedState(ctx, pl.Verified, payload) + return nil, t.restoreVerifiedState(ctx, pl.Verified) case *types.PayloadERC20MultiSigTopologyPending: - return nil, t.restorePendingState(ctx, pl.Pending, payload) + return nil, t.restorePendingState(ctx, pl.Pending) default: return nil, types.ErrUnknownSnapshotType } } func (t *Topology) restoreVerifiedState( - _ context.Context, s *snapshotpb.ERC20MultiSigTopologyVerified, p *types.Payload, + _ context.Context, s *snapshotpb.ERC20MultiSigTopologyVerified, ) error { t.log.Debug("restoring snapshot verified state") if s.Threshold != nil { @@ -101,15 +96,13 @@ func (t *Topology) restoreVerifiedState( t.eventsPerAddress[v.Address] = events } - var err error - t.tss.serialisedVerifiedState, err = proto.Marshal(p.IntoProto()) - return err + return nil } func (t *Topology) restorePendingState( - _ context.Context, s *snapshotpb.ERC20MultiSigTopologyPending, p *types.Payload, + _ context.Context, s *snapshotpb.ERC20MultiSigTopologyPending, ) error { - t.log.Debug("restoring snapshot pending state") + t.log.Debug("restoring snapshot pending state", logging.String("chain-id", t.chainID)) t.log.Debug("restoring witness signers", logging.Int("n", len(s.WitnessedSigners))) for _, v := range s.WitnessedSigners { t.witnessedSigners[v] = struct{}{} @@ -154,12 +147,10 @@ func (t *Topology) restorePendingState( } } - var err error - t.tss.serialisedPendingState, err = proto.Marshal(p.IntoProto()) - return err + return nil } -func (t *Topology) serialiseVerifiedState() ([]byte, error) { +func (t *Topology) constructVerifiedState() *snapshotpb.ERC20MultiSigTopologyVerified { out := &snapshotpb.ERC20MultiSigTopologyVerified{} t.log.Debug("serialising snapshot verified state") // first serialise seen events @@ -206,14 +197,18 @@ func (t *Topology) serialiseVerifiedState() ([]byte, error) { out.Threshold = t.threshold.IntoProto() } + return out +} + +func (t *Topology) serialiseVerifiedState() ([]byte, error) { return proto.Marshal(types.Payload{ Data: &types.PayloadERC20MultiSigTopologyVerified{ - Verified: out, + Verified: t.constructVerifiedState(), }, }.IntoProto()) } -func (t *Topology) serialisePendingState() ([]byte, error) { +func (t *Topology) constructPendingState() *snapshotpb.ERC20MultiSigTopologyPending { t.log.Debug("serialising pending state") out := &snapshotpb.ERC20MultiSigTopologyPending{} @@ -249,29 +244,24 @@ func (t *Topology) serialisePendingState() ([]byte, error) { return out.PendingThresholdSet[i].Id < out.PendingThresholdSet[j].Id }) + return out +} + +func (t *Topology) serialisePendingState() ([]byte, error) { return proto.Marshal(types.Payload{ Data: &types.PayloadERC20MultiSigTopologyPending{ - Pending: out, + Pending: t.constructPendingState(), }, }.IntoProto()) } -func (t *Topology) serialiseK(serialFunc func() ([]byte, error), dataField *[]byte) ([]byte, error) { - data, err := serialFunc() - if err != nil { - return nil, err - } - *dataField = data - return data, nil -} - // get the serialised form of the given key. func (t *Topology) serialise(k string) ([]byte, error) { switch k { case verifiedStateKey: - return t.serialiseK(t.serialiseVerifiedState, &t.tss.serialisedVerifiedState) + return t.serialiseVerifiedState() case pendingStateKey: - return t.serialiseK(t.serialisePendingState, &t.tss.serialisedPendingState) + return t.serialisePendingState() default: return nil, types.ErrSnapshotKeyDoesNotExist } diff --git a/core/validators/erc20multisig/topology_test.go b/core/validators/erc20multisig/topology_test.go index 4f20fa4eab..0fd8233f51 100644 --- a/core/validators/erc20multisig/topology_test.go +++ b/core/validators/erc20multisig/topology_test.go @@ -56,6 +56,7 @@ func getTestTopology(t *testing.T) *testTopology { witness, ocv, broker, + "primary", ), ctrl: ctrl, broker: broker, diff --git a/core/validators/mocks/mocks.go b/core/validators/mocks/mocks.go index 09ae2fa2e5..027cdd76c8 100644 --- a/core/validators/mocks/mocks.go +++ b/core/validators/mocks/mocks.go @@ -569,31 +569,31 @@ func (mr *MockSignaturesMockRecorder) ClearStaleSignatures() *gomock.Call { } // EmitValidatorAddedSignatures mocks base method. -func (m *MockSignatures) EmitValidatorAddedSignatures(arg0 context.Context, arg1, arg2 string, arg3 time.Time) error { +func (m *MockSignatures) EmitValidatorAddedSignatures(arg0 context.Context, arg1, arg2, arg3 string, arg4 time.Time) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "EmitValidatorAddedSignatures", arg0, arg1, arg2, arg3) + ret := m.ctrl.Call(m, "EmitValidatorAddedSignatures", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(error) return ret0 } // EmitValidatorAddedSignatures indicates an expected call of EmitValidatorAddedSignatures. -func (mr *MockSignaturesMockRecorder) EmitValidatorAddedSignatures(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { +func (mr *MockSignaturesMockRecorder) EmitValidatorAddedSignatures(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EmitValidatorAddedSignatures", reflect.TypeOf((*MockSignatures)(nil).EmitValidatorAddedSignatures), arg0, arg1, arg2, arg3) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EmitValidatorAddedSignatures", reflect.TypeOf((*MockSignatures)(nil).EmitValidatorAddedSignatures), arg0, arg1, arg2, arg3, arg4) } // EmitValidatorRemovedSignatures mocks base method. -func (m *MockSignatures) EmitValidatorRemovedSignatures(arg0 context.Context, arg1, arg2 string, arg3 time.Time) error { +func (m *MockSignatures) EmitValidatorRemovedSignatures(arg0 context.Context, arg1, arg2, arg3 string, arg4 time.Time) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "EmitValidatorRemovedSignatures", arg0, arg1, arg2, arg3) + ret := m.ctrl.Call(m, "EmitValidatorRemovedSignatures", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(error) return ret0 } // EmitValidatorRemovedSignatures indicates an expected call of EmitValidatorRemovedSignatures. -func (mr *MockSignaturesMockRecorder) EmitValidatorRemovedSignatures(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { +func (mr *MockSignaturesMockRecorder) EmitValidatorRemovedSignatures(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EmitValidatorRemovedSignatures", reflect.TypeOf((*MockSignatures)(nil).EmitValidatorRemovedSignatures), arg0, arg1, arg2, arg3) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EmitValidatorRemovedSignatures", reflect.TypeOf((*MockSignatures)(nil).EmitValidatorRemovedSignatures), arg0, arg1, arg2, arg3, arg4) } // OfferSignatures mocks base method. @@ -693,6 +693,20 @@ func (m *MockMultiSigTopology) EXPECT() *MockMultiSigTopologyMockRecorder { return m.recorder } +// ChainID mocks base method. +func (m *MockMultiSigTopology) ChainID() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainID") + ret0, _ := ret[0].(string) + return ret0 +} + +// ChainID indicates an expected call of ChainID. +func (mr *MockMultiSigTopologyMockRecorder) ChainID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainID", reflect.TypeOf((*MockMultiSigTopology)(nil).ChainID)) +} + // ExcessSigners mocks base method. func (m *MockMultiSigTopology) ExcessSigners(arg0 []string) bool { m.ctrl.T.Helper() diff --git a/core/validators/signatures.go b/core/validators/signatures.go index 5cf5b27b56..287a4860a3 100644 --- a/core/validators/signatures.go +++ b/core/validators/signatures.go @@ -33,7 +33,10 @@ import ( snapshot "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" ) -var ErrNoPendingSignaturesForNodeID = errors.New("there are no pending signatures for the given nodeID") +var ( + ErrNoPendingSignaturesForNodeID = errors.New("there are no pending signatures for the given nodeID") + ErrUnknownChainID = errors.New("chain id does not correspond to any bridge") +) type Signatures interface { PreparePromotionsSignatures( @@ -45,8 +48,8 @@ type Signatures interface { ) SetNonce(currentTime time.Time) PrepareValidatorSignatures(ctx context.Context, validators []NodeIDAddress, epochSeq uint64, added bool) - EmitValidatorAddedSignatures(ctx context.Context, submitter, nodeID string, currentTime time.Time) error - EmitValidatorRemovedSignatures(ctx context.Context, submitter, nodeID string, currentTime time.Time) error + EmitValidatorAddedSignatures(ctx context.Context, submitter, nodeID, chainID string, currentTime time.Time) error + EmitValidatorRemovedSignatures(ctx context.Context, submitter, nodeID, chainID string, currentTime time.Time) error ClearStaleSignatures() SerialisePendingSignatures() *snapshot.ToplogySignatures RestorePendingSignatures(*snapshot.ToplogySignatures) @@ -64,21 +67,26 @@ type signatureData struct { type issuedSignature struct { EthAddress string SubmitterAddress string + ChainID string } type signatureWithSubmitter struct { signatureData SubmitterAddress string + chainID string } type ERC20Signatures struct { - log *logging.Logger - notary Notary - multiSigTopology MultiSigTopology - multisig *bridges.ERC20MultiSigControl + log *logging.Logger + notary Notary + primaryMultisig MultiSigTopology + // primaryBridge *bridges.ERC20MultiSigControl + secondaryMultisig MultiSigTopology + // secondaryBridge *bridges.ERC20MultiSigControl lastNonce *num.Uint broker Broker isValidatorSetup bool + signer Signer // stored nonce's etc. to be able to generate signatures to remove/add an ethereum address from the multisig bundle pendingSignatures map[string]*signatureData @@ -87,7 +95,8 @@ type ERC20Signatures struct { func NewSignatures( log *logging.Logger, - multiSigTopology MultiSigTopology, + primaryMultisig MultiSigTopology, + secondaryMultisig MultiSigTopology, notary Notary, nw NodeWallets, broker Broker, @@ -96,7 +105,8 @@ func NewSignatures( s := &ERC20Signatures{ log: log, notary: notary, - multiSigTopology: multiSigTopology, + primaryMultisig: primaryMultisig, + secondaryMultisig: secondaryMultisig, lastNonce: num.UintZero(), broker: broker, isValidatorSetup: isValidatorSetup, @@ -104,7 +114,7 @@ func NewSignatures( issuedSignatures: map[string]issuedSignature{}, } if isValidatorSetup { - s.multisig = bridges.NewERC20MultiSigControl(nw.GetEthereum()) + s.signer = nw.GetEthereum() } return s } @@ -121,6 +131,17 @@ type NodeIDAddress struct { SubmitterAddress string } +// isBridge returns whether the given chainID corresponds to one of the bridges, and returns if it is the Ethereum bridge. +func (s *ERC20Signatures) isBridge(chainID string) (isBridge bool, isEthereum bool) { + switch chainID { + case s.primaryMultisig.ChainID(): + isBridge, isEthereum = true, true + case s.secondaryMultisig.ChainID(): + isBridge, isEthereum = true, false + } + return +} + func (s *ERC20Signatures) OfferSignatures() { s.notary.OfferSignatures(types.NodeSignatureKindERC20MultiSigSignerAdded, s.offerValidatorAddedSignatures) s.notary.OfferSignatures(types.NodeSignatureKindERC20MultiSigSignerRemoved, s.offerValidatorRemovedSignatures) @@ -140,6 +161,7 @@ func (s *ERC20Signatures) getSignatureWithSubmitterByResID(resID string) (*signa return &signatureWithSubmitter{ signatureData: *sd, SubmitterAddress: is.SubmitterAddress, + chainID: is.ChainID, }, nil } @@ -157,7 +179,12 @@ func (s *ERC20Signatures) offerValidatorAddedSignatures(resID string) []byte { s.log.Panic("expected added signature but got removed signature instead", logging.String("ethereumAddress", sig.EthAddress)) } - signature, err := s.multisig.AddSigner(sig.EthAddress, sig.SubmitterAddress, sig.Nonce.Clone()) + isBridge, isEthereum := s.isBridge(sig.chainID) + if !isBridge { + s.log.Panic("unexpected bridge chainID", logging.String("chain-id", sig.chainID)) + } + + signature, err := bridges.NewERC20MultiSigControl(s.signer, sig.chainID, isEthereum).AddSigner(sig.EthAddress, sig.SubmitterAddress, sig.Nonce.Clone()) if err != nil { s.log.Panic("could not sign remove signer event, wallet not configured properly", logging.Error(err)) @@ -180,7 +207,12 @@ func (s *ERC20Signatures) offerValidatorRemovedSignatures(resID string) []byte { s.log.Panic("expected removed signature but got added signature instead", logging.String("ethereumAddress", sig.EthAddress)) } - signature, err := s.multisig.RemoveSigner(sig.EthAddress, sig.SubmitterAddress, sig.Nonce.Clone()) + isBridge, isEthereum := s.isBridge(sig.chainID) + if !isBridge { + s.log.Panic("unexpected bridge chainID", logging.String("chain-id", sig.chainID)) + } + + signature, err := bridges.NewERC20MultiSigControl(s.signer, sig.chainID, isEthereum).RemoveSigner(sig.EthAddress, sig.SubmitterAddress, sig.Nonce.Clone()) if err != nil { s.log.Panic("could not sign remove signer event, wallet not configured properly", logging.Error(err)) @@ -250,7 +282,8 @@ func (s *ERC20Signatures) PreparePromotionsSignatures( for _, v := range toAdd { if v.SubmitterAddress != "" { s.log.Debug("sending automatic add signatures", logging.String("submitter", v.SubmitterAddress), logging.String("nodeID", v.NodeID)) - s.EmitValidatorAddedSignatures(ctx, v.SubmitterAddress, v.NodeID, currentTime) + s.EmitValidatorAddedSignatures(ctx, v.SubmitterAddress, v.NodeID, s.primaryMultisig.ChainID(), currentTime) + s.EmitValidatorAddedSignatures(ctx, v.SubmitterAddress, v.NodeID, s.secondaryMultisig.ChainID(), currentTime) } } @@ -260,7 +293,8 @@ func (s *ERC20Signatures) PreparePromotionsSignatures( for _, v := range newState { if v.SubmitterAddress != "" && v.Status == ValidatorStatusTendermint { s.log.Debug("sending automatic remove signatures", logging.String("submitter", v.SubmitterAddress), logging.String("nodeID", r.NodeID)) - s.EmitValidatorRemovedSignatures(ctx, v.SubmitterAddress, r.NodeID, currentTime) + s.EmitValidatorRemovedSignatures(ctx, v.SubmitterAddress, r.NodeID, s.primaryMultisig.ChainID(), currentTime) + s.EmitValidatorRemovedSignatures(ctx, v.SubmitterAddress, r.NodeID, s.secondaryMultisig.ChainID(), currentTime) } } } @@ -295,26 +329,35 @@ func (s *ERC20Signatures) PrepareValidatorSignatures(ctx context.Context, valida } // EmitValidatorAddedSignatures emit signatures to add nodeID's ethereum address onto that can be submitter to the contract by submitter. -func (s *ERC20Signatures) EmitValidatorAddedSignatures(ctx context.Context, submitter, nodeID string, currentTime time.Time) error { +func (s *ERC20Signatures) EmitValidatorAddedSignatures(ctx context.Context, submitter, nodeID, chainID string, currentTime time.Time) error { toEmit := s.getSignatureData(nodeID, true) if len(toEmit) == 0 { return ErrNoPendingSignaturesForNodeID } + isBridge, isEthereum := s.isBridge(chainID) + if !isBridge { + return ErrUnknownChainID + } + evts := []events.Event{} for _, pending := range toEmit { var sig []byte nonce := pending.Nonce - resid := hex.EncodeToString(vgcrypto.Hash([]byte(submitter + nonce.String()))) + resid := hex.EncodeToString(vgcrypto.Hash([]byte(submitter + nonce.String() + chainID))) if _, ok := s.issuedSignatures[resid]; ok { // we've already issued a signature for this submitter we don't want to do it again, it'll annoy the notary engine - s.log.Debug("add signatures already issued", logging.String("submitter", submitter), logging.String("add-address", pending.EthAddress)) + s.log.Debug("add signatures already issued", + logging.String("chain-id", chainID), + logging.String("submitter", submitter), + logging.String("add-address", + pending.EthAddress)) continue } if s.isValidatorSetup { - signature, err := s.multisig.AddSigner(pending.EthAddress, submitter, nonce) + signature, err := bridges.NewERC20MultiSigControl(s.signer, chainID, isEthereum).AddSigner(pending.EthAddress, submitter, nonce) if err != nil { s.log.Panic("could not sign remove signer event, wallet not configured properly", logging.Error(err)) @@ -333,6 +376,7 @@ func (s *ERC20Signatures) EmitValidatorAddedSignatures(ctx context.Context, subm NewSigner: pending.EthAddress, Submitter: submitter, Nonce: nonce.String(), + ChainId: chainID, }, )) @@ -340,6 +384,7 @@ func (s *ERC20Signatures) EmitValidatorAddedSignatures(ctx context.Context, subm s.issuedSignatures[resid] = issuedSignature{ EthAddress: pending.EthAddress, SubmitterAddress: submitter, + ChainID: chainID, } } s.broker.SendBatch(evts) @@ -347,12 +392,17 @@ func (s *ERC20Signatures) EmitValidatorAddedSignatures(ctx context.Context, subm } // EmitValidatorRemovedSignatures emit signatures to remove nodeID's ethereum address onto that can be submitter to the contract by submitter. -func (s *ERC20Signatures) EmitValidatorRemovedSignatures(ctx context.Context, submitter, nodeID string, currentTime time.Time) error { +func (s *ERC20Signatures) EmitValidatorRemovedSignatures(ctx context.Context, submitter, nodeID, chainID string, currentTime time.Time) error { toEmit := s.getSignatureData(nodeID, false) if len(toEmit) == 0 { return ErrNoPendingSignaturesForNodeID } + isBridge, isEthereum := s.isBridge(chainID) + if !isBridge { + return ErrUnknownChainID + } + evts := []events.Event{} // its possible for a nodeID to need to remove 2 of their etheruem addresses from the contract. For example if they initiate a key rotation // and after adding their new key but before they've removed their old key they get demoted. At that point they can have 2 signers on the @@ -361,7 +411,7 @@ func (s *ERC20Signatures) EmitValidatorRemovedSignatures(ctx context.Context, su var sig []byte nonce := pending.Nonce - resid := hex.EncodeToString(vgcrypto.Hash([]byte(pending.EthAddress + submitter + nonce.String()))) + resid := hex.EncodeToString(vgcrypto.Hash([]byte(pending.EthAddress + submitter + nonce.String() + chainID))) if _, ok := s.issuedSignatures[resid]; ok { // we've already issued a signature for this submitter we don't want to do it again, it'll annoy the notary engine s.log.Debug("remove signatures already issued", logging.String("submitter", submitter), logging.String("add-address", pending.EthAddress)) @@ -369,7 +419,7 @@ func (s *ERC20Signatures) EmitValidatorRemovedSignatures(ctx context.Context, su } if s.isValidatorSetup { - signature, err := s.multisig.RemoveSigner(pending.EthAddress, submitter, nonce) + signature, err := bridges.NewERC20MultiSigControl(s.signer, chainID, isEthereum).RemoveSigner(pending.EthAddress, submitter, nonce) if err != nil { s.log.Panic("could not sign remove signer event, wallet not configured properly", logging.Error(err)) @@ -394,6 +444,7 @@ func (s *ERC20Signatures) EmitValidatorRemovedSignatures(ctx context.Context, su EpochSeq: num.NewUint(pending.EpochSeq).String(), OldSigner: pending.EthAddress, Nonce: nonce.String(), + ChainId: chainID, }, )) @@ -401,6 +452,7 @@ func (s *ERC20Signatures) EmitValidatorRemovedSignatures(ctx context.Context, su s.issuedSignatures[resid] = issuedSignature{ EthAddress: pending.EthAddress, SubmitterAddress: submitter, + ChainID: chainID, } } s.broker.SendBatch(evts) @@ -412,7 +464,7 @@ func (s *ERC20Signatures) EmitValidatorRemovedSignatures(ctx context.Context, su func (s *ERC20Signatures) ClearStaleSignatures() { toRemove := []string{} for e, p := range s.pendingSignatures { - if p.Added == s.multiSigTopology.IsSigner(e) { + if p.Added == s.primaryMultisig.IsSigner(e) && p.Added == s.secondaryMultisig.IsSigner(e) { toRemove = append(toRemove, e) } } @@ -427,12 +479,12 @@ type noopSignatures struct { log *logging.Logger } -func (n *noopSignatures) EmitValidatorAddedSignatures(_ context.Context, _, _ string, _ time.Time) error { +func (n *noopSignatures) EmitValidatorAddedSignatures(_ context.Context, _, _, _ string, _ time.Time) error { n.log.Error("noopSignatures implementation in use in production") return nil } -func (n *noopSignatures) EmitValidatorRemovedSignatures(_ context.Context, _, _ string, _ time.Time) error { +func (n *noopSignatures) EmitValidatorRemovedSignatures(_ context.Context, _, _, _ string, _ time.Time) error { n.log.Error("noopSignatures implementation in use in production") return nil } diff --git a/core/validators/signatures_snapshot.go b/core/validators/signatures_snapshot.go index 133c5ec9c3..c9a73ff309 100644 --- a/core/validators/signatures_snapshot.go +++ b/core/validators/signatures_snapshot.go @@ -46,6 +46,7 @@ func (s *ERC20Signatures) SerialisePendingSignatures() *snapshot.ToplogySignatur ResourceId: resID, EthereumAddress: data.EthAddress, SubmitterAddress: data.SubmitterAddress, + ChainId: data.ChainID, }) } sort.SliceStable(issued, func(i, j int) bool { @@ -75,9 +76,17 @@ func (s *ERC20Signatures) RestorePendingSignatures(sigs *snapshot.ToplogySignatu } for _, data := range sigs.IssuedSignatures { + chainID := data.ChainId + if chainID == "" { + // we're upgrading from a version with only one bridge, set the chainID to the primary bridge chainID + // TODO confirm .ChainID is populated, we should have propagated network parameters by now + chainID = s.primaryMultisig.ChainID() + } + s.issuedSignatures[data.ResourceId] = issuedSignature{ EthAddress: data.EthereumAddress, SubmitterAddress: data.SubmitterAddress, + ChainID: chainID, } } } diff --git a/core/validators/signatures_test.go b/core/validators/signatures_test.go index e2cd3efc05..6aa28b2f2f 100644 --- a/core/validators/signatures_test.go +++ b/core/validators/signatures_test.go @@ -35,13 +35,16 @@ import ( "github.com/stretchr/testify/require" ) +var chainID = "12" + type testSignatures struct { *validators.ERC20Signatures - notary *mocks.MockNotary - ctrl *gomock.Controller - broker *bmocks.MockBroker - signer testSigner - multisigTopology *mocks.MockMultiSigTopology + notary *mocks.MockNotary + ctrl *gomock.Controller + broker *bmocks.MockBroker + signer testSigner + multisigTopology *mocks.MockMultiSigTopology + secondaryMultisigTopology *mocks.MockMultiSigTopology } func getTestSignatures(t *testing.T) *testSignatures { @@ -51,6 +54,7 @@ func getTestSignatures(t *testing.T) *testSignatures { broker := bmocks.NewMockBroker(ctrl) nodewallet := mocks.NewMockNodeWallets(ctrl) multisigTopology := mocks.NewMockMultiSigTopology(ctrl) + secondaryMultisigTopology := mocks.NewMockMultiSigTopology(ctrl) tsigner := testSigner{} nodewallet.EXPECT().GetEthereum().AnyTimes().Return(tsigner) @@ -58,16 +62,18 @@ func getTestSignatures(t *testing.T) *testSignatures { ERC20Signatures: validators.NewSignatures( logging.NewTestLogger(), multisigTopology, + secondaryMultisigTopology, notary, nodewallet, broker, true, ), - ctrl: ctrl, - notary: notary, - broker: broker, - signer: tsigner, - multisigTopology: multisigTopology, + ctrl: ctrl, + notary: notary, + broker: broker, + signer: tsigner, + multisigTopology: multisigTopology, + secondaryMultisigTopology: secondaryMultisigTopology, } } @@ -126,7 +132,7 @@ func TestPromotionSignatures(t *testing.T) { }) signatures.notary.EXPECT().StartAggregate(gomock.Any(), gomock.Any(), gomock.Any()).Times(5) - + signatures.multisigTopology.EXPECT().ChainID().Times(5).Return(chainID) // now, there's no assertion to do just now, this only send a sh*t ton of events signatures.PreparePromotionsSignatures( ctx, @@ -139,7 +145,7 @@ func TestPromotionSignatures(t *testing.T) { assert.Len(t, evts, 0) // now request the signature bundle for the adding - err := signatures.EmitValidatorAddedSignatures(ctx, "0x7629Faf5B7a3BB167B6f2F86DB5fB7f13B20Ee90", "4554375ce61b6828c6f7b625b7735034496b7ea19951509cccf4eb2ba35011b0", currentTime) + err := signatures.EmitValidatorAddedSignatures(ctx, "0x7629Faf5B7a3BB167B6f2F86DB5fB7f13B20Ee90", "4554375ce61b6828c6f7b625b7735034496b7ea19951509cccf4eb2ba35011b0", chainID, currentTime) require.NoError(t, err) // now ask for all the removes, each tendermint validator will ask @@ -149,12 +155,12 @@ func TestPromotionSignatures(t *testing.T) { } for _, v := range toAsk { - err = signatures.EmitValidatorRemovedSignatures(ctx, v, "927cbf8d5909cc017cf78ea9806fd57c3115d37e481eaf9d866f526b356f3ced", currentTime) + err = signatures.EmitValidatorRemovedSignatures(ctx, v, "927cbf8d5909cc017cf78ea9806fd57c3115d37e481eaf9d866f526b356f3ced", chainID, currentTime) require.NoError(t, err) } for _, v := range toAsk { - err = signatures.EmitValidatorRemovedSignatures(ctx, v, "95893347980299679883f817f118718f949826d1a0a1c2e4f22ba5f0cd6d1f5d", currentTime) + err = signatures.EmitValidatorRemovedSignatures(ctx, v, "95893347980299679883f817f118718f949826d1a0a1c2e4f22ba5f0cd6d1f5d", chainID, currentTime) require.NoError(t, err) } @@ -193,26 +199,29 @@ func TestPromotionSignatures(t *testing.T) { snap.RestorePendingSignatures(state) snap.broker.EXPECT().SendBatch(gomock.Any()).Times(len(toAsk) + 1) + snap.multisigTopology.EXPECT().ChainID().Times(len(toAsk) + 1).Return(chainID) // check the pending signatures still exist (we get no error) and that "already issued" is restored (notary mock should not expect anything) - require.NoError(t, snap.EmitValidatorAddedSignatures(ctx, "0x7629Faf5B7a3BB167B6f2F86DB5fB7f13B20Ee90", "4554375ce61b6828c6f7b625b7735034496b7ea19951509cccf4eb2ba35011b0", currentTime)) + require.NoError(t, snap.EmitValidatorAddedSignatures(ctx, "0x7629Faf5B7a3BB167B6f2F86DB5fB7f13B20Ee90", "4554375ce61b6828c6f7b625b7735034496b7ea19951509cccf4eb2ba35011b0", chainID, currentTime)) for _, v := range toAsk { - require.NoError(t, snap.EmitValidatorRemovedSignatures(ctx, v, "95893347980299679883f817f118718f949826d1a0a1c2e4f22ba5f0cd6d1f5d", currentTime)) + require.NoError(t, snap.EmitValidatorRemovedSignatures(ctx, v, "95893347980299679883f817f118718f949826d1a0a1c2e4f22ba5f0cd6d1f5d", chainID, currentTime)) } }) t.Run("clear stale remove signatures", func(t *testing.T) { // return that the signers are not on the contract signatures.multisigTopology.EXPECT().IsSigner(gomock.Any()).Return(false).Times(3) + signatures.secondaryMultisigTopology.EXPECT().IsSigner(gomock.Any()).Return(false).Times(2) signatures.ClearStaleSignatures() // we should get no signatures for the removed nodes - require.Error(t, validators.ErrNoPendingSignaturesForNodeID, signatures.EmitValidatorRemovedSignatures(ctx, "submitter", "927cbf8d5909cc017cf78ea9806fd57c3115d37e481eaf9d866f526b356f3ced", currentTime)) + require.Error(t, validators.ErrNoPendingSignaturesForNodeID, signatures.EmitValidatorRemovedSignatures(ctx, "submitter", "927cbf8d5909cc017cf78ea9806fd57c3115d37e481eaf9d866f526b356f3ced", chainID, currentTime)) // now for the add signatures signatures.multisigTopology.EXPECT().IsSigner(gomock.Any()).Return(true).Times(1) + signatures.secondaryMultisigTopology.EXPECT().IsSigner(gomock.Any()).Return(true).Times(1) signatures.ClearStaleSignatures() - require.Error(t, validators.ErrNoPendingSignaturesForNodeID, signatures.EmitValidatorAddedSignatures(ctx, "0x7629Faf5B7a3BB167B6f2F86DB5fB7f13B20Ee90", "4554375ce61b6828c6f7b625b7735034496b7ea19951509cccf4eb2ba35011b0", currentTime)) + require.Error(t, validators.ErrNoPendingSignaturesForNodeID, signatures.EmitValidatorAddedSignatures(ctx, "0x7629Faf5B7a3BB167B6f2F86DB5fB7f13B20Ee90", "4554375ce61b6828c6f7b625b7735034496b7ea19951509cccf4eb2ba35011b0", chainID, currentTime)) }) } @@ -242,19 +251,21 @@ func TestOfferSignatures(t *testing.T) { removeSig = signature }, ) + signatures.multisigTopology.EXPECT().ChainID().Times(1).Return(chainID) submitter := "node_operator" now := time.Now() validator := validators.NodeIDAddress{NodeID: "node_1", EthAddress: "eth_address"} signatures.PrepareValidatorSignatures(ctx, []validators.NodeIDAddress{validator}, 1, false) - err := signatures.EmitValidatorRemovedSignatures(ctx, submitter, validator.NodeID, now) + err := signatures.EmitValidatorRemovedSignatures(ctx, submitter, validator.NodeID, chainID, now) require.NoError(t, err) + signatures.multisigTopology.EXPECT().ChainID().Times(1).Return(chainID) validator.EthAddress = "updated_eth_address" signatures.PrepareValidatorSignatures(ctx, []validators.NodeIDAddress{validator}, 1, true) - err = signatures.EmitValidatorAddedSignatures(ctx, submitter, validator.NodeID, now) + err = signatures.EmitValidatorAddedSignatures(ctx, submitter, validator.NodeID, chainID, now) require.NoError(t, err) signatures.notary.EXPECT(). @@ -270,7 +281,7 @@ func TestOfferSignatures(t *testing.T) { require.Equal(t, removeSig, f(removeSigResID)) }, ) - + signatures.multisigTopology.EXPECT().ChainID().Times(2).Return(chainID) signatures.OfferSignatures() } diff --git a/core/validators/topology.go b/core/validators/topology.go index 6474885fc9..cb56489aea 100644 --- a/core/validators/topology.go +++ b/core/validators/topology.go @@ -43,7 +43,6 @@ import ( var ( ErrVegaNodeAlreadyRegisterForChain = errors.New("a vega node is already registered with the blockchain node") - ErrInvalidChainPubKey = errors.New("invalid blockchain public key") ErrIssueSignaturesUnexpectedKind = errors.New("unexpected node-signature kind") ) @@ -64,6 +63,7 @@ type MultiSigTopology interface { ExcessSigners(addresses []string) bool GetSigners() []string GetThreshold() uint32 + ChainID() string } type ValidatorPerformance interface { @@ -125,7 +125,8 @@ type Topology struct { broker Broker timeService TimeService validatorPerformance ValidatorPerformance - multiSigTopology MultiSigTopology + primaryMultisig MultiSigTopology + secondaryMultisig MultiSigTopology // vega pubkey to validator data validators validators @@ -217,7 +218,15 @@ func (t *Topology) OnEpochEvent(ctx context.Context, epoch types.Epoch) { } func NewTopology( - log *logging.Logger, cfg Config, wallets NodeWallets, broker Broker, isValidatorSetup bool, cmd Commander, msTopology MultiSigTopology, timeService TimeService, + log *logging.Logger, + cfg Config, + wallets NodeWallets, + broker Broker, + isValidatorSetup bool, + cmd Commander, + primaryMultisig MultiSigTopology, + secondaryMultisig MultiSigTopology, + timeService TimeService, ) *Topology { log = log.Named(namedLogger) log.SetLevel(cfg.Level.Get()) @@ -238,7 +247,8 @@ func NewTopology( validatorPerformance: NewValidatorPerformance(log), validatorIncumbentBonusFactor: num.DecimalZero(), ersatzValidatorsFactor: num.DecimalZero(), - multiSigTopology: msTopology, + primaryMultisig: primaryMultisig, + secondaryMultisig: secondaryMultisig, cmd: cmd, signatures: &noopSignatures{log}, } @@ -265,7 +275,7 @@ func (t *Topology) OnEpochLengthUpdate(ctx context.Context, l time.Duration) err // anyway we may want to extract the code requiring the notary somewhere // else or have different pattern somehow... func (t *Topology) SetNotary(notary Notary) { - t.signatures = NewSignatures(t.log, t.multiSigTopology, notary, t.wallets, t.broker, t.isValidatorSetup) + t.signatures = NewSignatures(t.log, t.primaryMultisig, t.secondaryMultisig, notary, t.wallets, t.broker, t.isValidatorSetup) t.notary = notary } @@ -641,14 +651,14 @@ func (t *Topology) checkValidatorDataWithSelfWallets(data ValidatorData) { t.isValidator = true } -func (t *Topology) IssueSignatures(ctx context.Context, submitter, nodeID string, kind types.NodeSignatureKind) error { +func (t *Topology) IssueSignatures(ctx context.Context, submitter, nodeID, chainID string, kind types.NodeSignatureKind) error { t.log.Debug("received IssueSignatures txn", logging.String("submitter", submitter), logging.String("nodeID", nodeID)) currentTime := t.timeService.GetTimeNow() switch kind { case types.NodeSignatureKindERC20MultiSigSignerAdded: - return t.signatures.EmitValidatorAddedSignatures(ctx, submitter, nodeID, currentTime) + return t.signatures.EmitValidatorAddedSignatures(ctx, submitter, nodeID, chainID, currentTime) case types.NodeSignatureKindERC20MultiSigSignerRemoved: - return t.signatures.EmitValidatorRemovedSignatures(ctx, submitter, nodeID, currentTime) + return t.signatures.EmitValidatorRemovedSignatures(ctx, submitter, nodeID, chainID, currentTime) default: return ErrIssueSignaturesUnexpectedKind } diff --git a/core/validators/topology_eth_key_rotate.go b/core/validators/topology_eth_key_rotate.go index 88c325a936..62716bd94a 100644 --- a/core/validators/topology_eth_key_rotate.go +++ b/core/validators/topology_eth_key_rotate.go @@ -133,7 +133,8 @@ func (t *Topology) ProcessEthereumKeyRotation( t.signatures.PrepareValidatorSignatures(ctx, toRemove, t.epochSeq, false) if len(kr.SubmitterAddress) != 0 { // we were given an address that will be submitting the multisig changes, we can emit a remove signature for it right now - t.signatures.EmitValidatorRemovedSignatures(ctx, kr.SubmitterAddress, node.data.ID, t.timeService.GetTimeNow()) + t.signatures.EmitValidatorRemovedSignatures(ctx, kr.SubmitterAddress, node.data.ID, t.primaryMultisig.ChainID(), t.timeService.GetTimeNow()) + t.signatures.EmitValidatorRemovedSignatures(ctx, kr.SubmitterAddress, node.data.ID, t.secondaryMultisig.ChainID(), t.timeService.GetTimeNow()) } return nil @@ -164,7 +165,7 @@ func (t *Topology) ethereumKeyRotationBeginBlockLocked(ctx context.Context) { // check any unfinalised key rotations remove := []string{} for _, r := range t.unresolvedEthKeyRotations { - if !t.multiSigTopology.IsSigner(r.OldAddress) && t.multiSigTopology.IsSigner(r.NewAddress) { + if !t.primaryMultisig.IsSigner(r.OldAddress) && t.primaryMultisig.IsSigner(r.NewAddress) { t.log.Info("ethereum key rotations have been resolved on the multisig contract", logging.String("nodeID", r.NodeID), logging.String("old-address", r.OldAddress)) remove = append(remove, r.NodeID) } @@ -222,7 +223,8 @@ func (t *Topology) ethereumKeyRotationBeginBlockLocked(ctx context.Context) { if len(r.SubmitterAddress) != 0 { // we were given an address that will be submitting the multisig changes, we can emit signatures for it right now - t.signatures.EmitValidatorAddedSignatures(ctx, r.SubmitterAddress, r.NodeID, t.timeService.GetTimeNow()) + t.signatures.EmitValidatorAddedSignatures(ctx, r.SubmitterAddress, r.NodeID, t.primaryMultisig.ChainID(), t.timeService.GetTimeNow()) + t.signatures.EmitValidatorAddedSignatures(ctx, r.SubmitterAddress, r.NodeID, t.secondaryMultisig.ChainID(), t.timeService.GetTimeNow()) } // add to unfinalised map so we can wait to see the changes on the contract diff --git a/core/validators/topology_eth_key_rotate_test.go b/core/validators/topology_eth_key_rotate_test.go index 2eb35254c9..012a453377 100644 --- a/core/validators/topology_eth_key_rotate_test.go +++ b/core/validators/topology_eth_key_rotate_test.go @@ -290,14 +290,15 @@ func TestEthereumKeyRotationBeginBlockWithSubmitter(t *testing.T) { err := top.AddNewNode(ctx, &nr, validators.ValidatorStatusTendermint) require.NoErrorf(t, err, "failed to add node registation %s", id) } - submitter := "some-eth-address" + top.multisigTop.EXPECT().ChainID().Times(1) + top.multisigTop2.EXPECT().ChainID().Times(1) top.signatures.EXPECT().PrepareValidatorSignatures(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(3) - top.signatures.EXPECT().EmitValidatorRemovedSignatures(gomock.Any(), submitter, gomock.Any(), gomock.Any()).Times(2) - top.signatures.EXPECT().EmitValidatorAddedSignatures(gomock.Any(), submitter, gomock.Any(), gomock.Any()).Times(1) + top.signatures.EXPECT().EmitValidatorRemovedSignatures(gomock.Any(), submitter, gomock.Any(), gomock.Any(), gomock.Any()).Times(4) + top.signatures.EXPECT().EmitValidatorAddedSignatures(gomock.Any(), submitter, gomock.Any(), gomock.Any(), gomock.Any()).Times(2) top.signatures.EXPECT().ClearStaleSignatures().AnyTimes() - top.timeService.EXPECT().GetTimeNow().Times(1) + top.timeService.EXPECT().GetTimeNow().Times(2) // add ethereum key rotations err := top.ProcessEthereumKeyRotation(ctx, "vega-key-1", newEthereumKeyRotationSubmission("eth-address-1", "new-eth-address-1", 11, submitter), MockVerify) @@ -306,7 +307,9 @@ func TestEthereumKeyRotationBeginBlockWithSubmitter(t *testing.T) { // when now := time.Unix(666, 666) top.signatures.EXPECT().SetNonce(now).Times(1) - top.timeService.EXPECT().GetTimeNow().Times(5).Return(now) + top.timeService.EXPECT().GetTimeNow().Times(6).Return(now) + top.multisigTop.EXPECT().ChainID().Times(1) + top.multisigTop2.EXPECT().ChainID().Times(1) top.BeginBlock(ctx, 11, "") // then @@ -324,7 +327,9 @@ func TestEthereumKeyRotationBeginBlockWithSubmitter(t *testing.T) { now = now.Add(time.Second) top.signatures.EXPECT().SetNonce(now).Times(1) - top.timeService.EXPECT().GetTimeNow().Times(5).Return(now) + top.timeService.EXPECT().GetTimeNow().Times(6).Return(now) + top.multisigTop.EXPECT().ChainID().Times(1) + top.multisigTop2.EXPECT().ChainID().Times(1) top.BeginBlock(ctx, 140, "") // try to submit again diff --git a/core/validators/topology_test.go b/core/validators/topology_test.go index 5d18e1ad89..236dcdaa8c 100644 --- a/core/validators/topology_test.go +++ b/core/validators/topology_test.go @@ -67,6 +67,10 @@ func (n *NodeWallets) GetEthereum() validators.Signer { type DummyMultiSigTopology struct{} +func (*DummyMultiSigTopology) ChainID() string { + return "12" +} + func (*DummyMultiSigTopology) IsSigner(address string) bool { return true } @@ -85,11 +89,12 @@ func (*DummyMultiSigTopology) GetSigners() []string { type testTop struct { *validators.Topology - ctrl *gomock.Controller - wallet *mocks.MockWallet - broker *bmocks.MockBroker - timeService *mocks.MockTimeService - multisigTop *mocks.MockMultiSigTopology + ctrl *gomock.Controller + wallet *mocks.MockWallet + broker *bmocks.MockBroker + timeService *mocks.MockTimeService + multisigTop *mocks.MockMultiSigTopology + multisigTop2 *mocks.MockMultiSigTopology } func getTestTopologyWithNodeWallet( @@ -100,18 +105,20 @@ func getTestTopologyWithNodeWallet( broker := bmocks.NewMockBroker(ctrl) timeService := mocks.NewMockTimeService(ctrl) broker.EXPECT().Send(gomock.Any()).AnyTimes() - multisigTop := mocks.NewMockMultiSigTopology(ctrl) + mtop1 := mocks.NewMockMultiSigTopology(ctrl) + mtop2 := mocks.NewMockMultiSigTopology(ctrl) commander := mocks.NewMockCommander(gomock.NewController(t)) - top := validators.NewTopology(logging.NewTestLogger(), validators.NewDefaultConfig(), nw, broker, true, commander, multisigTop, timeService) + top := validators.NewTopology(logging.NewTestLogger(), validators.NewDefaultConfig(), nw, broker, true, commander, mtop1, mtop2, timeService) return &testTop{ - Topology: top, - ctrl: ctrl, - wallet: wallet, - broker: broker, - timeService: timeService, - multisigTop: multisigTop, + Topology: top, + ctrl: ctrl, + wallet: wallet, + broker: broker, + timeService: timeService, + multisigTop: mtop1, + multisigTop2: mtop2, } } @@ -456,7 +463,7 @@ func testAddNewNodeSendsValidatorUpdateEventToBroker(t *testing.T) { broker := bmocks.NewMockBroker(ctrl) timeService := mocks.NewMockTimeService(ctrl) commander := mocks.NewMockCommander(gomock.NewController(t)) - top := validators.NewTopology(logging.NewTestLogger(), validators.NewDefaultConfig(), nw, broker, true, commander, &DummyMultiSigTopology{}, timeService) + top := validators.NewTopology(logging.NewTestLogger(), validators.NewDefaultConfig(), nw, broker, true, commander, &DummyMultiSigTopology{}, &DummyMultiSigTopology{}, timeService) ctx := context.Background() nr := commandspb.AnnounceNode{ diff --git a/core/validators/validator_score.go b/core/validators/validator_score.go index bf5eb8939a..3b8a07dd5d 100644 --- a/core/validators/validator_score.go +++ b/core/validators/validator_score.go @@ -187,7 +187,16 @@ func getValScore(inScores ...map[string]num.Decimal) map[string]num.Decimal { // if the val_score = raw_score x performance_score is in the top and the validator is on the multisig contract => 1 // else 0 // that means a validator in tendermint set only gets a reward if it is in the top and their registered with the multisig contract. -func getMultisigScore(log *logging.Logger, status ValidatorStatus, rawScores map[string]num.Decimal, perfScore map[string]num.Decimal, multiSigTopology MultiSigTopology, numberEthMultisigSigners int, nodeIDToEthAddress map[string]string) map[string]num.Decimal { +func getMultisigScore( + log *logging.Logger, + status ValidatorStatus, + rawScores map[string]num.Decimal, + perfScore map[string]num.Decimal, + primaryMultisig MultiSigTopology, + secondaryMultisig MultiSigTopology, + numberEthMultisigSigners int, + nodeIDToEthAddress map[string]string, +) map[string]num.Decimal { if status == ValidatorStatusErsatz { scores := make(map[string]num.Decimal, len(rawScores)) for k := range rawScores { @@ -206,7 +215,7 @@ func getMultisigScore(log *logging.Logger, status ValidatorStatus, rawScores map } sort.Strings(ethAddresses) - if multiSigTopology.ExcessSigners(ethAddresses) { + if primaryMultisig.ExcessSigners(ethAddresses) || secondaryMultisig.ExcessSigners(ethAddresses) { res := make(map[string]num.Decimal, len(rawScores)) for rs := range rawScores { res[rs] = num.DecimalZero() @@ -232,7 +241,7 @@ func getMultisigScore(log *logging.Logger, status ValidatorStatus, rawScores map if eth, ok := nodeIDToEthAddress[vs.ID]; !ok { log.Panic("missing eth address in mapping", logging.String("node-id", vs.ID)) } else { - if multiSigTopology.IsSigner(eth) { + if primaryMultisig.IsSigner(eth) && secondaryMultisig.IsSigner(eth) { res[vs.ID] = decimalOne } } @@ -294,7 +303,7 @@ func (t *Topology) calculateScores(delegationState []*types.ValidatorData, valid scores.PerformanceScores = t.getPerformanceScore(delegationForStatus) // calculate multisig score for the validators - scores.MultisigScores = getMultisigScore(t.log, validatorStatus, scores.RawValScores, scores.PerformanceScores, t.multiSigTopology, t.numberEthMultisigSigners, nodeIDToEthAddress) + scores.MultisigScores = getMultisigScore(t.log, validatorStatus, scores.RawValScores, scores.PerformanceScores, t.primaryMultisig, t.secondaryMultisig, t.numberEthMultisigSigners, nodeIDToEthAddress) // calculate the final score scores.ValScores = getValScore(scores.RawValScores, scores.PerformanceScores, scores.MultisigScores) diff --git a/core/validators/validator_score_test.go b/core/validators/validator_score_test.go index e83eae21cb..62c7fce0c9 100644 --- a/core/validators/validator_score_test.go +++ b/core/validators/validator_score_test.go @@ -29,12 +29,17 @@ import ( "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" + "golang.org/x/exp/maps" ) type TestMultisigTopology struct { validators map[string]struct{} } +func (t *TestMultisigTopology) ChainID() string { + return "12" +} + func (t *TestMultisigTopology) IsSigner(address string) bool { _, ok := t.validators[address] return ok @@ -475,15 +480,21 @@ func testGetMultisigScore(t *testing.T) { "node10": "node10eth", } - multisigTopology := &TestMultisigTopology{ + multisigValidators2 := map[string]struct{}{} + maps.Copy(multisigValidators2, multisigValidators) + + mtop1 := &TestMultisigTopology{ validators: multisigValidators, } + mtop2 := &TestMultisigTopology{ + validators: multisigValidators2, + } log := logging.NewTestLogger() multisigScore := getMultisigScore( log, ValidatorStatusTendermint, - stakeScore, perfScore, multisigTopology, 5, + stakeScore, perfScore, mtop1, mtop2, 5, nodeIDToEthAddress, ) @@ -503,10 +514,33 @@ func testGetMultisigScore(t *testing.T) { require.Equal(t, "1", multisigScore["node9"].String()) require.Equal(t, "1", multisigScore["node10"].String()) + // node 6 is added to one bridge but not the other + multisigValidators["node6"] = struct{}{} + multisigScore = getMultisigScore( + log, + ValidatorStatusTendermint, + stakeScore, perfScore, mtop1, mtop2, 5, + nodeIDToEthAddress, + ) + require.Equal(t, "0", multisigScore["node6"].String()) + + // node6 is added to the second bridge + multisigValidators2["node6"] = struct{}{} + multisigScore = getMultisigScore( + log, + ValidatorStatusTendermint, + stakeScore, perfScore, mtop1, mtop2, 5, + nodeIDToEthAddress, + ) + require.Equal(t, "0", multisigScore["node6"].String()) + + // Add a node to *one* bridge that shouldn't be there, even if its not on the other one + // all scores should be zero multisigValidators["node100"] = struct{}{} nodeIDToEthAddress["node100"] = "node100eth" - multisigScore = getMultisigScore(log, ValidatorStatusTendermint, stakeScore, perfScore, multisigTopology, 5, nodeIDToEthAddress) + // everyone gets zero scores because there is someone on there who shouldn't be + multisigScore = getMultisigScore(log, ValidatorStatusTendermint, stakeScore, perfScore, mtop1, mtop2, 5, nodeIDToEthAddress) require.Equal(t, "0", multisigScore["node1"].String()) require.Equal(t, "0", multisigScore["node2"].String()) require.Equal(t, "0", multisigScore["node3"].String()) @@ -547,7 +581,10 @@ func TestGetMultisigScoreMoreValidatorsThanSigners(t *testing.T) { "node5": "node5eth", } - multisigTopology := &TestMultisigTopology{ + mtop1 := &TestMultisigTopology{ + validators: map[string]struct{}{}, + } + mtop2 := &TestMultisigTopology{ validators: map[string]struct{}{}, } @@ -557,7 +594,7 @@ func TestGetMultisigScoreMoreValidatorsThanSigners(t *testing.T) { multisigScore := getMultisigScore( log, ValidatorStatusTendermint, - stakeScore, perfScore, multisigTopology, nEthMultisigSigners, + stakeScore, perfScore, mtop1, mtop2, nEthMultisigSigners, nodeIDToEthAddress, ) require.Equal(t, "0", multisigScore["node1"].String()) @@ -607,8 +644,8 @@ func testCalculateTMScores(t *testing.T) { topology.validatorPerformance = &MockPerformanceScore{} topology.numberEthMultisigSigners = 7 - multisigTopology := &TestMultisigTopology{} - multisigTopology.validators = map[string]struct{}{ + mtop1 := &TestMultisigTopology{} + mtop1.validators = map[string]struct{}{ "node1eth": {}, "node2eth": {}, "node3eth": {}, @@ -616,7 +653,17 @@ func testCalculateTMScores(t *testing.T) { "node7eth": {}, "node9eth": {}, } - topology.multiSigTopology = multisigTopology + mtop2 := &TestMultisigTopology{} + mtop2.validators = map[string]struct{}{ + "node1eth": {}, + "node2eth": {}, + "node3eth": {}, + "node5eth": {}, + "node7eth": {}, + "node9eth": {}, + } + topology.primaryMultisig = mtop1 + topology.secondaryMultisig = mtop2 delegation := []*types.ValidatorData{ {NodeID: "node1", PubKey: "node1PubKey", StakeByDelegators: num.NewUint(8000), SelfStake: num.NewUint(2000), Delegators: map[string]*num.Uint{}, TmPubKey: "key1"}, @@ -780,7 +827,7 @@ func testCalculateErsatzScores(t *testing.T) { topology.minimumStake = num.NewUint(3000) topology.validatorPerformance = &MockPerformanceScore{} topology.numberEthMultisigSigners = 7 - topology.multiSigTopology = &TestMultisigTopology{ + topology.primaryMultisig = &TestMultisigTopology{ validators: map[string]struct{}{ "node1eth": {}, "node2eth": {}, @@ -935,7 +982,17 @@ func testGetRewardsScores(t *testing.T) { topology.minimumStake = num.NewUint(3000) topology.validatorPerformance = &MockPerformanceScore{} topology.numberEthMultisigSigners = 7 - topology.multiSigTopology = &TestMultisigTopology{ + topology.primaryMultisig = &TestMultisigTopology{ + validators: map[string]struct{}{ + "node1eth": {}, + "node2eth": {}, + "node3eth": {}, + "node5eth": {}, + "node7eth": {}, + "node9eth": {}, + }, + } + topology.secondaryMultisig = &TestMultisigTopology{ validators: map[string]struct{}{ "node1eth": {}, "node2eth": {}, diff --git a/core/validators/validator_set.go b/core/validators/validator_set.go index 54b885c3cf..25694c6486 100644 --- a/core/validators/validator_set.go +++ b/core/validators/validator_set.go @@ -289,12 +289,14 @@ func (t *Topology) applyPromotion(performanceScore, rankingScore map[string]num. sortValidatorDescRankingScoreAscBlockcompare(remainingValidators, rankingScore, byBlockAdded, t.rng) signers := map[string]struct{}{} - for _, sig := range t.multiSigTopology.GetSigners() { + for _, sig := range t.primaryMultisig.GetSigners() { signers[sig] = struct{}{} } + threshold := num.MaxV(t.primaryMultisig.GetThreshold(), t.secondaryMultisig.GetThreshold()) + // if there are not enough slots, demote from tm to remaining - tendermintValidators, remainingValidators, removedFromTM := handleSlotChanges(tendermintValidators, remainingValidators, ValidatorStatusTendermint, ValidatorStatusErsatz, t.numberOfTendermintValidators, int64(t.currentBlockHeight+1), rankingScore, signers, t.multiSigTopology.GetThreshold()) + tendermintValidators, remainingValidators, removedFromTM := handleSlotChanges(tendermintValidators, remainingValidators, ValidatorStatusTendermint, ValidatorStatusErsatz, t.numberOfTendermintValidators, int64(t.currentBlockHeight+1), rankingScore, signers, threshold) t.log.Info("removedFromTM", logging.Strings("IDs", removedFromTM)) // now we're sorting the remaining validators - some of which may be eratz, some may have been tendermint (as demoted above) and some just in the waiting list diff --git a/core/validators/validator_set_test.go b/core/validators/validator_set_test.go index a2c9160683..efc232d9eb 100644 --- a/core/validators/validator_set_test.go +++ b/core/validators/validator_set_test.go @@ -569,7 +569,7 @@ func testUpdateMinimumRequireSelfStake(t *testing.T) { } func testAddForwarder(t *testing.T) { - topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &dummyTestTime{}) + topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &DummyMultiSigTopology{}, &dummyTestTime{}) // add unknown forwarder topology.AddForwarder("node1") require.Equal(t, 0, len(topology.validators)) @@ -606,7 +606,7 @@ func testAddForwarder(t *testing.T) { } func testTendermintValidatorsNumberReduced(t *testing.T) { - topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &dummyTestTime{}) + topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &DummyMultiSigTopology{}, &dummyTestTime{}) topology.numberOfTendermintValidators = 5 topology.rng = rand.New(rand.NewSource(100000)) topology.validators["node1"] = &valState{ @@ -704,7 +704,7 @@ func testTendermintValidatorsNumberReduced(t *testing.T) { } func testTendermintFreeSlotsPromotion(t *testing.T) { - topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &dummyTestTime{}) + topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &DummyMultiSigTopology{}, &dummyTestTime{}) topology.numberOfTendermintValidators = 5 topology.numberOfErsatzValidators = 1 topology.validators["node1"] = &valState{ @@ -815,7 +815,7 @@ func testTendermintFreeSlotsPromotion(t *testing.T) { } func testSwapBestErsatzWithWorstTendermint(t *testing.T) { - topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &dummyTestTime{}) + topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &DummyMultiSigTopology{}, &dummyTestTime{}) topology.numberOfTendermintValidators = 4 topology.numberOfErsatzValidators = 1 topology.validators["node1"] = &valState{ @@ -921,7 +921,7 @@ func testSwapBestErsatzWithWorstTendermint(t *testing.T) { } func testErsatzFreeSlotsPromotion(t *testing.T) { - topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &dummyTestTime{}) + topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &DummyMultiSigTopology{}, &dummyTestTime{}) topology.numberOfTendermintValidators = 1 topology.numberOfErsatzValidators = 4 @@ -1026,7 +1026,7 @@ func testErsatzFreeSlotsPromotion(t *testing.T) { } func testSwapBestPendingWithWorstErsatz(t *testing.T) { - topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &dummyTestTime{}) + topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &DummyMultiSigTopology{}, &dummyTestTime{}) topology.numberOfTendermintValidators = 1 topology.numberOfErsatzValidators = 2 @@ -1131,7 +1131,7 @@ func testSwapBestPendingWithWorstErsatz(t *testing.T) { } func testErsatzValidatorsNumberReduced(t *testing.T) { - topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &dummyTestTime{}) + topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &DummyMultiSigTopology{}, &dummyTestTime{}) topology.numberOfTendermintValidators = 1 topology.validators["node1"] = &valState{ data: ValidatorData{ @@ -1224,7 +1224,7 @@ func testErsatzValidatorsNumberReduced(t *testing.T) { } func testSwapAndErsatzSlotDecrease(t *testing.T) { - topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &dummyTestTime{}) + topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &DummyMultiSigTopology{}, &dummyTestTime{}) topology.numberOfTendermintValidators = 4 topology.numberOfErsatzValidators = 2 topology.validators["node1"] = &valState{ @@ -1328,7 +1328,7 @@ func testSwapAndErsatzSlotDecrease(t *testing.T) { } func testSwapAndTendermintSlotIncrease(t *testing.T) { - topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &dummyTestTime{}) + topology := NewTopology(logging.NewLoggerFromConfig(logging.Config{}), NewDefaultConfig(), nil, nil, true, nil, &DummyMultiSigTopology{}, &DummyMultiSigTopology{}, &dummyTestTime{}) topology.numberOfTendermintValidators = 4 topology.numberOfErsatzValidators = 2 topology.validators["node1"] = &valState{ @@ -1433,6 +1433,10 @@ func testSwapAndTendermintSlotIncrease(t *testing.T) { type DummyMultiSigTopology struct{} +func (*DummyMultiSigTopology) ChainID() string { + return "12" +} + func (*DummyMultiSigTopology) IsSigner(address string) bool { return true } diff --git a/core/validators/witness.go b/core/validators/witness.go index bbdc62d4d5..d73465436b 100644 --- a/core/validators/witness.go +++ b/core/validators/witness.go @@ -18,6 +18,7 @@ package validators import ( "context" "errors" + "fmt" "math/rand" "sort" "strconv" @@ -66,6 +67,7 @@ type Resource interface { GetID() string GetType() commandspb.NodeVote_Type Check(ctx context.Context) error + GetChainID() string } const ( @@ -154,7 +156,9 @@ type Witness struct { validatorVotesRequired num.Decimal wss *witnessSnapshotState - defaultConfirmations int64 + + defaultConfirmations map[string]int64 + approxBlockTime map[string]time.Duration } func NewWitness(ctx context.Context, log *logging.Logger, cfg Config, top ValidatorTopology, cmd Commander, tsvc TimeService) (w *Witness) { @@ -171,14 +175,22 @@ func NewWitness(ctx context.Context, log *logging.Logger, cfg Config, top Valida resources: map[string]*res{}, needResendRes: map[string]struct{}{}, validatorVotesRequired: defaultValidatorsVoteRequired, + defaultConfirmations: map[string]int64{}, + approxBlockTime: map[string]time.Duration{}, wss: &witnessSnapshotState{ serialised: []byte{}, }, } } -func (w *Witness) SetDefaultConfirmations(c uint64) { - w.defaultConfirmations = int64(c) +func (w *Witness) SetPrimaryDefaultConfirmations(chainID string, c uint64) { + w.defaultConfirmations[chainID] = int64(c) + w.approxBlockTime[chainID] = w.cfg.ApproxEthereumBlockTime.Duration +} + +func (w *Witness) SetSecondaryDefaultConfirmations(chainID string, c uint64, bt time.Duration) { + w.defaultConfirmations[chainID] = int64(c) + w.approxBlockTime[chainID] = bt } func (w *Witness) OnDefaultValidatorsVoteRequiredUpdate(ctx context.Context, d num.Decimal) error { @@ -234,7 +246,7 @@ func (w *Witness) StartCheck( cb func(interface{}, bool), checkUntil time.Time, ) error { - return w.startCheck(r, cb, checkUntil, w.defaultConfirmations) + return w.startCheck(r, cb, checkUntil, w.defaultConfirmations[r.GetChainID()]) } func (w *Witness) StartCheckWithDelay( @@ -312,27 +324,23 @@ func newBackoff(ctx context.Context, maxElapsedTime time.Duration) backoff.BackO func (w *Witness) start(ctx context.Context, r *res, initialDelay *int64) { if initialDelay != nil { - t := time.NewTimer(time.Duration(*initialDelay) * w.cfg.ApproxEthereumBlockTime.Duration) + t := time.NewTimer(time.Duration(*initialDelay) * w.approxBlockTime[r.res.GetChainID()]) <-t.C t.Stop() } backff := newBackoff(ctx, r.checkUntil.Sub(w.now)) f := func() error { - w.log.Debug("Checking the resource", - logging.String("asset-source", r.res.GetID()), - ) - err := r.res.Check(ctx) - if err != nil { - w.log.Debug("error checking resource", logging.Error(err)) - // dump error + w.log.Debug("Checking the resource", logging.String("asset-source", r.res.GetID())) + + if err := r.res.Check(ctx); err != nil { + w.log.Error("Checking the resource failed", logging.Error(err)) return err } return nil } - err := backoff.Retry(f, backff) - if err != nil { + if err := backoff.Retry(f, backff); err != nil { return } @@ -409,7 +417,7 @@ func (w *Witness) OnTick(ctx context.Context, t time.Time) { if v.selfVoteReceived(w.top.SelfVegaPubKey()) { continue } - w.onCommandSent(v.res.GetID())("", errors.New("no self votes received after 10 seconds")) + w.onCommandSent(v.res.GetID())("", fmt.Errorf("no self votes received after %s", w.cfg.NodeVoteResendInterval.Duration.String())) } } } diff --git a/core/validators/witness_test.go b/core/validators/witness_test.go index e9a3c38a38..8cf7c2aa5a 100644 --- a/core/validators/witness_test.go +++ b/core/validators/witness_test.go @@ -405,7 +405,8 @@ type testRes struct { check func() error } -func (t testRes) GetID() string { return t.id } +func (t testRes) GetChainID() string { return "" } +func (t testRes) GetID() string { return t.id } func (t testRes) GetType() commandspb.NodeVote_Type { return commandspb.NodeVote_TYPE_FUNDS_DEPOSITED } diff --git a/core/vesting/vesting.go b/core/vesting/vesting.go index 7b61cc5040..333c92e951 100644 --- a/core/vesting/vesting.go +++ b/core/vesting/vesting.go @@ -400,7 +400,10 @@ func (e *Engine) broadcastSummary(ctx context.Context, seq uint64) { } sort.Slice(pSummary.PartyLockedBalances, func(i, j int) bool { - return pSummary.PartyLockedBalances[i].Asset < pSummary.PartyLockedBalances[j].Asset && pSummary.PartyLockedBalances[i].UntilEpoch < pSummary.PartyLockedBalances[j].UntilEpoch + if pSummary.PartyLockedBalances[i].Asset == pSummary.PartyLockedBalances[j].Asset { + return pSummary.PartyLockedBalances[i].UntilEpoch < pSummary.PartyLockedBalances[j].UntilEpoch + } + return pSummary.PartyLockedBalances[i].Asset < pSummary.PartyLockedBalances[j].Asset }) evt.PartiesVestingSummary = append(evt.PartiesVestingSummary, pSummary) diff --git a/datanode/api/config.go b/datanode/api/config.go index f7fba9a584..bfe7c1241e 100644 --- a/datanode/api/config.go +++ b/datanode/api/config.go @@ -41,6 +41,7 @@ type Config struct { CoreNodeGRPCPort int `long:"core-node-grpc-port"` RateLimit ratelimit.Config `group:"rate-limits"` MaxSubscriptionPerClient uint32 `long:"max-subscription-per-client"` + MaxMsgSize int `long:"max-msg-size"` } // NewDefaultConfig creates an instance of the package specific configuration, given a @@ -60,5 +61,6 @@ func NewDefaultConfig() Config { CoreNodeGRPCPort: 3002, RateLimit: ratelimit.NewDefaultConfig(), MaxSubscriptionPerClient: 250, + MaxMsgSize: 20 * 1024 * 1024, } } diff --git a/datanode/api/errors.go b/datanode/api/errors.go index 80485ad851..71d4dac18e 100644 --- a/datanode/api/errors.go +++ b/datanode/api/errors.go @@ -340,7 +340,7 @@ var ( // ErrGetTimeWeightedNotionalPosition is returned when the time weighted notional position cannot be retrieved. ErrGetTimeWeightedNotionalPosition = errors.New("failed to get time weighted notional position") - ErrDateRangeValidationFailed = errors.New("invalid date range") + ErrDateRangeValidationFailed = newInvalidArgumentError("invalid date range") ) // errorMap contains a mapping between errors and Vega numeric error codes. diff --git a/datanode/api/trading_data_v2.go b/datanode/api/trading_data_v2.go index ef5203c0ed..ef8e86e64a 100644 --- a/datanode/api/trading_data_v2.go +++ b/datanode/api/trading_data_v2.go @@ -897,7 +897,7 @@ func (t *TradingDataServiceV2) ListERC20MultiSigSignerAddedBundles(ctx context.C return nil, formatE(ErrInvalidPagination, err) } - res, pageInfo, err := t.multiSigService.GetAddedEvents(ctx, req.GetNodeId(), req.GetSubmitter(), epochID, pagination) + res, pageInfo, err := t.multiSigService.GetAddedEvents(ctx, req.GetNodeId(), req.GetSubmitter(), epochID, req.ChainId, pagination) if err != nil { return nil, formatE(ErrMultiSigServiceGetAdded, err) } @@ -920,6 +920,7 @@ func (t *TradingDataServiceV2) ListERC20MultiSigSignerAddedBundles(ctx context.C Timestamp: b.VegaTime.UnixNano(), Signatures: entities.PackNodeSignatures(signatures), EpochSeq: strconv.FormatInt(b.EpochID, 10), + ChainId: b.ChainID, }, Cursor: b.Cursor().Encode(), } @@ -953,7 +954,7 @@ func (t *TradingDataServiceV2) ListERC20MultiSigSignerRemovedBundles(ctx context return nil, formatE(ErrInvalidPagination, err) } - res, pageInfo, err := t.multiSigService.GetRemovedEvents(ctx, req.GetNodeId(), req.GetSubmitter(), epochID, pagination) + res, pageInfo, err := t.multiSigService.GetRemovedEvents(ctx, req.GetNodeId(), req.GetSubmitter(), epochID, req.ChainId, pagination) if err != nil { return nil, formatE(ErrMultiSigServiceGetRemoved, err) } @@ -976,6 +977,7 @@ func (t *TradingDataServiceV2) ListERC20MultiSigSignerRemovedBundles(ctx context Timestamp: b.VegaTime.UnixNano(), Signatures: entities.PackNodeSignatures(signatures), EpochSeq: strconv.FormatInt(b.EpochID, 10), + ChainId: b.ChainID, }, Cursor: b.Cursor().Encode(), } @@ -1114,10 +1116,11 @@ func (t *TradingDataServiceV2) GetERC20WithdrawalApproval(ctx context.Context, r return nil, formatE(ErrAssetServiceGetAll, err) } - var address string + var address, chainID string for _, v := range assets { if v.ID == w.Asset { address = v.ERC20Contract + chainID = v.ChainID break } } @@ -1132,7 +1135,8 @@ func (t *TradingDataServiceV2) GetERC20WithdrawalApproval(ctx context.Context, r TargetAddress: w.Ext.GetErc20().ReceiverAddress, Signatures: entities.PackNodeSignatures(signatures), // timestamps is unix nano, contract needs unix. So load if first, and cut nanos - Creation: w.CreatedTimestamp.Unix(), + Creation: w.CreatedTimestamp.Unix(), + SourceChainId: chainID, }, nil } @@ -3417,7 +3421,11 @@ func (t *TradingDataServiceV2) EstimatePosition(ctx context.Context, req *v2.Est var wMarginDelta, bMarginDelta, posMarginDelta num.Decimal combinedMargin := marginAccountBalance.Add(orderAccountBalance) if isolatedMarginMode { - requiredPositionMargin, requiredOrderMargin := risk.CalculateRequiredMarginInIsolatedMode(req.OpenVolume, avgEntryPrice, marketObservable, buyOrders, sellOrders, positionFactor, dMarginFactor) + var ap *num.Uint = nil + if !auctionPrice.IsZero() { + ap, _ = num.UintFromDecimal(auctionPrice) + } + requiredPositionMargin, requiredOrderMargin := risk.CalculateRequiredMarginInIsolatedMode(req.OpenVolume, avgEntryPrice, marketObservable, buyOrders, sellOrders, positionFactor, dMarginFactor, ap) posMarginDelta = requiredPositionMargin.Sub(marginAccountBalance) wMarginDelta = requiredPositionMargin.Add(requiredOrderMargin).Sub(combinedMargin) bMarginDelta = wMarginDelta @@ -3524,8 +3532,8 @@ func (t *TradingDataServiceV2) computeMarginRange( 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) - best := risk.CalculateMaintenanceMarginWithSlippageFactors(openVolume, bOrders, sOrders, marketObservable, positionFactor, num.DecimalZero(), num.DecimalZero(), riskFactors.Long, riskFactors.Short, fundingPaymentPerUnitPosition, auction) + 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 } diff --git a/datanode/api/trading_data_v2_test.go b/datanode/api/trading_data_v2_test.go index f3f70a8c06..50c5f20b17 100644 --- a/datanode/api/trading_data_v2_test.go +++ b/datanode/api/trading_data_v2_test.go @@ -23,6 +23,7 @@ import ( "fmt" "io" "math" + "sort" "strconv" "strings" "testing" @@ -133,7 +134,6 @@ func TestEstimatePosition(t *testing.T) { rfLong := num.DecimalFromFloat(0.1) rfShort := num.DecimalFromFloat(0.2) - markPrice := 123.456 * math.Pow10(marketDecimals) auctionEnd := int64(0) fundingPayment := 1234.56789 @@ -197,7 +197,7 @@ func TestEstimatePosition(t *testing.T) { expectedLiquidationBestVolumeOnly string }{ { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: 0, avgEntryPrice: 0, orders: []*v2.OrderInfo{ @@ -214,7 +214,7 @@ func TestEstimatePosition(t *testing.T) { marginMode: vega.MarginMode_MARGIN_MODE_CROSS_MARGIN, }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: 0, avgEntryPrice: 0, orders: []*v2.OrderInfo{ @@ -232,7 +232,7 @@ func TestEstimatePosition(t *testing.T) { marginFactor: 0.1, }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: int64(10 * math.Pow10(positionDecimalPlaces)), avgEntryPrice: 111.1 * math.Pow10(marketDecimals), orders: []*v2.OrderInfo{ @@ -249,7 +249,7 @@ func TestEstimatePosition(t *testing.T) { marginMode: vega.MarginMode_MARGIN_MODE_CROSS_MARGIN, }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: int64(-10 * math.Pow10(positionDecimalPlaces)), avgEntryPrice: 111.1 * math.Pow10(marketDecimals), orders: []*v2.OrderInfo{ @@ -267,7 +267,7 @@ func TestEstimatePosition(t *testing.T) { marginFactor: 0.5, }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: int64(-10 * math.Pow10(positionDecimalPlaces)), avgEntryPrice: 111.1 * math.Pow10(marketDecimals), orders: []*v2.OrderInfo{ @@ -290,7 +290,7 @@ func TestEstimatePosition(t *testing.T) { marginMode: vega.MarginMode_MARGIN_MODE_CROSS_MARGIN, }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: int64(-10 * math.Pow10(positionDecimalPlaces)), avgEntryPrice: 111.1 * math.Pow10(marketDecimals), orders: []*v2.OrderInfo{ @@ -314,7 +314,7 @@ func TestEstimatePosition(t *testing.T) { marginFactor: 0.3, }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: int64(10 * math.Pow10(positionDecimalPlaces)), avgEntryPrice: 111.1 * math.Pow10(marketDecimals), orders: []*v2.OrderInfo{ @@ -361,7 +361,7 @@ func TestEstimatePosition(t *testing.T) { marginMode: vega.MarginMode_MARGIN_MODE_CROSS_MARGIN, }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: -int64(10 * math.Pow10(positionDecimalPlaces)), avgEntryPrice: 111.1 * math.Pow10(marketDecimals), orders: []*v2.OrderInfo{ @@ -409,13 +409,13 @@ func TestEstimatePosition(t *testing.T) { marginFactor: 0.1, }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: 0, avgEntryPrice: 0, orders: []*v2.OrderInfo{ { Side: entities.SideBuy, - Price: fmt.Sprintf("%f", markPrice), + Price: floatToStringWithDp(123.456, marketDecimals), Remaining: uint64(1 * math.Pow10(positionDecimalPlaces)), IsMarketOrder: false, }, @@ -428,7 +428,7 @@ func TestEstimatePosition(t *testing.T) { expectedCollIncBest: "3703680000", }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: 0, avgEntryPrice: 0, orders: []*v2.OrderInfo{ @@ -447,9 +447,9 @@ func TestEstimatePosition(t *testing.T) { expectedCollIncBest: "3703680000", }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: int64(1 * math.Pow10(positionDecimalPlaces)), - avgEntryPrice: markPrice, + avgEntryPrice: 123.456 * math.Pow10(marketDecimals), orders: []*v2.OrderInfo{}, marginAccountBalance: 0, generalAccountBalance: 0, @@ -459,13 +459,13 @@ func TestEstimatePosition(t *testing.T) { expectedCollIncBest: "3703680000", }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: 0, avgEntryPrice: 0, orders: []*v2.OrderInfo{ { Side: entities.SideSell, - Price: fmt.Sprintf("%f", markPrice), + Price: floatToStringWithDp(123.456, marketDecimals), Remaining: uint64(1 * math.Pow10(positionDecimalPlaces)), IsMarketOrder: false, }, @@ -478,7 +478,7 @@ func TestEstimatePosition(t *testing.T) { expectedCollIncBest: "3703680000", }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: 0, avgEntryPrice: 0, orders: []*v2.OrderInfo{ @@ -497,9 +497,9 @@ func TestEstimatePosition(t *testing.T) { expectedCollIncBest: "3703680000", }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: -int64(1 * math.Pow10(positionDecimalPlaces)), - avgEntryPrice: markPrice, + avgEntryPrice: 123.456 * math.Pow10(marketDecimals), orders: []*v2.OrderInfo{}, marginAccountBalance: 0, generalAccountBalance: 0, @@ -509,9 +509,9 @@ func TestEstimatePosition(t *testing.T) { expectedCollIncBest: "3703680000", }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: -int64(1 * math.Pow10(positionDecimalPlaces)), - avgEntryPrice: markPrice, + avgEntryPrice: 123.456 * math.Pow10(marketDecimals), orders: []*v2.OrderInfo{ { Side: entities.SideBuy, @@ -528,9 +528,9 @@ func TestEstimatePosition(t *testing.T) { expectedCollIncBest: "0", }, { - markPrice: markPrice, + markPrice: 123.456 * math.Pow10(marketDecimals), openVolume: int64(1 * math.Pow10(positionDecimalPlaces)), - avgEntryPrice: markPrice, + avgEntryPrice: 123.456 * math.Pow10(marketDecimals), orders: []*v2.OrderInfo{ { Side: entities.SideSell, @@ -558,6 +558,50 @@ func TestEstimatePosition(t *testing.T) { marginFactor: 0.01277, expectedLiquidationBestVolumeOnly: "6781300000", }, + { + markPrice: 3225 * math.Pow10(marketDecimals), + openVolume: 0, + avgEntryPrice: 0, + orders: []*v2.OrderInfo{ + { + Side: entities.SideSell, + Price: floatToStringWithDp(5000, marketDecimals), + Remaining: uint64(1 * math.Pow10(positionDecimalPlaces)), + IsMarketOrder: false, + }, + }, + marginAccountBalance: 0, + generalAccountBalance: 0, + orderMarginAccountBalance: 0, + marginMode: vega.MarginMode_MARGIN_MODE_ISOLATED_MARGIN, + marginFactor: 0.1, + expectedCollIncBest: "50000000000", + }, + { + markPrice: 3225 * math.Pow10(marketDecimals), + openVolume: 0, + avgEntryPrice: 0, + orders: []*v2.OrderInfo{ + { + Side: entities.SideSell, + Price: floatToStringWithDp(5000, marketDecimals), + Remaining: uint64(1 * math.Pow10(positionDecimalPlaces)), + IsMarketOrder: false, + }, + { + Side: entities.SideBuy, + Price: floatToStringWithDp(2500, marketDecimals), + Remaining: uint64(2 * math.Pow10(positionDecimalPlaces)), + IsMarketOrder: false, + }, + }, + marginAccountBalance: 0, + generalAccountBalance: 0, + orderMarginAccountBalance: 50000000000, + marginMode: vega.MarginMode_MARGIN_MODE_ISOLATED_MARGIN, + marginFactor: 0.1, + expectedCollIncBest: "0", + }, } for i, tc := range testCases { mktData := entities.MarketData{ @@ -673,11 +717,11 @@ func TestEstimatePosition(t *testing.T) { if isolatedMargin { priceFactor := math.Pow10(assetDecimals - marketDecimals) marketOrderNotional := getMarketOrderNotional(tc.markPrice, tc.orders, priceFactor, positionDecimalPlaces) - adjNotional := (tc.avgEntryPrice*priceFactor*float64(tc.openVolume)/math.Pow10(positionDecimalPlaces) + marketOrderNotional) + adjNotional := tc.avgEntryPrice*priceFactor*float64(tc.openVolume)/math.Pow10(positionDecimalPlaces) + marketOrderNotional requiredPositionMargin := math.Abs(adjNotional) * tc.marginFactor - requiredOrderMargin := getLimitOrderNotional(t, tc.orders, priceFactor, positionDecimalPlaces) * tc.marginFactor - expectedCollIncBest = requiredPositionMargin + requiredOrderMargin - tc.marginAccountBalance - tc.orderMarginAccountBalance + requiredBuyOrderMargin, requireSellOrderMargin := getLimitOrderNotionalScaledByMarginFactorAndNetOfPosition(t, tc.openVolume, tc.orders, priceFactor, positionDecimalPlaces, tc.marginFactor) + expectedCollIncBest = requiredPositionMargin + max(requiredBuyOrderMargin, requireSellOrderMargin) - tc.marginAccountBalance - tc.orderMarginAccountBalance expectedCollIncWorst = expectedCollIncBest expectedPosMarginIncrease = max(0, requiredPositionMargin-tc.marginAccountBalance) @@ -804,18 +848,84 @@ func (s *mockStream) Context() context.Context { return context.Backgroun func (s *mockStream) SendMsg(m interface{}) error { return nil } func (s *mockStream) RecvMsg(m interface{}) error { return nil } -func getLimitOrderNotional(t *testing.T, orders []*v2.OrderInfo, priceFactor float64, positionDecimals int) float64 { +func getLimitOrderNotionalScaledByMarginFactorAndNetOfPosition(t *testing.T, positionSize int64, orders []*v2.OrderInfo, priceFactor float64, positionDecimals int, marginFactor float64) (float64, float64) { t.Helper() - notional := 0.0 + buyNotional, sellNotional := 0.0, 0.0 + buyOrders, sellOrders := make([]*v2.OrderInfo, 0), make([]*v2.OrderInfo, 0) for _, o := range orders { - if o.IsMarketOrder { - continue + if o.Side == entities.SideBuy { + if o.IsMarketOrder { + positionSize += int64(o.Remaining) + continue + } + buyOrders = append(buyOrders, o) } - price, err := strconv.ParseFloat(o.Price, 64) + if o.Side == entities.SideSell { + if o.IsMarketOrder { + positionSize -= int64(o.Remaining) + continue + } + sellOrders = append(sellOrders, o) + } + } + + // sort orders from best to worst + sort.Slice(buyOrders, func(i, j int) bool { + price_i, err := strconv.ParseFloat(buyOrders[i].Price, 64) + require.NoError(t, err) + price_j, err := strconv.ParseFloat(buyOrders[j].Price, 64) + require.NoError(t, err) + + return price_i > price_j + }) + sort.Slice(sellOrders, func(i, j int) bool { + price_i, err := strconv.ParseFloat(sellOrders[i].Price, 64) require.NoError(t, err) - notional += price * priceFactor * float64(o.Remaining) / math.Pow10(positionDecimals) + price_j, err := strconv.ParseFloat(sellOrders[j].Price, 64) + require.NoError(t, err) + + return price_i < price_j + }) + + remainingCovered := uint64(math.Abs(float64(positionSize))) + for _, o := range buyOrders { + size := o.Remaining + if remainingCovered != 0 && (positionSize < 0) { + if size >= remainingCovered { // part of the order doesn't require margin + size = size - remainingCovered + remainingCovered = 0 + } else { // the entire order doesn't require margin + remainingCovered -= size + size = 0 + } + } + if size > 0 { + price, err := strconv.ParseFloat(o.Price, 64) + require.NoError(t, err) + buyNotional += price * priceFactor * float64(size) / math.Pow10(positionDecimals) + } } - return notional + + remainingCovered = uint64(math.Abs(float64(positionSize))) + for _, o := range sellOrders { + size := o.Remaining + if remainingCovered != 0 && (positionSize > 0) { + if size >= remainingCovered { // part of the order doesn't require margin + size = size - remainingCovered + remainingCovered = 0 + } else { // the entire order doesn't require margin + remainingCovered -= size + size = 0 + } + } + if size > 0 { + price, err := strconv.ParseFloat(o.Price, 64) + require.NoError(t, err) + sellNotional += price * priceFactor * float64(size) / math.Pow10(positionDecimals) + } + } + + return buyNotional * marginFactor, sellNotional * marginFactor } func getMarketOrderNotional(marketObservable float64, orders []*v2.OrderInfo, priceFactor float64, positionDecimals int) float64 { diff --git a/datanode/broker/convert.go b/datanode/broker/convert.go index df71993837..3b21289d6f 100644 --- a/datanode/broker/convert.go +++ b/datanode/broker/convert.go @@ -194,6 +194,8 @@ func toEvent(ctx context.Context, be *eventspb.BusEvent) events.Event { return events.TeamsStatsUpdatedEventFromStream(ctx, be) case eventspb.BusEventType_BUS_EVENT_TYPE_TIME_WEIGHTED_NOTIONAL_POSITION_UPDATED: return events.TimeWeightedNotionalPositionUpdatedEventFromStream(ctx, be) + case eventspb.BusEventType_BUS_EVENT_TYPE_CANCELLED_ORDERS: + return events.CancelledOrdersEventFromStream(ctx, be) } return nil diff --git a/datanode/entities/asset.go b/datanode/entities/asset.go index b7ed0e6d81..34b8b20923 100644 --- a/datanode/entities/asset.go +++ b/datanode/entities/asset.go @@ -32,6 +32,7 @@ type AssetID = ID[_Asset] type Asset struct { ID AssetID + ChainID string `db:"chain_id"` Name string Symbol string Decimals int @@ -68,6 +69,7 @@ func (a Asset) ToProto() *pb.Asset { ContractAddress: a.ERC20Contract, LifetimeLimit: a.LifetimeLimit.String(), WithdrawThreshold: a.WithdrawThreshold.String(), + ChainId: a.ChainID, }, } } diff --git a/datanode/entities/date_range.go b/datanode/entities/date_range.go index 5bc98f0e1e..b6b15251d6 100644 --- a/datanode/entities/date_range.go +++ b/datanode/entities/date_range.go @@ -29,12 +29,12 @@ type DateRange struct { } var ( - ErrInvalidDateRange = errors.New("invalid date range, date range is required") - ErrMinimumDate = errors.New("date range start must be after 2020-01-01") - ErrEndDateBeforeStart = errors.New("date range start must be before end") - ErrDateRangeTooLong = errors.New("date range is too long") - minimumDate = time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC) - maximumDuration = time.Hour * 24 * 365 // 1 year maximum duration + ErrDateRangeIsRequired = errors.New("date range is required") + ErrMinimumDate = errors.New("date range start must be after 2020-01-01") + ErrEndDateBeforeStart = errors.New("date range start must be before end") + ErrDateRangeTooLong = errors.New("date range is too long") + minimumDate = time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC) + maximumDuration = time.Hour * 24 * 365 // 1 year maximum duration ) func DateRangeFromProto(dateRangeInput *v2.DateRange) (dateRange DateRange) { @@ -59,7 +59,7 @@ func (dr DateRange) Validate(required bool) error { } if required && dr.Start == nil && dr.End == nil { - return ErrInvalidDateRange + return ErrDateRangeIsRequired } if dr.Start != nil && dr.Start.Before(minimumDate) { diff --git a/datanode/entities/date_range_test.go b/datanode/entities/date_range_test.go index dea113ef2a..2ec6633b74 100644 --- a/datanode/entities/date_range_test.go +++ b/datanode/entities/date_range_test.go @@ -41,7 +41,7 @@ func TestDateRange_Validate(t *testing.T) { End: nil, Required: true, }, - Err: entities.ErrInvalidDateRange, + Err: entities.ErrDateRangeIsRequired, }, { name: "Should not error if not required and no dates provided", diff --git a/datanode/entities/enums.go b/datanode/entities/enums.go index 74d65ac9f6..eb3474a46f 100644 --- a/datanode/entities/enums.go +++ b/datanode/entities/enums.go @@ -38,6 +38,7 @@ const ( DispatchMetricRelativeReturn = DispatchMetric(vega.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN) DispatchMetricReturnVolatility = DispatchMetric(vega.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY) DispatchMetricValidatorRanking = DispatchMetric(vega.DispatchMetric_DISPATCH_METRIC_VALIDATOR_RANKING) + DispatchMetricRealisedReturn = DispatchMetric(vega.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN) ) func (m DispatchMetric) EncodeText(_ *pgtype.ConnInfo, buf []byte) ([]byte, error) { @@ -580,6 +581,7 @@ const ( ProposalErrorInvalidSLAParams = ProposalError(vega.ProposalError_PROPOSAL_ERROR_INVALID_SLA_PARAMS) ProposalErrorMissingSLAParams = ProposalError(vega.ProposalError_PROPOSAL_ERROR_MISSING_SLA_PARAMS) ProposalInvalidPerpetualProduct = ProposalError(vega.ProposalError_PROPOSAL_ERROR_INVALID_PERPETUAL_PRODUCT) + ProposalErrorInvalidSizeDecimalPlaces = ProposalError(vega.ProposalError_PROPOSAL_ERROR_INVALID_SIZE_DECIMAL_PLACES) ) func (s ProposalError) EncodeText(_ *pgtype.ConnInfo, buf []byte) ([]byte, error) { @@ -966,6 +968,8 @@ const ( StopOrderRejectionReasonNotClosingThePosition = StopOrderRejectionReason(vega.StopOrder_REJECTION_REASON_STOP_ORDER_NOT_CLOSING_THE_POSITION) StopOrderRejectionReasonNotAllowedDuringAuction = StopOrderRejectionReason(vega.StopOrder_REJECTION_REASON_STOP_ORDER_NOT_ALLOWED_DURING_OPENING_AUCTION) StopOrderRejectionReasonOCONotAllowedSameExpiryTime = StopOrderRejectionReason(vega.StopOrder_REJECTION_REASON_STOP_ORDER_CANNOT_MATCH_OCO_EXPIRY_TIMES) + StopOrderRejectionSizeOverrideUnSupportedForSpot = StopOrderRejectionReason(vega.StopOrder_REJECTION_REASON_STOP_ORDER_SIZE_OVERRIDE_UNSUPPORTED_FOR_SPOT) + StopOrderRejectionLinkedPercentageInvalid = StopOrderRejectionReason(vega.StopOrder_REJECTION_REASON_STOP_ORDER_LINKED_PERCENTAGE_INVALID) ) func (s StopOrderRejectionReason) EncodeText(_ *pgtype.ConnInfo, buf []byte) ([]byte, error) { @@ -1060,3 +1064,7 @@ func (m *MarginMode) DecodeText(_ *pgtype.ConnInfo, src []byte) error { *m = MarginMode(val) return nil } + +type ProtoEnum interface { + GetEnums() map[int32]string +} diff --git a/datanode/entities/erc20_multisig_event.go b/datanode/entities/erc20_multisig_event.go index 33ebffa1aa..bdc6bef00f 100644 --- a/datanode/entities/erc20_multisig_event.go +++ b/datanode/entities/erc20_multisig_event.go @@ -51,6 +51,7 @@ type ERC20MultiSigSignerEvent struct { VegaTime time.Time EpochID int64 Event ERC20MultiSigSignerEventType + ChainID string } func (e ERC20MultiSigSignerEvent) Cursor() *Cursor { @@ -77,6 +78,7 @@ func ERC20MultiSigSignerEventFromAddedProto(e *eventspb.ERC20MultiSigSignerAdded VegaTime: time.Unix(0, e.Timestamp), EpochID: epochID, Event: ERC20MultiSigSignerEventTypeAdded, + ChainID: e.ChainId, }, nil } @@ -98,6 +100,7 @@ func ERC20MultiSigSignerEventFromRemovedProto(e *eventspb.ERC20MultiSigSignerRem VegaTime: time.Unix(0, e.Timestamp), EpochID: epochID, Event: ERC20MultiSigSignerEventTypeRemoved, + ChainID: e.ChainId, }, ) } @@ -149,6 +152,7 @@ func (e ERC20MultiSigSignerAddedEvent) ToProto() *eventspb.ERC20MultiSigSignerAd Submitter: e.Submitter.String(), Nonce: e.Nonce, EpochSeq: strconv.FormatInt(e.EpochID, 10), + ChainId: e.ChainID, } } @@ -165,6 +169,7 @@ func (e ERC20MultiSigSignerAddedEvent) ToDataNodeApiV2Proto(ctx context.Context, Timestamp: e.VegaTime.UnixNano(), Signatures: PackNodeSignatures(signatures), EpochSeq: strconv.FormatInt(e.EpochID, 10), + ChainId: e.ChainID, }, nil } @@ -196,6 +201,7 @@ func (e ERC20MultiSigSignerRemovedEvent) ToProto() *eventspb.ERC20MultiSigSigner OldSigner: e.SignerChange.String(), Nonce: e.Nonce, EpochSeq: strconv.FormatInt(e.EpochID, 10), + ChainId: e.ChainID, } } @@ -212,6 +218,7 @@ func (e ERC20MultiSigSignerRemovedEvent) ToDataNodeApiV2Proto(ctx context.Contex Timestamp: e.VegaTime.UnixNano(), Signatures: PackNodeSignatures(signatures), EpochSeq: strconv.FormatInt(e.EpochID, 10), + ChainId: e.ChainID, }, nil } diff --git a/datanode/entities/market.go b/datanode/entities/market.go index 20fb0d3f76..dba19da603 100644 --- a/datanode/entities/market.go +++ b/datanode/entities/market.go @@ -363,6 +363,7 @@ type LiquidationStrategy struct { DisposalFraction num.Decimal `json:"disposalFraction"` FullDisposalSize uint64 `json:"fullDisposalSize"` MaxFractionConsumed num.Decimal `json:"maxFractionConsumed"` + DisposalSlippage num.Decimal `json:"disposalSlippageRange"` } func LiquidationStrategyFromProto(ls *vega.LiquidationStrategy) LiquidationStrategy { @@ -371,20 +372,26 @@ func LiquidationStrategyFromProto(ls *vega.LiquidationStrategy) LiquidationStrat } df, _ := num.DecimalFromString(ls.DisposalFraction) mfc, _ := num.DecimalFromString(ls.MaxFractionConsumed) + slip := num.DecimalZero() + if len(ls.DisposalSlippageRange) > 0 { + slip, _ = num.DecimalFromString(ls.DisposalSlippageRange) + } return LiquidationStrategy{ DisposalTimeStep: time.Duration(ls.DisposalTimeStep) * time.Second, FullDisposalSize: ls.FullDisposalSize, DisposalFraction: df, MaxFractionConsumed: mfc, + DisposalSlippage: slip, } } func (l LiquidationStrategy) IntoProto() *vega.LiquidationStrategy { return &vega.LiquidationStrategy{ - DisposalTimeStep: int64(l.DisposalTimeStep / time.Second), - DisposalFraction: l.DisposalFraction.String(), - FullDisposalSize: l.FullDisposalSize, - MaxFractionConsumed: l.MaxFractionConsumed.String(), + DisposalTimeStep: int64(l.DisposalTimeStep / time.Second), + DisposalFraction: l.DisposalFraction.String(), + FullDisposalSize: l.FullDisposalSize, + MaxFractionConsumed: l.MaxFractionConsumed.String(), + DisposalSlippageRange: l.DisposalSlippage.String(), } } diff --git a/datanode/entities/transfer.go b/datanode/entities/transfer.go index 02bc1f32a6..47df3d6b6a 100644 --- a/datanode/entities/transfer.go +++ b/datanode/entities/transfer.go @@ -150,7 +150,8 @@ func (t *Transfer) ToProto(ctx context.Context, accountSource AccountSource) (*e proto.Kind = &eventspb.Transfer_OneOffGovernance{OneOffGovernance: &eventspb.OneOffGovernanceTransfer{DeliverOn: t.DeliverOn.UnixNano()}} case GovernanceRecurring: recurringTransfer := &eventspb.RecurringGovernanceTransfer{ - StartEpoch: *t.StartEpoch, + StartEpoch: *t.StartEpoch, + DispatchStrategy: t.DispatchStrategy, } if t.EndEpoch != nil { diff --git a/datanode/gateway/config.go b/datanode/gateway/config.go index 5c2497e044..5235c61cf7 100644 --- a/datanode/gateway/config.go +++ b/datanode/gateway/config.go @@ -28,8 +28,9 @@ import ( // ServerConfig represent the configuration of a server in vega. type ServerConfig struct { - Port int `description:"Listen for connection on port " long:"port"` - IP string `description:"Bind to address " long:"ip"` + Port int `description:"Listen for connection on port " long:"port"` + IP string `description:"Bind to address " long:"ip"` + MaxMsgSize int `description:"Max message size in bytes" long:"max-msg-size"` } // GraphqlServiceConfig represents the configuration of the gateway. @@ -69,8 +70,9 @@ type Config struct { func NewDefaultConfig() Config { return Config{ ServerConfig: ServerConfig{ - IP: "0.0.0.0", - Port: 3008, + IP: "0.0.0.0", + Port: 3008, + MaxMsgSize: 20 * 1024 * 1024, }, Level: encoding.LogLevel{Level: logging.InfoLevel}, Timeout: encoding.Duration{Duration: 5 * time.Second}, @@ -84,8 +86,9 @@ func NewDefaultConfig() Config { APMEnabled: true, }, Node: ServerConfig{ - IP: "0.0.0.0", - Port: 3007, + IP: "0.0.0.0", + Port: 3007, + MaxMsgSize: 20 * 1024 * 1024, }, SubscriptionRetries: 3, GraphQLPlaygroundEnabled: true, diff --git a/datanode/gateway/graphql/asset_resolver.go b/datanode/gateway/graphql/asset_resolver.go index 40e0403ae2..fc6e3584fd 100644 --- a/datanode/gateway/graphql/asset_resolver.go +++ b/datanode/gateway/graphql/asset_resolver.go @@ -81,23 +81,23 @@ func (r *myAssetResolver) GlobalInsuranceAccount(ctx context.Context, asset *typ return listAssetAccounts(ctx, r.tradingDataClientV2, asset, types.AccountType_ACCOUNT_TYPE_GLOBAL_INSURANCE) } -func (r myAssetResolver) Name(ctx context.Context, obj *types.Asset) (string, error) { +func (r myAssetResolver) Name(_ context.Context, obj *types.Asset) (string, error) { return obj.Details.Name, nil } -func (r myAssetResolver) Symbol(ctx context.Context, obj *types.Asset) (string, error) { +func (r myAssetResolver) Symbol(_ context.Context, obj *types.Asset) (string, error) { return obj.Details.Symbol, nil } -func (r *myAssetResolver) Decimals(ctx context.Context, obj *types.Asset) (int, error) { +func (r *myAssetResolver) Decimals(_ context.Context, obj *types.Asset) (int, error) { return int(obj.Details.Decimals), nil } -func (r *myAssetResolver) Quantum(ctx context.Context, obj *types.Asset) (string, error) { +func (r *myAssetResolver) Quantum(_ context.Context, obj *types.Asset) (string, error) { return obj.Details.Quantum, nil } -func (r *myAssetResolver) Source(ctx context.Context, obj *types.Asset) (AssetSource, error) { +func (r *myAssetResolver) Source(_ context.Context, obj *types.Asset) (AssetSource, error) { return AssetSourceFromProto(obj.Details) } @@ -126,5 +126,6 @@ func ERC20FromProto(ea *types.ERC20) *Erc20 { ContractAddress: ea.ContractAddress, LifetimeLimit: ea.LifetimeLimit, WithdrawThreshold: ea.WithdrawThreshold, + ChainID: ea.ChainId, } } diff --git a/datanode/gateway/graphql/dispatch_strategy_resolver.go b/datanode/gateway/graphql/dispatch_strategy_resolver.go index 6f5befa74b..ac72bf3722 100644 --- a/datanode/gateway/graphql/dispatch_strategy_resolver.go +++ b/datanode/gateway/graphql/dispatch_strategy_resolver.go @@ -42,3 +42,10 @@ func (d *dispatchStrategyResolver) WindowLength(ctx context.Context, obj *vega.D func (d *dispatchStrategyResolver) LockPeriod(ctx context.Context, obj *vega.DispatchStrategy) (int, error) { return int(obj.LockPeriod), nil } + +func (d *dispatchStrategyResolver) TransferInterval(ctx context.Context, obj *vega.DispatchStrategy) (int, error) { + if obj.TransferInterval == nil { + return 1, nil + } + return int(*obj.TransferInterval), nil +} diff --git a/datanode/gateway/graphql/generated.go b/datanode/gateway/graphql/generated.go index 21ae2bf8ac..9aa9598017 100644 --- a/datanode/gateway/graphql/generated.go +++ b/datanode/gateway/graphql/generated.go @@ -31,6 +31,7 @@ import ( // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { return &executableSchema{ + schema: cfg.Schema, resolvers: cfg.Resolvers, directives: cfg.Directives, complexity: cfg.Complexity, @@ -38,6 +39,7 @@ func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { } type Config struct { + Schema *ast.Schema Resolvers ResolverRoot Directives DirectiveRoot Complexity ComplexityRoot @@ -358,8 +360,9 @@ type ComplexityRoot struct { } BatchProposalTermsChange struct { - Change func(childComplexity int) int - EnactmentDatetime func(childComplexity int) int + Change func(childComplexity int) int + EnactmentDatetime func(childComplexity int) int + ValidationDatetime func(childComplexity int) int } BenefitTier struct { @@ -575,16 +578,19 @@ type ComplexityRoot struct { RankTable func(childComplexity int) int StakingRequirement func(childComplexity int) int TeamScope func(childComplexity int) int + TransferInterval func(childComplexity int) int WindowLength func(childComplexity int) int } ERC20 struct { + ChainID func(childComplexity int) int ContractAddress func(childComplexity int) int LifetimeLimit func(childComplexity int) int WithdrawThreshold func(childComplexity int) int } ERC20MultiSigSignerAddedBundle struct { + ChainId func(childComplexity int) int EpochSeq func(childComplexity int) int NewSigner func(childComplexity int) int Nonce func(childComplexity int) int @@ -604,6 +610,7 @@ type ComplexityRoot struct { } ERC20MultiSigSignerRemovedBundle struct { + ChainId func(childComplexity int) int EpochSeq func(childComplexity int) int Nonce func(childComplexity int) int OldSigner func(childComplexity int) int @@ -730,6 +737,7 @@ type ComplexityRoot struct { Creation func(childComplexity int) int Nonce func(childComplexity int) int Signatures func(childComplexity int) int + SourceChainID func(childComplexity int) int TargetAddress func(childComplexity int) int } @@ -1013,10 +1021,11 @@ type ComplexityRoot struct { } LiquidationStrategy struct { - DisposalFraction func(childComplexity int) int - DisposalTimeStep func(childComplexity int) int - FullDisposalSize func(childComplexity int) int - MaxFractionConsumed func(childComplexity int) int + DisposalFraction func(childComplexity int) int + DisposalSlippageRange func(childComplexity int) int + DisposalTimeStep func(childComplexity int) int + FullDisposalSize func(childComplexity int) int + MaxFractionConsumed func(childComplexity int) int } LiquidityFeeSettings struct { @@ -1406,14 +1415,14 @@ type ComplexityRoot struct { } NewSpotMarket struct { - DecimalPlaces func(childComplexity int) int Instrument func(childComplexity int) int LiquidityFeeSettings func(childComplexity int) int LiquiditySLAParams func(childComplexity int) int Metadata func(childComplexity int) int - PositionDecimalPlaces func(childComplexity int) int + PriceDecimalPlaces func(childComplexity int) int PriceMonitoringParameters func(childComplexity int) int RiskParameters func(childComplexity int) int + SizeDecimalPlaces func(childComplexity int) int TargetStakeParameters func(childComplexity int) int TickSize func(childComplexity int) int } @@ -2106,8 +2115,8 @@ type ComplexityRoot struct { Epoch func(childComplexity int, id *string, block *string) int EpochRewardSummaries func(childComplexity int, filter *v2.RewardSummaryFilter, pagination *v2.Pagination) int Erc20ListAssetBundle func(childComplexity int, assetID string) int - Erc20MultiSigSignerAddedBundles func(childComplexity int, nodeID string, submitter *string, epochSeq *string, pagination *v2.Pagination) int - Erc20MultiSigSignerRemovedBundles func(childComplexity int, nodeID string, submitter *string, epochSeq *string, pagination *v2.Pagination) int + Erc20MultiSigSignerAddedBundles func(childComplexity int, nodeID string, submitter *string, epochSeq *string, chainID *string, pagination *v2.Pagination) int + 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 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 @@ -2371,13 +2380,11 @@ type ComplexityRoot struct { Spot struct { BaseAsset func(childComplexity int) int - Name func(childComplexity int) int QuoteAsset func(childComplexity int) int } SpotProduct struct { BaseAsset func(childComplexity int) int - Name func(childComplexity int) int QuoteAsset func(childComplexity int) int } @@ -2865,12 +2872,18 @@ type ComplexityRoot struct { WindowLength func(childComplexity int) int } + UpdateSpotInstrumentConfiguration struct { + Code func(childComplexity int) int + Name func(childComplexity int) int + } + UpdateSpotMarket struct { MarketId func(childComplexity int) int UpdateSpotMarketConfiguration func(childComplexity int) int } UpdateSpotMarketConfiguration struct { + Instrument func(childComplexity int) int LiquidityFeeSettings func(childComplexity int) int LiquiditySLAParams func(childComplexity int) int Metadata func(childComplexity int) int @@ -3010,6 +3023,7 @@ type BatchProposalTermsResolver interface { } type BatchProposalTermsChangeResolver interface { EnactmentDatetime(ctx context.Context, obj *vega.BatchProposalTermsChange) (*int64, error) + ValidationDatetime(ctx context.Context, obj *vega.BatchProposalTermsChange) (*int64, error) Change(ctx context.Context, obj *vega.BatchProposalTermsChange) (ProposalChange, error) } type BenefitTierResolver interface { @@ -3303,12 +3317,12 @@ type NewMarketResolver interface { } type NewSpotMarketResolver interface { Instrument(ctx context.Context, obj *vega.NewSpotMarket) (*vega.InstrumentConfiguration, error) - DecimalPlaces(ctx context.Context, obj *vega.NewSpotMarket) (int, error) + PriceDecimalPlaces(ctx context.Context, obj *vega.NewSpotMarket) (int, error) Metadata(ctx context.Context, obj *vega.NewSpotMarket) ([]string, error) PriceMonitoringParameters(ctx context.Context, obj *vega.NewSpotMarket) (*PriceMonitoringParameters, error) TargetStakeParameters(ctx context.Context, obj *vega.NewSpotMarket) (*TargetStakeParameters, error) RiskParameters(ctx context.Context, obj *vega.NewSpotMarket) (RiskModel, error) - PositionDecimalPlaces(ctx context.Context, obj *vega.NewSpotMarket) (int, error) + SizeDecimalPlaces(ctx context.Context, obj *vega.NewSpotMarket) (int, error) 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) @@ -3549,8 +3563,8 @@ type QueryResolver interface { Epoch(ctx context.Context, id *string, block *string) (*vega.Epoch, error) EpochRewardSummaries(ctx context.Context, filter *v2.RewardSummaryFilter, pagination *v2.Pagination) (*v2.EpochRewardSummaryConnection, error) Erc20ListAssetBundle(ctx context.Context, assetID string) (*Erc20ListAssetBundle, error) - Erc20MultiSigSignerAddedBundles(ctx context.Context, nodeID string, submitter *string, epochSeq *string, pagination *v2.Pagination) (*ERC20MultiSigSignerAddedConnection, error) - Erc20MultiSigSignerRemovedBundles(ctx context.Context, nodeID string, submitter *string, epochSeq *string, pagination *v2.Pagination) (*ERC20MultiSigSignerRemovedConnection, error) + Erc20MultiSigSignerAddedBundles(ctx context.Context, nodeID string, submitter *string, epochSeq *string, chainID *string, pagination *v2.Pagination) (*ERC20MultiSigSignerAddedConnection, error) + Erc20MultiSigSignerRemovedBundles(ctx context.Context, nodeID string, submitter *string, epochSeq *string, chainID *string, pagination *v2.Pagination) (*ERC20MultiSigSignerRemovedConnection, error) Erc20SetAssetLimitsBundle(ctx context.Context, proposalID string) (*ERC20SetAssetLimitsBundle, error) Erc20WithdrawalApproval(ctx context.Context, withdrawalID string) (*Erc20WithdrawalApproval, error) 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) @@ -3827,6 +3841,8 @@ type UpdateSpotMarketResolver interface { UpdateSpotMarketConfiguration(ctx context.Context, obj *vega.UpdateSpotMarket) (*vega.UpdateSpotMarketConfiguration, error) } type UpdateSpotMarketConfigurationResolver interface { + Instrument(ctx context.Context, obj *vega.UpdateSpotMarketConfiguration) (*UpdateSpotInstrumentConfiguration, error) + PriceMonitoringParameters(ctx context.Context, obj *vega.UpdateSpotMarketConfiguration) (*PriceMonitoringParameters, error) TargetStakeParameters(ctx context.Context, obj *vega.UpdateSpotMarketConfiguration) (*TargetStakeParameters, error) RiskParameters(ctx context.Context, obj *vega.UpdateSpotMarketConfiguration) (RiskModel, error) @@ -3887,17 +3903,21 @@ type StopOrderFilterResolver interface { } type executableSchema struct { + schema *ast.Schema resolvers ResolverRoot directives DirectiveRoot complexity ComplexityRoot } func (e *executableSchema) Schema() *ast.Schema { + if e.schema != nil { + return e.schema + } return parsedSchema } func (e *executableSchema) Complexity(typeName, field string, childComplexity int, rawArgs map[string]interface{}) (int, bool) { - ec := executionContext{nil, e} + ec := executionContext{nil, e, 0, 0, nil} _ = ec switch typeName + "." + field { @@ -4643,6 +4663,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.BatchProposalTermsChange.EnactmentDatetime(childComplexity), true + case "BatchProposalTermsChange.validationDatetime": + if e.complexity.BatchProposalTermsChange.ValidationDatetime == nil { + break + } + + return e.complexity.BatchProposalTermsChange.ValidationDatetime(childComplexity), true + case "BenefitTier.minimumEpochs": if e.complexity.BenefitTier.MinimumEpochs == nil { break @@ -5413,6 +5440,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.DispatchStrategy.TeamScope(childComplexity), true + case "DispatchStrategy.transferInterval": + if e.complexity.DispatchStrategy.TransferInterval == nil { + break + } + + return e.complexity.DispatchStrategy.TransferInterval(childComplexity), true + case "DispatchStrategy.windowLength": if e.complexity.DispatchStrategy.WindowLength == nil { break @@ -5420,6 +5454,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.DispatchStrategy.WindowLength(childComplexity), true + case "ERC20.chainId": + if e.complexity.ERC20.ChainID == nil { + break + } + + return e.complexity.ERC20.ChainID(childComplexity), true + case "ERC20.contractAddress": if e.complexity.ERC20.ContractAddress == nil { break @@ -5441,6 +5482,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.ERC20.WithdrawThreshold(childComplexity), true + case "ERC20MultiSigSignerAddedBundle.chainID": + if e.complexity.ERC20MultiSigSignerAddedBundle.ChainId == nil { + break + } + + return e.complexity.ERC20MultiSigSignerAddedBundle.ChainId(childComplexity), true + case "ERC20MultiSigSignerAddedBundle.epochSeq": if e.complexity.ERC20MultiSigSignerAddedBundle.EpochSeq == nil { break @@ -5511,6 +5559,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.ERC20MultiSigSignerAddedConnection.PageInfo(childComplexity), true + case "ERC20MultiSigSignerRemovedBundle.chainID": + if e.complexity.ERC20MultiSigSignerRemovedBundle.ChainId == nil { + break + } + + return e.complexity.ERC20MultiSigSignerRemovedBundle.ChainId(childComplexity), true + case "ERC20MultiSigSignerRemovedBundle.epochSeq": if e.complexity.ERC20MultiSigSignerRemovedBundle.EpochSeq == nil { break @@ -6088,6 +6143,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Erc20WithdrawalApproval.Signatures(childComplexity), true + case "Erc20WithdrawalApproval.sourceChainId": + if e.complexity.Erc20WithdrawalApproval.SourceChainID == nil { + break + } + + return e.complexity.Erc20WithdrawalApproval.SourceChainID(childComplexity), true + case "Erc20WithdrawalApproval.targetAddress": if e.complexity.Erc20WithdrawalApproval.TargetAddress == nil { break @@ -7131,6 +7193,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.LiquidationStrategy.DisposalFraction(childComplexity), true + case "LiquidationStrategy.disposalSlippageRange": + if e.complexity.LiquidationStrategy.DisposalSlippageRange == nil { + break + } + + return e.complexity.LiquidationStrategy.DisposalSlippageRange(childComplexity), true + case "LiquidationStrategy.disposalTimeStep": if e.complexity.LiquidationStrategy.DisposalTimeStep == nil { break @@ -8881,13 +8950,6 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.NewMarket.TickSize(childComplexity), true - case "NewSpotMarket.decimal_places": - if e.complexity.NewSpotMarket.DecimalPlaces == nil { - break - } - - return e.complexity.NewSpotMarket.DecimalPlaces(childComplexity), true - case "NewSpotMarket.instrument": if e.complexity.NewSpotMarket.Instrument == nil { break @@ -8916,12 +8978,12 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.NewSpotMarket.Metadata(childComplexity), true - case "NewSpotMarket.positionDecimalPlaces": - if e.complexity.NewSpotMarket.PositionDecimalPlaces == nil { + case "NewSpotMarket.priceDecimalPlaces": + if e.complexity.NewSpotMarket.PriceDecimalPlaces == nil { break } - return e.complexity.NewSpotMarket.PositionDecimalPlaces(childComplexity), true + return e.complexity.NewSpotMarket.PriceDecimalPlaces(childComplexity), true case "NewSpotMarket.priceMonitoringParameters": if e.complexity.NewSpotMarket.PriceMonitoringParameters == nil { @@ -8937,6 +8999,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.NewSpotMarket.RiskParameters(childComplexity), true + case "NewSpotMarket.sizeDecimalPlaces": + if e.complexity.NewSpotMarket.SizeDecimalPlaces == nil { + break + } + + return e.complexity.NewSpotMarket.SizeDecimalPlaces(childComplexity), true + case "NewSpotMarket.targetStakeParameters": if e.complexity.NewSpotMarket.TargetStakeParameters == nil { break @@ -12145,7 +12214,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Query.Erc20MultiSigSignerAddedBundles(childComplexity, args["nodeId"].(string), args["submitter"].(*string), args["epochSeq"].(*string), args["pagination"].(*v2.Pagination)), true + return e.complexity.Query.Erc20MultiSigSignerAddedBundles(childComplexity, args["nodeId"].(string), args["submitter"].(*string), args["epochSeq"].(*string), args["chainID"].(*string), args["pagination"].(*v2.Pagination)), true case "Query.erc20MultiSigSignerRemovedBundles": if e.complexity.Query.Erc20MultiSigSignerRemovedBundles == nil { @@ -12157,7 +12226,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Query.Erc20MultiSigSignerRemovedBundles(childComplexity, args["nodeId"].(string), args["submitter"].(*string), args["epochSeq"].(*string), args["pagination"].(*v2.Pagination)), true + return e.complexity.Query.Erc20MultiSigSignerRemovedBundles(childComplexity, args["nodeId"].(string), args["submitter"].(*string), args["epochSeq"].(*string), args["chainID"].(*string), args["pagination"].(*v2.Pagination)), true case "Query.erc20SetAssetLimitsBundle": if e.complexity.Query.Erc20SetAssetLimitsBundle == nil { @@ -13649,13 +13718,6 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Spot.BaseAsset(childComplexity), true - case "Spot.name": - if e.complexity.Spot.Name == nil { - break - } - - return e.complexity.Spot.Name(childComplexity), true - case "Spot.quoteAsset": if e.complexity.Spot.QuoteAsset == nil { break @@ -13670,13 +13732,6 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.SpotProduct.BaseAsset(childComplexity), true - case "SpotProduct.name": - if e.complexity.SpotProduct.Name == nil { - break - } - - return e.complexity.SpotProduct.Name(childComplexity), true - case "SpotProduct.quoteAsset": if e.complexity.SpotProduct.QuoteAsset == nil { break @@ -15761,6 +15816,20 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.UpdateReferralProgram.WindowLength(childComplexity), true + case "UpdateSpotInstrumentConfiguration.code": + if e.complexity.UpdateSpotInstrumentConfiguration.Code == nil { + break + } + + return e.complexity.UpdateSpotInstrumentConfiguration.Code(childComplexity), true + + case "UpdateSpotInstrumentConfiguration.name": + if e.complexity.UpdateSpotInstrumentConfiguration.Name == nil { + break + } + + return e.complexity.UpdateSpotInstrumentConfiguration.Name(childComplexity), true + case "UpdateSpotMarket.marketId": if e.complexity.UpdateSpotMarket.MarketId == nil { break @@ -15775,6 +15844,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.UpdateSpotMarket.UpdateSpotMarketConfiguration(childComplexity), true + case "UpdateSpotMarketConfiguration.instrument": + if e.complexity.UpdateSpotMarketConfiguration.Instrument == nil { + break + } + + return e.complexity.UpdateSpotMarketConfiguration.Instrument(childComplexity), true + case "UpdateSpotMarketConfiguration.liquidityFeeSettings": if e.complexity.UpdateSpotMarketConfiguration.LiquidityFeeSettings == nil { break @@ -16145,7 +16221,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { rc := graphql.GetOperationContext(ctx) - ec := executionContext{rc, e} + ec := executionContext{rc, e, 0, 0, make(chan graphql.DeferredResult)} inputUnmarshalMap := graphql.BuildUnmarshalerMap( ec.unmarshalInputAccountFilter, ec.unmarshalInputDateRange, @@ -16167,18 +16243,33 @@ func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { switch rc.Operation.Operation { case ast.Query: return func(ctx context.Context) *graphql.Response { - if !first { - return nil + var response graphql.Response + var data graphql.Marshaler + if first { + first = false + ctx = graphql.WithUnmarshalerMap(ctx, inputUnmarshalMap) + data = ec._Query(ctx, rc.Operation.SelectionSet) + } else { + if atomic.LoadInt32(&ec.pendingDeferred) > 0 { + result := <-ec.deferredResults + atomic.AddInt32(&ec.pendingDeferred, -1) + data = result.Result + response.Path = result.Path + response.Label = result.Label + response.Errors = result.Errors + } else { + return nil + } } - first = false - ctx = graphql.WithUnmarshalerMap(ctx, inputUnmarshalMap) - data := ec._Query(ctx, rc.Operation.SelectionSet) var buf bytes.Buffer data.MarshalGQL(&buf) - - return &graphql.Response{ - Data: buf.Bytes(), + response.Data = buf.Bytes() + if atomic.LoadInt32(&ec.deferred) > 0 { + hasNext := atomic.LoadInt32(&ec.pendingDeferred) > 0 + response.HasNext = &hasNext } + + return &response } case ast.Subscription: next := ec._Subscription(ctx, rc.Operation.SelectionSet) @@ -16206,20 +16297,42 @@ func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { type executionContext struct { *graphql.OperationContext *executableSchema + deferred int32 + pendingDeferred int32 + deferredResults chan graphql.DeferredResult +} + +func (ec *executionContext) processDeferredGroup(dg graphql.DeferredGroup) { + atomic.AddInt32(&ec.pendingDeferred, 1) + go func() { + ctx := graphql.WithFreshResponseContext(dg.Context) + dg.FieldSet.Dispatch(ctx) + ds := graphql.DeferredResult{ + Path: dg.Path, + Label: dg.Label, + Result: dg.FieldSet, + Errors: graphql.GetErrors(ctx), + } + // null fields should bubble up + if dg.FieldSet.Invalids > 0 { + ds.Result = graphql.Null + } + ec.deferredResults <- ds + }() } func (ec *executionContext) introspectSchema() (*introspection.Schema, error) { if ec.DisableIntrospection { return nil, errors.New("introspection disabled") } - return introspection.WrapSchema(parsedSchema), nil + return introspection.WrapSchema(ec.Schema()), nil } func (ec *executionContext) introspectType(name string) (*introspection.Type, error) { if ec.DisableIntrospection { return nil, errors.New("introspection disabled") } - return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]), nil + return introspection.WrapTypeFromDef(ec.Schema(), ec.Schema().Types[name]), nil } //go:embed "schema.graphql" @@ -17379,15 +17492,24 @@ func (ec *executionContext) field_Query_erc20MultiSigSignerAddedBundles_args(ctx } } args["epochSeq"] = arg2 - var arg3 *v2.Pagination + var arg3 *string + if tmp, ok := rawArgs["chainID"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("chainID")) + arg3, err = ec.unmarshalOString2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["chainID"] = arg3 + var arg4 *v2.Pagination if tmp, ok := rawArgs["pagination"]; ok { ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("pagination")) - arg3, err = ec.unmarshalOPagination2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐPagination(ctx, tmp) + arg4, err = ec.unmarshalOPagination2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐPagination(ctx, tmp) if err != nil { return nil, err } } - args["pagination"] = arg3 + args["pagination"] = arg4 return args, nil } @@ -17421,15 +17543,24 @@ func (ec *executionContext) field_Query_erc20MultiSigSignerRemovedBundles_args(c } } args["epochSeq"] = arg2 - var arg3 *v2.Pagination + var arg3 *string + if tmp, ok := rawArgs["chainID"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("chainID")) + arg3, err = ec.unmarshalOString2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["chainID"] = arg3 + var arg4 *v2.Pagination if tmp, ok := rawArgs["pagination"]; ok { ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("pagination")) - arg3, err = ec.unmarshalOPagination2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐPagination(ctx, tmp) + arg4, err = ec.unmarshalOPagination2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐPagination(ctx, tmp) if err != nil { return nil, err } } - args["pagination"] = arg3 + args["pagination"] = arg4 return args, nil } @@ -24917,6 +25048,8 @@ func (ec *executionContext) fieldContext_BatchProposalTerms_changes(ctx context. switch field.Name { case "enactmentDatetime": return ec.fieldContext_BatchProposalTermsChange_enactmentDatetime(ctx, field) + case "validationDatetime": + return ec.fieldContext_BatchProposalTermsChange_validationDatetime(ctx, field) case "change": return ec.fieldContext_BatchProposalTermsChange_change(ctx, field) } @@ -24967,6 +25100,47 @@ func (ec *executionContext) fieldContext_BatchProposalTermsChange_enactmentDatet return fc, nil } +func (ec *executionContext) _BatchProposalTermsChange_validationDatetime(ctx context.Context, field graphql.CollectedField, obj *vega.BatchProposalTermsChange) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_BatchProposalTermsChange_validationDatetime(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.BatchProposalTermsChange().ValidationDatetime(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int64) + fc.Result = res + return ec.marshalOTimestamp2ᚖint64(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_BatchProposalTermsChange_validationDatetime(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "BatchProposalTermsChange", + Field: field, + IsMethod: true, + IsResolver: true, + 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) _BatchProposalTermsChange_change(ctx context.Context, field graphql.CollectedField, obj *vega.BatchProposalTermsChange) (ret graphql.Marshaler) { fc, err := ec.fieldContext_BatchProposalTermsChange_change(ctx, field) if err != nil { @@ -30167,6 +30341,47 @@ func (ec *executionContext) fieldContext_DispatchStrategy_capRewardFeeMultiple(c return fc, nil } +func (ec *executionContext) _DispatchStrategy_transferInterval(ctx context.Context, field graphql.CollectedField, obj *vega.DispatchStrategy) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_DispatchStrategy_transferInterval(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.TransferInterval, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int32) + fc.Result = res + return ec.marshalOInt2ᚖint32(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_DispatchStrategy_transferInterval(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "DispatchStrategy", + Field: field, + IsMethod: false, + IsResolver: false, + 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) _ERC20_contractAddress(ctx context.Context, field graphql.CollectedField, obj *Erc20) (ret graphql.Marshaler) { fc, err := ec.fieldContext_ERC20_contractAddress(ctx, field) if err != nil { @@ -30299,6 +30514,50 @@ func (ec *executionContext) fieldContext_ERC20_withdrawThreshold(ctx context.Con return fc, nil } +func (ec *executionContext) _ERC20_chainId(ctx context.Context, field graphql.CollectedField, obj *Erc20) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ERC20_chainId(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.ChainID, 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_ERC20_chainId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "ERC20", + 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) _ERC20MultiSigSignerAddedBundle_newSigner(ctx context.Context, field graphql.CollectedField, obj *v2.ERC20MultiSigSignerAddedBundle) (ret graphql.Marshaler) { fc, err := ec.fieldContext_ERC20MultiSigSignerAddedBundle_newSigner(ctx, field) if err != nil { @@ -30563,6 +30822,50 @@ func (ec *executionContext) fieldContext_ERC20MultiSigSignerAddedBundle_epochSeq return fc, nil } +func (ec *executionContext) _ERC20MultiSigSignerAddedBundle_chainID(ctx context.Context, field graphql.CollectedField, obj *v2.ERC20MultiSigSignerAddedBundle) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ERC20MultiSigSignerAddedBundle_chainID(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.ChainId, 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_ERC20MultiSigSignerAddedBundle_chainID(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "ERC20MultiSigSignerAddedBundle", + 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) _ERC20MultiSigSignerAddedBundleEdge_node(ctx context.Context, field graphql.CollectedField, obj *ERC20MultiSigSignerAddedBundleEdge) (ret graphql.Marshaler) { fc, err := ec.fieldContext_ERC20MultiSigSignerAddedBundleEdge_node(ctx, field) if err != nil { @@ -30614,6 +30917,8 @@ func (ec *executionContext) fieldContext_ERC20MultiSigSignerAddedBundleEdge_node return ec.fieldContext_ERC20MultiSigSignerAddedBundle_signatures(ctx, field) case "epochSeq": return ec.fieldContext_ERC20MultiSigSignerAddedBundle_epochSeq(ctx, field) + case "chainID": + return ec.fieldContext_ERC20MultiSigSignerAddedBundle_chainID(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type ERC20MultiSigSignerAddedBundle", field.Name) }, @@ -31027,6 +31332,50 @@ func (ec *executionContext) fieldContext_ERC20MultiSigSignerRemovedBundle_epochS return fc, nil } +func (ec *executionContext) _ERC20MultiSigSignerRemovedBundle_chainID(ctx context.Context, field graphql.CollectedField, obj *v2.ERC20MultiSigSignerRemovedBundle) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ERC20MultiSigSignerRemovedBundle_chainID(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.ChainId, 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_ERC20MultiSigSignerRemovedBundle_chainID(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "ERC20MultiSigSignerRemovedBundle", + 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) _ERC20MultiSigSignerRemovedBundleEdge_node(ctx context.Context, field graphql.CollectedField, obj *ERC20MultiSigSignerRemovedBundleEdge) (ret graphql.Marshaler) { fc, err := ec.fieldContext_ERC20MultiSigSignerRemovedBundleEdge_node(ctx, field) if err != nil { @@ -31078,6 +31427,8 @@ func (ec *executionContext) fieldContext_ERC20MultiSigSignerRemovedBundleEdge_no return ec.fieldContext_ERC20MultiSigSignerRemovedBundle_signatures(ctx, field) case "epochSeq": return ec.fieldContext_ERC20MultiSigSignerRemovedBundle_epochSeq(ctx, field) + case "chainID": + return ec.fieldContext_ERC20MultiSigSignerRemovedBundle_chainID(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type ERC20MultiSigSignerRemovedBundle", field.Name) }, @@ -32021,6 +32372,8 @@ func (ec *executionContext) fieldContext_Entities_erc20MultiSigSignerAddedBundle return ec.fieldContext_ERC20MultiSigSignerAddedBundle_signatures(ctx, field) case "epochSeq": return ec.fieldContext_ERC20MultiSigSignerAddedBundle_epochSeq(ctx, field) + case "chainID": + return ec.fieldContext_ERC20MultiSigSignerAddedBundle_chainID(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type ERC20MultiSigSignerAddedBundle", field.Name) }, @@ -32076,6 +32429,8 @@ func (ec *executionContext) fieldContext_Entities_erc20MultiSigSignerRemovedBund return ec.fieldContext_ERC20MultiSigSignerRemovedBundle_signatures(ctx, field) case "epochSeq": return ec.fieldContext_ERC20MultiSigSignerRemovedBundle_epochSeq(ctx, field) + case "chainID": + return ec.fieldContext_ERC20MultiSigSignerRemovedBundle_chainID(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type ERC20MultiSigSignerRemovedBundle", field.Name) }, @@ -33417,7 +33772,7 @@ func (ec *executionContext) fieldContext_Epoch_validatorsConnection(ctx context. ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Epoch_validatorsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -33475,7 +33830,7 @@ func (ec *executionContext) fieldContext_Epoch_delegationsConnection(ctx context ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Epoch_delegationsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -34937,6 +35292,50 @@ func (ec *executionContext) fieldContext_Erc20WithdrawalApproval_creation(ctx co return fc, nil } +func (ec *executionContext) _Erc20WithdrawalApproval_sourceChainId(ctx context.Context, field graphql.CollectedField, obj *Erc20WithdrawalApproval) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Erc20WithdrawalApproval_sourceChainId(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.SourceChainID, 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_Erc20WithdrawalApproval_sourceChainId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Erc20WithdrawalApproval", + 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) _Erc20WithdrawalDetails_receiverAddress(ctx context.Context, field graphql.CollectedField, obj *Erc20WithdrawalDetails) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Erc20WithdrawalDetails_receiverAddress(ctx, field) if err != nil { @@ -41956,6 +42355,50 @@ func (ec *executionContext) fieldContext_LiquidationStrategy_maxFractionConsumed return fc, nil } +func (ec *executionContext) _LiquidationStrategy_disposalSlippageRange(ctx context.Context, field graphql.CollectedField, obj *vega.LiquidationStrategy) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_LiquidationStrategy_disposalSlippageRange(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.DisposalSlippageRange, 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_LiquidationStrategy_disposalSlippageRange(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "LiquidationStrategy", + 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) _LiquidityFeeSettings_method(ctx context.Context, field graphql.CollectedField, obj *vega.LiquidityFeeSettings) (ret graphql.Marshaler) { fc, err := ec.fieldContext_LiquidityFeeSettings_method(ctx, field) if err != nil { @@ -47981,7 +48424,7 @@ func (ec *executionContext) fieldContext_Market_ordersConnection(ctx context.Con ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Market_ordersConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -48039,7 +48482,7 @@ func (ec *executionContext) fieldContext_Market_accountsConnection(ctx context.C ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Market_accountsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -48097,7 +48540,7 @@ func (ec *executionContext) fieldContext_Market_tradesConnection(ctx context.Con ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Market_tradesConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -48164,7 +48607,7 @@ func (ec *executionContext) fieldContext_Market_depth(ctx context.Context, field ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Market_depth_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -48222,7 +48665,7 @@ func (ec *executionContext) fieldContext_Market_candlesConnection(ctx context.Co ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Market_candlesConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -48395,7 +48838,7 @@ func (ec *executionContext) fieldContext_Market_liquidityProvisions(ctx context. ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Market_liquidityProvisions_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -48453,7 +48896,7 @@ func (ec *executionContext) fieldContext_Market_liquidityProvisionsConnection(ct ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Market_liquidityProvisionsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -48867,6 +49310,8 @@ func (ec *executionContext) fieldContext_Market_liquidationStrategy(ctx context. return ec.fieldContext_LiquidationStrategy_fullDisposalSize(ctx, field) case "maxFractionConsumed": return ec.fieldContext_LiquidationStrategy_maxFractionConsumed(ctx, field) + case "disposalSlippageRange": + return ec.fieldContext_LiquidationStrategy_disposalSlippageRange(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type LiquidationStrategy", field.Name) }, @@ -53898,6 +54343,8 @@ func (ec *executionContext) fieldContext_NewMarket_liquidationStrategy(ctx conte return ec.fieldContext_LiquidationStrategy_fullDisposalSize(ctx, field) case "maxFractionConsumed": return ec.fieldContext_LiquidationStrategy_maxFractionConsumed(ctx, field) + case "disposalSlippageRange": + return ec.fieldContext_LiquidationStrategy_disposalSlippageRange(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type LiquidationStrategy", field.Name) }, @@ -54065,8 +54512,8 @@ func (ec *executionContext) fieldContext_NewSpotMarket_instrument(ctx context.Co return fc, nil } -func (ec *executionContext) _NewSpotMarket_decimal_places(ctx context.Context, field graphql.CollectedField, obj *vega.NewSpotMarket) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_NewSpotMarket_decimal_places(ctx, field) +func (ec *executionContext) _NewSpotMarket_priceDecimalPlaces(ctx context.Context, field graphql.CollectedField, obj *vega.NewSpotMarket) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_NewSpotMarket_priceDecimalPlaces(ctx, field) if err != nil { return graphql.Null } @@ -54079,7 +54526,7 @@ func (ec *executionContext) _NewSpotMarket_decimal_places(ctx context.Context, f }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.NewSpotMarket().DecimalPlaces(rctx, obj) + return ec.resolvers.NewSpotMarket().PriceDecimalPlaces(rctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -54096,7 +54543,7 @@ func (ec *executionContext) _NewSpotMarket_decimal_places(ctx context.Context, f return ec.marshalNInt2int(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_NewSpotMarket_decimal_places(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_NewSpotMarket_priceDecimalPlaces(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "NewSpotMarket", Field: field, @@ -54292,8 +54739,8 @@ func (ec *executionContext) fieldContext_NewSpotMarket_riskParameters(ctx contex return fc, nil } -func (ec *executionContext) _NewSpotMarket_positionDecimalPlaces(ctx context.Context, field graphql.CollectedField, obj *vega.NewSpotMarket) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_NewSpotMarket_positionDecimalPlaces(ctx, field) +func (ec *executionContext) _NewSpotMarket_sizeDecimalPlaces(ctx context.Context, field graphql.CollectedField, obj *vega.NewSpotMarket) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_NewSpotMarket_sizeDecimalPlaces(ctx, field) if err != nil { return graphql.Null } @@ -54306,7 +54753,7 @@ func (ec *executionContext) _NewSpotMarket_positionDecimalPlaces(ctx context.Con }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.NewSpotMarket().PositionDecimalPlaces(rctx, obj) + return ec.resolvers.NewSpotMarket().SizeDecimalPlaces(rctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -54323,7 +54770,7 @@ func (ec *executionContext) _NewSpotMarket_positionDecimalPlaces(ctx context.Con return ec.marshalNInt2int(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_NewSpotMarket_positionDecimalPlaces(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_NewSpotMarket_sizeDecimalPlaces(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "NewSpotMarket", Field: field, @@ -55495,7 +55942,7 @@ func (ec *executionContext) fieldContext_Node_delegationsConnection(ctx context. ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Node_delegationsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -60256,7 +60703,7 @@ func (ec *executionContext) fieldContext_OracleSpec_dataConnection(ctx context.C ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_OracleSpec_dataConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -61140,7 +61587,7 @@ func (ec *executionContext) fieldContext_Order_tradesConnection(ctx context.Cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Order_tradesConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64125,7 +64572,7 @@ func (ec *executionContext) fieldContext_Party_ordersConnection(ctx context.Cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_ordersConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64183,7 +64630,7 @@ func (ec *executionContext) fieldContext_Party_tradesConnection(ctx context.Cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_tradesConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64241,7 +64688,7 @@ func (ec *executionContext) fieldContext_Party_accountsConnection(ctx context.Co ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_accountsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64299,7 +64746,7 @@ func (ec *executionContext) fieldContext_Party_positionsConnection(ctx context.C ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_positionsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64357,7 +64804,7 @@ func (ec *executionContext) fieldContext_Party_marginsConnection(ctx context.Con ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_marginsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64415,7 +64862,7 @@ func (ec *executionContext) fieldContext_Party_proposalsConnection(ctx context.C ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_proposalsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64473,7 +64920,7 @@ func (ec *executionContext) fieldContext_Party_votesConnection(ctx context.Conte ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_votesConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64531,7 +64978,7 @@ func (ec *executionContext) fieldContext_Party_withdrawalsConnection(ctx context ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_withdrawalsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64589,7 +65036,7 @@ func (ec *executionContext) fieldContext_Party_depositsConnection(ctx context.Co ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_depositsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64647,7 +65094,7 @@ func (ec *executionContext) fieldContext_Party_liquidityProvisions(ctx context.C ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_liquidityProvisions_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64705,7 +65152,7 @@ func (ec *executionContext) fieldContext_Party_liquidityProvisionsConnection(ctx ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_liquidityProvisionsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64763,7 +65210,7 @@ func (ec *executionContext) fieldContext_Party_delegationsConnection(ctx context ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_delegationsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64824,7 +65271,7 @@ func (ec *executionContext) fieldContext_Party_stakingSummary(ctx context.Contex ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_stakingSummary_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64882,7 +65329,7 @@ func (ec *executionContext) fieldContext_Party_rewardsConnection(ctx context.Con ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_rewardsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -64942,7 +65389,7 @@ func (ec *executionContext) fieldContext_Party_rewardSummaries(ctx context.Conte ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_rewardSummaries_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -65000,7 +65447,7 @@ func (ec *executionContext) fieldContext_Party_transfersConnection(ctx context.C ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_transfersConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -65070,7 +65517,7 @@ func (ec *executionContext) fieldContext_Party_activityStreak(ctx context.Contex ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_activityStreak_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -65133,7 +65580,7 @@ func (ec *executionContext) fieldContext_Party_vestingBalancesSummary(ctx contex ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Party_vestingBalancesSummary_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -69531,7 +69978,7 @@ func (ec *executionContext) fieldContext_Position_marginsConnection(ctx context. ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Position_marginsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -74493,7 +74940,7 @@ func (ec *executionContext) fieldContext_Query_asset(ctx context.Context, field ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_asset_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -74551,7 +74998,7 @@ func (ec *executionContext) fieldContext_Query_assetsConnection(ctx context.Cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_assetsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -74612,7 +75059,7 @@ func (ec *executionContext) fieldContext_Query_balanceChanges(ctx context.Contex ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_balanceChanges_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -74782,7 +75229,7 @@ func (ec *executionContext) fieldContext_Query_coreSnapshots(ctx context.Context ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_coreSnapshots_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -74852,7 +75299,7 @@ func (ec *executionContext) fieldContext_Query_deposit(ctx context.Context, fiel ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_deposit_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -74910,7 +75357,7 @@ func (ec *executionContext) fieldContext_Query_deposits(ctx context.Context, fie ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_deposits_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75023,7 +75470,7 @@ func (ec *executionContext) fieldContext_Query_entities(ctx context.Context, fie ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_entities_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75088,7 +75535,7 @@ func (ec *executionContext) fieldContext_Query_epoch(ctx context.Context, field ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_epoch_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75146,7 +75593,7 @@ func (ec *executionContext) fieldContext_Query_epochRewardSummaries(ctx context. ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_epochRewardSummaries_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75208,7 +75655,7 @@ func (ec *executionContext) fieldContext_Query_erc20ListAssetBundle(ctx context. ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_erc20ListAssetBundle_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75227,7 +75674,7 @@ func (ec *executionContext) _Query_erc20MultiSigSignerAddedBundles(ctx context.C }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().Erc20MultiSigSignerAddedBundles(rctx, fc.Args["nodeId"].(string), fc.Args["submitter"].(*string), fc.Args["epochSeq"].(*string), fc.Args["pagination"].(*v2.Pagination)) + return ec.resolvers.Query().Erc20MultiSigSignerAddedBundles(rctx, fc.Args["nodeId"].(string), fc.Args["submitter"].(*string), fc.Args["epochSeq"].(*string), fc.Args["chainID"].(*string), fc.Args["pagination"].(*v2.Pagination)) }) if err != nil { ec.Error(ctx, err) @@ -75269,7 +75716,7 @@ func (ec *executionContext) fieldContext_Query_erc20MultiSigSignerAddedBundles(c ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_erc20MultiSigSignerAddedBundles_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75288,7 +75735,7 @@ func (ec *executionContext) _Query_erc20MultiSigSignerRemovedBundles(ctx context }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().Erc20MultiSigSignerRemovedBundles(rctx, fc.Args["nodeId"].(string), fc.Args["submitter"].(*string), fc.Args["epochSeq"].(*string), fc.Args["pagination"].(*v2.Pagination)) + return ec.resolvers.Query().Erc20MultiSigSignerRemovedBundles(rctx, fc.Args["nodeId"].(string), fc.Args["submitter"].(*string), fc.Args["epochSeq"].(*string), fc.Args["chainID"].(*string), fc.Args["pagination"].(*v2.Pagination)) }) if err != nil { ec.Error(ctx, err) @@ -75330,7 +75777,7 @@ func (ec *executionContext) fieldContext_Query_erc20MultiSigSignerRemovedBundles ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_erc20MultiSigSignerRemovedBundles_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75399,7 +75846,7 @@ func (ec *executionContext) fieldContext_Query_erc20SetAssetLimitsBundle(ctx con ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_erc20SetAssetLimitsBundle_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75452,6 +75899,8 @@ func (ec *executionContext) fieldContext_Query_erc20WithdrawalApproval(ctx conte return ec.fieldContext_Erc20WithdrawalApproval_targetAddress(ctx, field) case "creation": return ec.fieldContext_Erc20WithdrawalApproval_creation(ctx, field) + case "sourceChainId": + return ec.fieldContext_Erc20WithdrawalApproval_sourceChainId(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Erc20WithdrawalApproval", field.Name) }, @@ -75465,7 +75914,7 @@ func (ec *executionContext) fieldContext_Query_erc20WithdrawalApproval(ctx conte ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_erc20WithdrawalApproval_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75528,7 +75977,7 @@ func (ec *executionContext) fieldContext_Query_estimateOrder(ctx context.Context ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_estimateOrder_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75589,7 +76038,7 @@ func (ec *executionContext) fieldContext_Query_estimateFees(ctx context.Context, ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_estimateFees_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75649,7 +76098,7 @@ func (ec *executionContext) fieldContext_Query_estimatePosition(ctx context.Cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_estimatePosition_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75710,7 +76159,7 @@ func (ec *executionContext) fieldContext_Query_ethereumKeyRotations(ctx context. ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_ethereumKeyRotations_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75768,7 +76217,7 @@ func (ec *executionContext) fieldContext_Query_estimateTransferFee(ctx context.C ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_estimateTransferFee_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75840,7 +76289,7 @@ func (ec *executionContext) fieldContext_Query_feesStats(ctx context.Context, fi ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_feesStats_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75904,7 +76353,7 @@ func (ec *executionContext) fieldContext_Query_feesStatsForParty(ctx context.Con ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_feesStatsForParty_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -75965,7 +76414,7 @@ func (ec *executionContext) fieldContext_Query_fundingPayments(ctx context.Conte ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_fundingPayments_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -76026,7 +76475,7 @@ func (ec *executionContext) fieldContext_Query_fundingPeriods(ctx context.Contex ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_fundingPeriods_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -76087,7 +76536,7 @@ func (ec *executionContext) fieldContext_Query_fundingPeriodDataPoints(ctx conte ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_fundingPeriodDataPoints_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -76148,7 +76597,7 @@ func (ec *executionContext) fieldContext_Query_games(ctx context.Context, field ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_games_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -76206,7 +76655,7 @@ func (ec *executionContext) fieldContext_Query_getMarketDataHistoryConnectionByI ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_getMarketDataHistoryConnectionByID_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -76267,7 +76716,7 @@ func (ec *executionContext) fieldContext_Query_keyRotationsConnection(ctx contex ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_keyRotationsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -76328,7 +76777,7 @@ func (ec *executionContext) fieldContext_Query_ledgerEntries(ctx context.Context ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_ledgerEntries_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -76386,7 +76835,7 @@ func (ec *executionContext) fieldContext_Query_liquidityProviders(ctx context.Co ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_liquidityProviders_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -76546,7 +76995,7 @@ func (ec *executionContext) fieldContext_Query_market(ctx context.Context, field ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_market_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -76604,7 +77053,7 @@ func (ec *executionContext) fieldContext_Query_marketsConnection(ctx context.Con ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_marketsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -76771,7 +77220,7 @@ func (ec *executionContext) fieldContext_Query_networkParameter(ctx context.Cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_networkParameter_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -76832,7 +77281,7 @@ func (ec *executionContext) fieldContext_Query_networkParametersConnection(ctx c ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_networkParametersConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -76920,7 +77369,7 @@ func (ec *executionContext) fieldContext_Query_node(ctx context.Context, field g ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_node_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77038,7 +77487,7 @@ func (ec *executionContext) fieldContext_Query_nodesConnection(ctx context.Conte ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_nodesConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77096,7 +77545,7 @@ func (ec *executionContext) fieldContext_Query_nodeSignaturesConnection(ctx cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_nodeSignaturesConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77154,7 +77603,7 @@ func (ec *executionContext) fieldContext_Query_oracleDataBySpecConnection(ctx co ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_oracleDataBySpecConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77212,7 +77661,7 @@ func (ec *executionContext) fieldContext_Query_oracleDataConnection(ctx context. ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_oracleDataConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77270,7 +77719,7 @@ func (ec *executionContext) fieldContext_Query_oracleSpec(ctx context.Context, f ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_oracleSpec_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77328,7 +77777,7 @@ func (ec *executionContext) fieldContext_Query_oracleSpecsConnection(ctx context ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_oracleSpecsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77429,7 +77878,7 @@ func (ec *executionContext) fieldContext_Query_orderByID(ctx context.Context, fi ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_orderByID_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77530,7 +77979,7 @@ func (ec *executionContext) fieldContext_Query_orderByReference(ctx context.Cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_orderByReference_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77588,7 +78037,7 @@ func (ec *executionContext) fieldContext_Query_orderVersionsConnection(ctx conte ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_orderVersionsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77646,7 +78095,7 @@ func (ec *executionContext) fieldContext_Query_paidLiquidityFees(ctx context.Con ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_paidLiquidityFees_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77704,7 +78153,7 @@ func (ec *executionContext) fieldContext_Query_partiesConnection(ctx context.Con ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_partiesConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77762,7 +78211,7 @@ func (ec *executionContext) fieldContext_Query_partiesProfilesConnection(ctx con ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_partiesProfilesConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77856,7 +78305,7 @@ func (ec *executionContext) fieldContext_Query_party(ctx context.Context, field ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_party_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77914,7 +78363,7 @@ func (ec *executionContext) fieldContext_Query_positions(ctx context.Context, fi ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_positions_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -77966,7 +78415,7 @@ func (ec *executionContext) fieldContext_Query_proposal(ctx context.Context, fie ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_proposal_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -78024,7 +78473,7 @@ func (ec *executionContext) fieldContext_Query_proposalsConnection(ctx context.C ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_proposalsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -78127,7 +78576,7 @@ func (ec *executionContext) fieldContext_Query_protocolUpgradeProposals(ctx cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_protocolUpgradeProposals_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -78188,7 +78637,7 @@ func (ec *executionContext) fieldContext_Query_referralSets(ctx context.Context, ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_referralSets_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -78249,7 +78698,7 @@ func (ec *executionContext) fieldContext_Query_referralSetReferees(ctx context.C ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_referralSetReferees_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -78310,7 +78759,7 @@ func (ec *executionContext) fieldContext_Query_referralSetStats(ctx context.Cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_referralSetStats_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -78496,7 +78945,7 @@ func (ec *executionContext) fieldContext_Query_stopOrder(ctx context.Context, fi ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_stopOrder_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -78554,7 +79003,7 @@ func (ec *executionContext) fieldContext_Query_stopOrders(ctx context.Context, f ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_stopOrders_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -78612,7 +79061,7 @@ func (ec *executionContext) fieldContext_Query_successorMarkets(ctx context.Cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_successorMarkets_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -78670,7 +79119,7 @@ func (ec *executionContext) fieldContext_Query_teams(ctx context.Context, field ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_teams_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -78728,7 +79177,7 @@ func (ec *executionContext) fieldContext_Query_teamsStatistics(ctx context.Conte ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_teamsStatistics_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -78786,7 +79235,7 @@ func (ec *executionContext) fieldContext_Query_teamMembersStatistics(ctx context ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_teamMembersStatistics_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -78844,7 +79293,7 @@ func (ec *executionContext) fieldContext_Query_teamReferees(ctx context.Context, ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_teamReferees_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -78902,7 +79351,7 @@ func (ec *executionContext) fieldContext_Query_teamRefereeHistory(ctx context.Co ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_teamRefereeHistory_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -78968,7 +79417,7 @@ func (ec *executionContext) fieldContext_Query_timeWeightedNotionalPosition(ctx ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_timeWeightedNotionalPosition_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -79024,7 +79473,7 @@ func (ec *executionContext) fieldContext_Query_totalTransferFeeDiscount(ctx cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_totalTransferFeeDiscount_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -79082,7 +79531,7 @@ func (ec *executionContext) fieldContext_Query_trades(ctx context.Context, field ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_trades_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -79140,7 +79589,7 @@ func (ec *executionContext) fieldContext_Query_transfersConnection(ctx context.C ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_transfersConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -79198,7 +79647,7 @@ func (ec *executionContext) fieldContext_Query_transfer(ctx context.Context, fie ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_transfer_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -79259,7 +79708,7 @@ func (ec *executionContext) fieldContext_Query_volumeDiscountStats(ctx context.C ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_volumeDiscountStats_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -79333,7 +79782,7 @@ func (ec *executionContext) fieldContext_Query_withdrawal(ctx context.Context, f ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_withdrawal_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -79391,7 +79840,7 @@ func (ec *executionContext) fieldContext_Query_withdrawals(ctx context.Context, ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_withdrawals_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -79449,7 +79898,7 @@ func (ec *executionContext) fieldContext_Query_partyMarginModes(ctx context.Cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query_partyMarginModes_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -79523,7 +79972,7 @@ func (ec *executionContext) fieldContext_Query___type(ctx context.Context, field ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Query___type_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -80084,6 +80533,8 @@ func (ec *executionContext) fieldContext_RecurringGovernanceTransfer_dispatchStr return ec.fieldContext_DispatchStrategy_rankTable(ctx, field) case "capRewardFeeMultiple": return ec.fieldContext_DispatchStrategy_capRewardFeeMultiple(ctx, field) + case "transferInterval": + return ec.fieldContext_DispatchStrategy_transferInterval(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type DispatchStrategy", field.Name) }, @@ -80284,6 +80735,8 @@ func (ec *executionContext) fieldContext_RecurringTransfer_dispatchStrategy(ctx return ec.fieldContext_DispatchStrategy_rankTable(ctx, field) case "capRewardFeeMultiple": return ec.fieldContext_DispatchStrategy_capRewardFeeMultiple(ctx, field) + case "transferInterval": + return ec.fieldContext_DispatchStrategy_transferInterval(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type DispatchStrategy", field.Name) }, @@ -83380,7 +83833,7 @@ func (ec *executionContext) fieldContext_RewardSummary_rewardsConnection(ctx con ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_RewardSummary_rewardsConnection_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -84677,50 +85130,6 @@ func (ec *executionContext) fieldContext_Spot_quoteAsset(ctx context.Context, fi return fc, nil } -func (ec *executionContext) _Spot_name(ctx context.Context, field graphql.CollectedField, obj *vega.Spot) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Spot_name(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.Name, 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_Spot_name(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Spot", - 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) _SpotProduct_baseAsset(ctx context.Context, field graphql.CollectedField, obj *vega.SpotProduct) (ret graphql.Marshaler) { fc, err := ec.fieldContext_SpotProduct_baseAsset(ctx, field) if err != nil { @@ -84873,50 +85282,6 @@ func (ec *executionContext) fieldContext_SpotProduct_quoteAsset(ctx context.Cont return fc, nil } -func (ec *executionContext) _SpotProduct_name(ctx context.Context, field graphql.CollectedField, obj *vega.SpotProduct) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_SpotProduct_name(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.Name, 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_SpotProduct_name(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "SpotProduct", - 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) _StakeLinking_id(ctx context.Context, field graphql.CollectedField, obj *v1.StakeLinking) (ret graphql.Marshaler) { fc, err := ec.fieldContext_StakeLinking_id(ctx, field) if err != nil { @@ -85661,7 +86026,7 @@ func (ec *executionContext) fieldContext_StakingSummary_linkings(ctx context.Con ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_StakingSummary_linkings_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -88075,7 +88440,7 @@ func (ec *executionContext) fieldContext_Subscription_accounts(ctx context.Conte ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Subscription_accounts_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -88151,7 +88516,7 @@ func (ec *executionContext) fieldContext_Subscription_busEvents(ctx context.Cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Subscription_busEvents_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -88238,7 +88603,7 @@ func (ec *executionContext) fieldContext_Subscription_candles(ctx context.Contex ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Subscription_candles_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -88330,7 +88695,7 @@ func (ec *executionContext) fieldContext_Subscription_liquidityProvisions(ctx co ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Subscription_liquidityProvisions_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -88423,7 +88788,7 @@ func (ec *executionContext) fieldContext_Subscription_margins(ctx context.Contex ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Subscription_margins_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -88562,7 +88927,7 @@ func (ec *executionContext) fieldContext_Subscription_marketsData(ctx context.Co ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Subscription_marketsData_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -88643,7 +89008,7 @@ func (ec *executionContext) fieldContext_Subscription_marketsDepth(ctx context.C ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Subscription_marketsDepth_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -88724,7 +89089,7 @@ func (ec *executionContext) fieldContext_Subscription_marketsDepthUpdate(ctx con ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Subscription_marketsDepthUpdate_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -88830,7 +89195,7 @@ func (ec *executionContext) fieldContext_Subscription_orders(ctx context.Context ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Subscription_orders_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -88919,7 +89284,7 @@ func (ec *executionContext) fieldContext_Subscription_positions(ctx context.Cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Subscription_positions_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -89018,7 +89383,7 @@ func (ec *executionContext) fieldContext_Subscription_proposals(ctx context.Cont ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Subscription_proposals_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -89116,7 +89481,7 @@ func (ec *executionContext) fieldContext_Subscription_trades(ctx context.Context ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Subscription_trades_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -89214,7 +89579,7 @@ func (ec *executionContext) fieldContext_Subscription_tradesStream(ctx context.C ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Subscription_tradesStream_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -89289,7 +89654,7 @@ func (ec *executionContext) fieldContext_Subscription_votes(ctx context.Context, ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field_Subscription_votes_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -98079,6 +98444,8 @@ func (ec *executionContext) fieldContext_UpdateMarketConfiguration_liquidationSt return ec.fieldContext_LiquidationStrategy_fullDisposalSize(ctx, field) case "maxFractionConsumed": return ec.fieldContext_LiquidationStrategy_maxFractionConsumed(ctx, field) + case "disposalSlippageRange": + return ec.fieldContext_LiquidationStrategy_disposalSlippageRange(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type LiquidationStrategy", field.Name) }, @@ -99209,6 +99576,94 @@ func (ec *executionContext) fieldContext_UpdateReferralProgram_stakingTiers(ctx return fc, nil } +func (ec *executionContext) _UpdateSpotInstrumentConfiguration_code(ctx context.Context, field graphql.CollectedField, obj *UpdateSpotInstrumentConfiguration) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_UpdateSpotInstrumentConfiguration_code(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.Code, 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_UpdateSpotInstrumentConfiguration_code(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "UpdateSpotInstrumentConfiguration", + 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) _UpdateSpotInstrumentConfiguration_name(ctx context.Context, field graphql.CollectedField, obj *UpdateSpotInstrumentConfiguration) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_UpdateSpotInstrumentConfiguration_name(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.Name, 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_UpdateSpotInstrumentConfiguration_name(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "UpdateSpotInstrumentConfiguration", + 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) _UpdateSpotMarket_marketId(ctx context.Context, field graphql.CollectedField, obj *vega.UpdateSpotMarket) (ret graphql.Marshaler) { fc, err := ec.fieldContext_UpdateSpotMarket_marketId(ctx, field) if err != nil { @@ -99292,6 +99747,8 @@ func (ec *executionContext) fieldContext_UpdateSpotMarket_updateSpotMarketConfig IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { + case "instrument": + return ec.fieldContext_UpdateSpotMarketConfiguration_instrument(ctx, field) case "metadata": return ec.fieldContext_UpdateSpotMarketConfiguration_metadata(ctx, field) case "priceMonitoringParameters": @@ -99313,6 +99770,56 @@ func (ec *executionContext) fieldContext_UpdateSpotMarket_updateSpotMarketConfig return fc, nil } +func (ec *executionContext) _UpdateSpotMarketConfiguration_instrument(ctx context.Context, field graphql.CollectedField, obj *vega.UpdateSpotMarketConfiguration) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_UpdateSpotMarketConfiguration_instrument(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().Instrument(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.(*UpdateSpotInstrumentConfiguration) + fc.Result = res + return ec.marshalNUpdateSpotInstrumentConfiguration2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋdatanodeᚋgatewayᚋgraphqlᚐUpdateSpotInstrumentConfiguration(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_UpdateSpotMarketConfiguration_instrument(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) { + switch field.Name { + case "code": + return ec.fieldContext_UpdateSpotInstrumentConfiguration_code(ctx, field) + case "name": + return ec.fieldContext_UpdateSpotInstrumentConfiguration_name(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type UpdateSpotInstrumentConfiguration", field.Name) + }, + } + return fc, nil +} + func (ec *executionContext) _UpdateSpotMarketConfiguration_metadata(ctx context.Context, field graphql.CollectedField, obj *vega.UpdateSpotMarketConfiguration) (ret graphql.Marshaler) { fc, err := ec.fieldContext_UpdateSpotMarketConfiguration_metadata(ctx, field) if err != nil { @@ -103247,7 +103754,7 @@ func (ec *executionContext) fieldContext___Type_fields(ctx context.Context, fiel ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field___Type_fields_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -103435,7 +103942,7 @@ func (ec *executionContext) fieldContext___Type_enumValues(ctx context.Context, ctx = graphql.WithFieldContext(ctx, fc) if fc.Args, err = ec.field___Type_enumValues_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) - return + return fc, err } return fc, nil } @@ -103614,37 +104121,33 @@ func (ec *executionContext) unmarshalInputAccountFilter(ctx context.Context, obj } switch k { case "assetId": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("assetId")) - it.AssetId, err = ec.unmarshalOID2string(ctx, v) + data, err := ec.unmarshalOID2string(ctx, v) if err != nil { return it, err } + it.AssetId = data case "partyIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("partyIds")) - it.PartyIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.PartyIds = data case "marketIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("marketIds")) - it.MarketIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.MarketIds = data case "accountTypes": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("accountTypes")) - it.AccountTypes, err = ec.unmarshalOAccountType2ᚕcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐAccountTypeᚄ(ctx, v) + data, err := ec.unmarshalOAccountType2ᚕcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐAccountTypeᚄ(ctx, v) if err != nil { return it, err } + it.AccountTypes = data } } @@ -103666,8 +104169,6 @@ func (ec *executionContext) unmarshalInputDateRange(ctx context.Context, obj int } switch k { case "start": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("start")) data, err := ec.unmarshalOTimestamp2ᚖint64(ctx, v) if err != nil { @@ -103677,8 +104178,6 @@ func (ec *executionContext) unmarshalInputDateRange(ctx context.Context, obj int return it, err } case "end": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("end")) data, err := ec.unmarshalOTimestamp2ᚖint64(ctx, v) if err != nil { @@ -103708,45 +104207,40 @@ func (ec *executionContext) unmarshalInputLedgerEntryFilter(ctx context.Context, } switch k { case "CloseOnAccountFilters": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("CloseOnAccountFilters")) - it.CloseOnAccountFilters, err = ec.unmarshalOBoolean2bool(ctx, v) + data, err := ec.unmarshalOBoolean2bool(ctx, v) if err != nil { return it, err } + it.CloseOnAccountFilters = data case "FromAccountFilter": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("FromAccountFilter")) - it.FromAccountFilter, err = ec.unmarshalOAccountFilter2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAccountFilter(ctx, v) + data, err := ec.unmarshalOAccountFilter2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAccountFilter(ctx, v) if err != nil { return it, err } + it.FromAccountFilter = data case "ToAccountFilter": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ToAccountFilter")) - it.ToAccountFilter, err = ec.unmarshalOAccountFilter2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAccountFilter(ctx, v) + data, err := ec.unmarshalOAccountFilter2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAccountFilter(ctx, v) if err != nil { return it, err } + it.ToAccountFilter = data case "TransferTypes": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("TransferTypes")) - it.TransferTypes, err = ec.unmarshalOTransferType2ᚕcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐTransferType(ctx, v) + data, err := ec.unmarshalOTransferType2ᚕcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐTransferType(ctx, v) if err != nil { return it, err } + it.TransferTypes = data case "TransferId": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("TransferId")) - it.TransferId, err = ec.unmarshalOID2ᚖstring(ctx, v) + data, err := ec.unmarshalOID2ᚖstring(ctx, v) if err != nil { return it, err } + it.TransferId = data } } @@ -103768,29 +104262,26 @@ func (ec *executionContext) unmarshalInputOrderByMarketAndPartyIdsFilter(ctx con } switch k { case "order": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("order")) - it.Order, err = ec.unmarshalOOrderFilter2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐOrderFilter(ctx, v) + data, err := ec.unmarshalOOrderFilter2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐOrderFilter(ctx, v) if err != nil { return it, err } + it.Order = data case "marketIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("marketIds")) - it.MarketIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.MarketIds = data case "partyIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("partyIds")) - it.PartyIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.PartyIds = data } } @@ -103812,21 +104303,19 @@ func (ec *executionContext) unmarshalInputOrderByMarketIdsFilter(ctx context.Con } switch k { case "order": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("order")) - it.Order, err = ec.unmarshalOOrderFilter2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐOrderFilter(ctx, v) + data, err := ec.unmarshalOOrderFilter2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐOrderFilter(ctx, v) if err != nil { return it, err } + it.Order = data case "marketIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("marketIds")) - it.MarketIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.MarketIds = data } } @@ -103848,21 +104337,19 @@ func (ec *executionContext) unmarshalInputOrderByPartyIdsFilter(ctx context.Cont } switch k { case "order": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("order")) - it.Order, err = ec.unmarshalOOrderFilter2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐOrderFilter(ctx, v) + data, err := ec.unmarshalOOrderFilter2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐOrderFilter(ctx, v) if err != nil { return it, err } + it.Order = data case "partyIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("partyIds")) - it.PartyIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.PartyIds = data } } @@ -103884,8 +104371,6 @@ func (ec *executionContext) unmarshalInputOrderFilter(ctx context.Context, obj i } switch k { case "status": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("status")) data, err := ec.unmarshalOOrderStatus2ᚕcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐOrder_Statusᚄ(ctx, v) if err != nil { @@ -103895,16 +104380,13 @@ func (ec *executionContext) unmarshalInputOrderFilter(ctx context.Context, obj i return it, err } case "types": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("types")) - it.Types, err = ec.unmarshalOOrderType2ᚕcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐOrder_Typeᚄ(ctx, v) + data, err := ec.unmarshalOOrderType2ᚕcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐOrder_Typeᚄ(ctx, v) if err != nil { return it, err } + it.Types = data case "timeInForce": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("timeInForce")) data, err := ec.unmarshalOOrderTimeInForce2ᚕcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐOrder_TimeInForceᚄ(ctx, v) if err != nil { @@ -103914,29 +104396,26 @@ func (ec *executionContext) unmarshalInputOrderFilter(ctx context.Context, obj i return it, err } case "dateRange": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("dateRange")) - it.DateRange, err = ec.unmarshalODateRange2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐDateRange(ctx, v) + data, err := ec.unmarshalODateRange2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐDateRange(ctx, v) if err != nil { return it, err } + it.DateRange = data case "excludeLiquidity": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("excludeLiquidity")) - it.ExcludeLiquidity, err = ec.unmarshalOBoolean2bool(ctx, v) + data, err := ec.unmarshalOBoolean2bool(ctx, v) if err != nil { return it, err } + it.ExcludeLiquidity = data case "liveOnly": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("liveOnly")) - it.LiveOnly, err = ec.unmarshalOBoolean2ᚖbool(ctx, v) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } + it.LiveOnly = data } } @@ -103958,24 +104437,20 @@ func (ec *executionContext) unmarshalInputOrderInfo(ctx context.Context, obj int } switch k { case "side": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("side")) - it.Side, err = ec.unmarshalNSide2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐSide(ctx, v) + data, err := ec.unmarshalNSide2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐSide(ctx, v) if err != nil { return it, err } + it.Side = data case "price": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("price")) - it.Price, err = ec.unmarshalNString2string(ctx, v) + data, err := ec.unmarshalNString2string(ctx, v) if err != nil { return it, err } + it.Price = data case "remaining": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("remaining")) data, err := ec.unmarshalNString2string(ctx, v) if err != nil { @@ -103985,13 +104460,12 @@ func (ec *executionContext) unmarshalInputOrderInfo(ctx context.Context, obj int return it, err } case "isMarketOrder": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("isMarketOrder")) - it.IsMarketOrder, err = ec.unmarshalNBoolean2bool(ctx, v) + data, err := ec.unmarshalNBoolean2bool(ctx, v) if err != nil { return it, err } + it.IsMarketOrder = data } } @@ -104013,37 +104487,33 @@ func (ec *executionContext) unmarshalInputPagination(ctx context.Context, obj in } switch k { case "first": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("first")) - it.First, err = ec.unmarshalOInt2ᚖint32(ctx, v) + data, err := ec.unmarshalOInt2ᚖint32(ctx, v) if err != nil { return it, err } + it.First = data case "after": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("after")) - it.After, err = ec.unmarshalOString2ᚖstring(ctx, v) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } + it.After = data case "last": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("last")) - it.Last, err = ec.unmarshalOInt2ᚖint32(ctx, v) + data, err := ec.unmarshalOInt2ᚖint32(ctx, v) if err != nil { return it, err } + it.Last = data case "before": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("before")) - it.Before, err = ec.unmarshalOString2ᚖstring(ctx, v) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) if err != nil { return it, err } + it.Before = data } } @@ -104065,21 +104535,19 @@ func (ec *executionContext) unmarshalInputPositionsFilter(ctx context.Context, o } switch k { case "partyIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("partyIds")) - it.PartyIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.PartyIds = data case "marketIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("marketIds")) - it.MarketIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.MarketIds = data } } @@ -104101,24 +104569,20 @@ func (ec *executionContext) unmarshalInputRewardSummaryFilter(ctx context.Contex } switch k { case "assetIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("assetIds")) - it.AssetIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.AssetIds = data case "marketIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("marketIds")) - it.MarketIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.MarketIds = data case "fromEpoch": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("fromEpoch")) data, err := ec.unmarshalOInt2ᚖint(ctx, v) if err != nil { @@ -104128,8 +104592,6 @@ func (ec *executionContext) unmarshalInputRewardSummaryFilter(ctx context.Contex return it, err } case "toEpoch": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("toEpoch")) data, err := ec.unmarshalOInt2ᚖint(ctx, v) if err != nil { @@ -104159,8 +104621,6 @@ func (ec *executionContext) unmarshalInputStopOrderFilter(ctx context.Context, o } switch k { case "parties": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("parties")) data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { @@ -104170,8 +104630,6 @@ func (ec *executionContext) unmarshalInputStopOrderFilter(ctx context.Context, o return it, err } case "markets": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("markets")) data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { @@ -104181,8 +104639,6 @@ func (ec *executionContext) unmarshalInputStopOrderFilter(ctx context.Context, o return it, err } case "status": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("status")) data, err := ec.unmarshalOStopOrderStatus2ᚕcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐStopOrder_Statusᚄ(ctx, v) if err != nil { @@ -104192,8 +104648,6 @@ func (ec *executionContext) unmarshalInputStopOrderFilter(ctx context.Context, o return it, err } case "expiryStrategy": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("expiryStrategy")) data, err := ec.unmarshalOStopOrderExpiryStrategy2ᚕcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐStopOrder_ExpiryStrategyᚄ(ctx, v) if err != nil { @@ -104203,21 +104657,19 @@ func (ec *executionContext) unmarshalInputStopOrderFilter(ctx context.Context, o return it, err } case "dateRange": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("dateRange")) - it.DateRange, err = ec.unmarshalODateRange2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐDateRange(ctx, v) + data, err := ec.unmarshalODateRange2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐDateRange(ctx, v) if err != nil { return it, err } + it.DateRange = data case "liveOnly": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("liveOnly")) - it.LiveOnly, err = ec.unmarshalOBoolean2ᚖbool(ctx, v) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) if err != nil { return it, err } + it.LiveOnly = data } } @@ -104239,29 +104691,26 @@ func (ec *executionContext) unmarshalInputTradesFilter(ctx context.Context, obj } switch k { case "partyIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("partyIds")) - it.PartyIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.PartyIds = data case "marketIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("marketIds")) - it.MarketIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.MarketIds = data case "orderIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("orderIds")) - it.OrderIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.OrderIds = data } } @@ -104283,21 +104732,19 @@ func (ec *executionContext) unmarshalInputTradesSubscriptionFilter(ctx context.C } switch k { case "partyIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("partyIds")) - it.PartyIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.PartyIds = data case "marketIds": - var err error - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("marketIds")) - it.MarketIds, err = ec.unmarshalOID2ᚕstringᚄ(ctx, v) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) if err != nil { return it, err } + it.MarketIds = data } } @@ -104904,83 +105351,78 @@ var abstractMarginLevelsImplementors = []string{"AbstractMarginLevels"} func (ec *executionContext) _AbstractMarginLevels(ctx context.Context, sel ast.SelectionSet, obj *AbstractMarginLevels) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, abstractMarginLevelsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AbstractMarginLevels") case "market": - out.Values[i] = ec._AbstractMarginLevels_market(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "asset": - out.Values[i] = ec._AbstractMarginLevels_asset(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "maintenanceLevel": - out.Values[i] = ec._AbstractMarginLevels_maintenanceLevel(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "searchLevel": - out.Values[i] = ec._AbstractMarginLevels_searchLevel(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "initialLevel": - out.Values[i] = ec._AbstractMarginLevels_initialLevel(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "orderMarginLevel": - out.Values[i] = ec._AbstractMarginLevels_orderMarginLevel(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "collateralReleaseLevel": - out.Values[i] = ec._AbstractMarginLevels_collateralReleaseLevel(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "marginMode": - out.Values[i] = ec._AbstractMarginLevels_marginMode(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "marginFactor": - out.Values[i] = ec._AbstractMarginLevels_marginFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -104988,23 +105430,22 @@ var accountBalanceImplementors = []string{"AccountBalance"} func (ec *executionContext) _AccountBalance(ctx context.Context, sel ast.SelectionSet, obj *v2.AccountBalance) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, accountBalanceImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AccountBalance") case "balance": - out.Values[i] = ec._AccountBalance_balance(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "asset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105012,26 +105453,40 @@ func (ec *executionContext) _AccountBalance(ctx context.Context, sel ast.Selecti }() res = ec._AccountBalance_asset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "type": + // 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 "type": out.Values[i] = ec._AccountBalance_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "market": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105041,14 +105496,30 @@ func (ec *executionContext) _AccountBalance(ctx context.Context, sel ast.Selecti return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105058,18 +105529,46 @@ func (ec *executionContext) _AccountBalance(ctx context.Context, sel ast.Selecti return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -105077,34 +105576,29 @@ var accountDetailsImplementors = []string{"AccountDetails"} func (ec *executionContext) _AccountDetails(ctx context.Context, sel ast.SelectionSet, obj *vega.AccountDetails) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, accountDetailsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AccountDetails") case "assetId": - out.Values[i] = ec._AccountDetails_assetId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "type": - out.Values[i] = ec._AccountDetails_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marketId": - out.Values[i] = ec._AccountDetails_marketId(ctx, field, obj) - case "partyId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105114,18 +105608,46 @@ func (ec *executionContext) _AccountDetails(ctx context.Context, sel ast.Selecti return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -105133,34 +105655,43 @@ var accountEdgeImplementors = []string{"AccountEdge"} func (ec *executionContext) _AccountEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.AccountEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, accountEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AccountEdge") case "node": - out.Values[i] = ec._AccountEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._AccountEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -105168,23 +105699,22 @@ var accountEventImplementors = []string{"AccountEvent"} func (ec *executionContext) _AccountEvent(ctx context.Context, sel ast.SelectionSet, obj *vega.Account) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, accountEventImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AccountEvent") case "balance": - out.Values[i] = ec._AccountEvent_balance(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "asset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105192,26 +105722,40 @@ func (ec *executionContext) _AccountEvent(ctx context.Context, sel ast.Selection }() res = ec._AccountEvent_asset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "type": + // 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 "type": out.Values[i] = ec._AccountEvent_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "market": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105221,14 +105765,30 @@ func (ec *executionContext) _AccountEvent(ctx context.Context, sel ast.Selection return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105238,18 +105798,46 @@ func (ec *executionContext) _AccountEvent(ctx context.Context, sel ast.Selection return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -105257,23 +105845,22 @@ var accountUpdateImplementors = []string{"AccountUpdate"} func (ec *executionContext) _AccountUpdate(ctx context.Context, sel ast.SelectionSet, obj *v2.AccountBalance) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, accountUpdateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AccountUpdate") case "balance": - out.Values[i] = ec._AccountUpdate_balance(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "assetId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105281,30 +105868,42 @@ func (ec *executionContext) _AccountUpdate(ctx context.Context, sel ast.Selectio }() res = ec._AccountUpdate_assetId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "type": + // 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 "type": out.Values[i] = ec._AccountUpdate_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marketId": - out.Values[i] = ec._AccountUpdate_marketId(ctx, field, obj) - case "partyId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105312,23 +105911,51 @@ func (ec *executionContext) _AccountUpdate(ctx context.Context, sel ast.Selectio }() res = ec._AccountUpdate_partyId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -105336,31 +105963,40 @@ var accountsConnectionImplementors = []string{"AccountsConnection"} func (ec *executionContext) _AccountsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.AccountsConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, accountsConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AccountsConnection") case "edges": - out.Values[i] = ec._AccountsConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._AccountsConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -105368,50 +106004,51 @@ var aggregatedBalanceImplementors = []string{"AggregatedBalance"} func (ec *executionContext) _AggregatedBalance(ctx context.Context, sel ast.SelectionSet, obj *v2.AggregatedBalance) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, aggregatedBalanceImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AggregatedBalance") case "timestamp": - out.Values[i] = ec._AggregatedBalance_timestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "balance": - out.Values[i] = ec._AggregatedBalance_balance(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "partyId": - out.Values[i] = ec._AggregatedBalance_partyId(ctx, field, obj) - case "assetId": - out.Values[i] = ec._AggregatedBalance_assetId(ctx, field, obj) - case "marketId": - out.Values[i] = ec._AggregatedBalance_marketId(ctx, field, obj) - case "accountType": - out.Values[i] = ec._AggregatedBalance_accountType(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -105419,34 +106056,43 @@ var aggregatedBalanceConnectionImplementors = []string{"AggregatedBalanceConnect func (ec *executionContext) _AggregatedBalanceConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.AggregatedBalanceConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, aggregatedBalanceConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AggregatedBalanceConnection") case "edges": - out.Values[i] = ec._AggregatedBalanceConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._AggregatedBalanceConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -105454,34 +106100,43 @@ var aggregatedBalanceEdgeImplementors = []string{"AggregatedBalanceEdge"} func (ec *executionContext) _AggregatedBalanceEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.AggregatedBalanceEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, aggregatedBalanceEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AggregatedBalanceEdge") case "node": - out.Values[i] = ec._AggregatedBalanceEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._AggregatedBalanceEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -105489,34 +106144,43 @@ var aggregatedLedgerEntriesConnectionImplementors = []string{"AggregatedLedgerEn func (ec *executionContext) _AggregatedLedgerEntriesConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.AggregatedLedgerEntriesConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, aggregatedLedgerEntriesConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AggregatedLedgerEntriesConnection") case "edges": - out.Values[i] = ec._AggregatedLedgerEntriesConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._AggregatedLedgerEntriesConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -105524,34 +106188,43 @@ var aggregatedLedgerEntriesEdgeImplementors = []string{"AggregatedLedgerEntriesE func (ec *executionContext) _AggregatedLedgerEntriesEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.AggregatedLedgerEntriesEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, aggregatedLedgerEntriesEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AggregatedLedgerEntriesEdge") case "node": - out.Values[i] = ec._AggregatedLedgerEntriesEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._AggregatedLedgerEntriesEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -105559,8 +106232,9 @@ var aggregatedLedgerEntryImplementors = []string{"AggregatedLedgerEntry"} func (ec *executionContext) _AggregatedLedgerEntry(ctx context.Context, sel ast.SelectionSet, obj *v2.AggregatedLedgerEntry) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, aggregatedLedgerEntryImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -105568,7 +106242,7 @@ func (ec *executionContext) _AggregatedLedgerEntry(ctx context.Context, sel ast. case "vegaTime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105576,83 +106250,87 @@ func (ec *executionContext) _AggregatedLedgerEntry(ctx context.Context, sel ast. }() res = ec._AggregatedLedgerEntry_vegaTime(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "quantity": + // 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 "quantity": out.Values[i] = ec._AggregatedLedgerEntry_quantity(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "assetId": - out.Values[i] = ec._AggregatedLedgerEntry_assetId(ctx, field, obj) - case "transferType": - out.Values[i] = ec._AggregatedLedgerEntry_transferType(ctx, field, obj) - case "fromAccountPartyId": - out.Values[i] = ec._AggregatedLedgerEntry_fromAccountPartyId(ctx, field, obj) - case "toAccountPartyId": - out.Values[i] = ec._AggregatedLedgerEntry_toAccountPartyId(ctx, field, obj) - case "fromAccountMarketId": - out.Values[i] = ec._AggregatedLedgerEntry_fromAccountMarketId(ctx, field, obj) - case "toAccountMarketId": - out.Values[i] = ec._AggregatedLedgerEntry_toAccountMarketId(ctx, field, obj) - case "fromAccountType": - out.Values[i] = ec._AggregatedLedgerEntry_fromAccountType(ctx, field, obj) - case "toAccountType": - out.Values[i] = ec._AggregatedLedgerEntry_toAccountType(ctx, field, obj) - case "fromAccountBalance": - out.Values[i] = ec._AggregatedLedgerEntry_fromAccountBalance(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "toAccountBalance": - out.Values[i] = ec._AggregatedLedgerEntry_toAccountBalance(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "transferId": - out.Values[i] = ec._AggregatedLedgerEntry_transferId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -105660,23 +106338,22 @@ var assetImplementors = []string{"Asset"} func (ec *executionContext) _Asset(ctx context.Context, sel ast.SelectionSet, obj *vega.Asset) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, assetImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Asset") case "id": - out.Values[i] = ec._Asset_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "name": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105684,19 +106361,35 @@ func (ec *executionContext) _Asset(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Asset_name(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "symbol": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105704,19 +106397,35 @@ func (ec *executionContext) _Asset(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Asset_symbol(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "decimals": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105724,19 +106433,35 @@ func (ec *executionContext) _Asset(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Asset_decimals(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "quantum": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105744,19 +106469,35 @@ func (ec *executionContext) _Asset(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Asset_quantum(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "source": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105764,26 +106505,40 @@ func (ec *executionContext) _Asset(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Asset_source(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "status": + // 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 "status": out.Values[i] = ec._Asset_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "infrastructureFeeAccount": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105793,14 +106548,30 @@ func (ec *executionContext) _Asset(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "globalRewardPoolAccount": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105810,14 +106581,30 @@ func (ec *executionContext) _Asset(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "globalInsuranceAccount": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105827,14 +106614,30 @@ func (ec *executionContext) _Asset(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "networkTreasuryAccount": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105844,14 +106647,30 @@ func (ec *executionContext) _Asset(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "takerFeeRewardAccount": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105861,14 +106680,30 @@ func (ec *executionContext) _Asset(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "makerFeeRewardAccount": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105878,14 +106713,30 @@ func (ec *executionContext) _Asset(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "lpFeeRewardAccount": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105895,14 +106746,30 @@ func (ec *executionContext) _Asset(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "marketProposerRewardAccount": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -105912,18 +106779,46 @@ func (ec *executionContext) _Asset(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -105931,34 +106826,43 @@ var assetEdgeImplementors = []string{"AssetEdge"} func (ec *executionContext) _AssetEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.AssetEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, assetEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AssetEdge") case "node": - out.Values[i] = ec._AssetEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._AssetEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -105966,28 +106870,37 @@ var assetsConnectionImplementors = []string{"AssetsConnection"} func (ec *executionContext) _AssetsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.AssetsConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, assetsConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AssetsConnection") case "edges": - out.Values[i] = ec._AssetsConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._AssetsConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -105995,34 +106908,43 @@ var auctionDurationImplementors = []string{"AuctionDuration"} func (ec *executionContext) _AuctionDuration(ctx context.Context, sel ast.SelectionSet, obj *AuctionDuration) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, auctionDurationImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AuctionDuration") case "durationSecs": - out.Values[i] = ec._AuctionDuration_durationSecs(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "volume": - out.Values[i] = ec._AuctionDuration_volume(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -106030,37 +106952,32 @@ var auctionEventImplementors = []string{"AuctionEvent"} func (ec *executionContext) _AuctionEvent(ctx context.Context, sel ast.SelectionSet, obj *v1.AuctionEvent) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, auctionEventImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("AuctionEvent") case "marketId": - out.Values[i] = ec._AuctionEvent_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "leave": - out.Values[i] = ec._AuctionEvent_leave(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "openingAuction": - out.Values[i] = ec._AuctionEvent_openingAuction(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "auctionStart": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -106068,19 +106985,35 @@ func (ec *executionContext) _AuctionEvent(ctx context.Context, sel ast.Selection }() res = ec._AuctionEvent_auctionStart(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "auctionEnd": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -106088,34 +107021,58 @@ func (ec *executionContext) _AuctionEvent(ctx context.Context, sel ast.Selection }() res = ec._AuctionEvent_auctionEnd(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "trigger": + // 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 "trigger": out.Values[i] = ec._AuctionEvent_trigger(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "extensionTrigger": - out.Values[i] = ec._AuctionEvent_extensionTrigger(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -106123,104 +107080,87 @@ var batchProposalImplementors = []string{"BatchProposal", "ProposalNode"} func (ec *executionContext) _BatchProposal(ctx context.Context, sel ast.SelectionSet, obj *BatchProposal) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, batchProposalImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("BatchProposal") case "id": - out.Values[i] = ec._BatchProposal_id(ctx, field, obj) - case "reference": - out.Values[i] = ec._BatchProposal_reference(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "party": - out.Values[i] = ec._BatchProposal_party(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "state": - out.Values[i] = ec._BatchProposal_state(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "datetime": - out.Values[i] = ec._BatchProposal_datetime(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "batchTerms": - out.Values[i] = ec._BatchProposal_batchTerms(ctx, field, obj) - case "rationale": - out.Values[i] = ec._BatchProposal_rationale(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "votes": - out.Values[i] = ec._BatchProposal_votes(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "rejectionReason": - out.Values[i] = ec._BatchProposal_rejectionReason(ctx, field, obj) - case "errorDetails": - out.Values[i] = ec._BatchProposal_errorDetails(ctx, field, obj) - case "requiredMajority": - out.Values[i] = ec._BatchProposal_requiredMajority(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "requiredParticipation": - out.Values[i] = ec._BatchProposal_requiredParticipation(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "requiredLpMajority": - out.Values[i] = ec._BatchProposal_requiredLpMajority(ctx, field, obj) - case "requiredLpParticipation": - out.Values[i] = ec._BatchProposal_requiredLpParticipation(ctx, field, obj) - case "subProposals": - out.Values[i] = ec._BatchProposal_subProposals(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -106228,8 +107168,9 @@ var batchProposalTermsImplementors = []string{"BatchProposalTerms"} func (ec *executionContext) _BatchProposalTerms(ctx context.Context, sel ast.SelectionSet, obj *vega.BatchProposalTerms) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, batchProposalTermsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -106237,7 +107178,7 @@ func (ec *executionContext) _BatchProposalTerms(ctx context.Context, sel ast.Sel case "closingDatetime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -106245,30 +107186,56 @@ func (ec *executionContext) _BatchProposalTerms(ctx context.Context, sel ast.Sel }() res = ec._BatchProposalTerms_closingDatetime(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "changes": + // 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 "changes": out.Values[i] = ec._BatchProposalTerms_changes(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -106276,8 +107243,9 @@ var batchProposalTermsChangeImplementors = []string{"BatchProposalTermsChange"} func (ec *executionContext) _BatchProposalTermsChange(ctx context.Context, sel ast.SelectionSet, obj *vega.BatchProposalTermsChange) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, batchProposalTermsChangeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -106285,7 +107253,7 @@ func (ec *executionContext) _BatchProposalTermsChange(ctx context.Context, sel a case "enactmentDatetime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -106295,14 +107263,63 @@ func (ec *executionContext) _BatchProposalTermsChange(ctx context.Context, sel a return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "validationDatetime": + 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._BatchProposalTermsChange_validationDatetime(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 "change": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -106310,23 +107327,51 @@ func (ec *executionContext) _BatchProposalTermsChange(ctx context.Context, sel a }() res = ec._BatchProposalTermsChange_change(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -106334,8 +107379,9 @@ var benefitTierImplementors = []string{"BenefitTier"} func (ec *executionContext) _BenefitTier(ctx context.Context, sel ast.SelectionSet, obj *vega.BenefitTier) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, benefitTierImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -106343,7 +107389,7 @@ func (ec *executionContext) _BenefitTier(ctx context.Context, sel ast.SelectionS case "minimumEpochs": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -106351,44 +107397,66 @@ func (ec *executionContext) _BenefitTier(ctx context.Context, sel ast.SelectionS }() res = ec._BenefitTier_minimumEpochs(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "minimumRunningNotionalTakerVolume": - out.Values[i] = ec._BenefitTier_minimumRunningNotionalTakerVolume(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "referralDiscountFactor": - out.Values[i] = ec._BenefitTier_referralDiscountFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "referralRewardFactor": - out.Values[i] = ec._BenefitTier_referralRewardFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -106396,27 +107464,38 @@ var builtinAssetImplementors = []string{"BuiltinAsset", "AssetSource"} func (ec *executionContext) _BuiltinAsset(ctx context.Context, sel ast.SelectionSet, obj *BuiltinAsset) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, builtinAssetImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("BuiltinAsset") case "maxFaucetAmountMint": - out.Values[i] = ec._BuiltinAsset_maxFaucetAmountMint(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -106424,48 +107503,53 @@ var busEventImplementors = []string{"BusEvent"} func (ec *executionContext) _BusEvent(ctx context.Context, sel ast.SelectionSet, obj *BusEvent) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, busEventImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("BusEvent") case "id": - out.Values[i] = ec._BusEvent_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "block": - out.Values[i] = ec._BusEvent_block(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "type": - out.Values[i] = ec._BusEvent_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "event": - out.Values[i] = ec._BusEvent_event(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -106473,8 +107557,9 @@ var cancelTransferImplementors = []string{"CancelTransfer", "ProposalChange"} func (ec *executionContext) _CancelTransfer(ctx context.Context, sel ast.SelectionSet, obj *vega.CancelTransfer) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, cancelTransferImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -106482,7 +107567,7 @@ func (ec *executionContext) _CancelTransfer(ctx context.Context, sel ast.Selecti case "transferId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -106490,23 +107575,51 @@ func (ec *executionContext) _CancelTransfer(ctx context.Context, sel ast.Selecti }() res = ec._CancelTransfer_transferId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -106514,8 +107627,9 @@ var candleImplementors = []string{"Candle"} func (ec *executionContext) _Candle(ctx context.Context, sel ast.SelectionSet, obj *v2.Candle) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, candleImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -106523,7 +107637,7 @@ func (ec *executionContext) _Candle(ctx context.Context, sel ast.SelectionSet, o case "periodStart": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -106531,19 +107645,35 @@ func (ec *executionContext) _Candle(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Candle_periodStart(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "lastUpdateInPeriod": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -106551,47 +107681,55 @@ func (ec *executionContext) _Candle(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Candle_lastUpdateInPeriod(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "high": - out.Values[i] = ec._Candle_high(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "low": - out.Values[i] = ec._Candle_low(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "open": - out.Values[i] = ec._Candle_open(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "close": - out.Values[i] = ec._Candle_close(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "volume": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -106599,19 +107737,35 @@ func (ec *executionContext) _Candle(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Candle_volume(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "notional": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -106619,23 +107773,51 @@ func (ec *executionContext) _Candle(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Candle_notional(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -106643,28 +107825,37 @@ var candleDataConnectionImplementors = []string{"CandleDataConnection"} func (ec *executionContext) _CandleDataConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.CandleDataConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, candleDataConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("CandleDataConnection") case "edges": - out.Values[i] = ec._CandleDataConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._CandleDataConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -106672,34 +107863,43 @@ var candleEdgeImplementors = []string{"CandleEdge"} func (ec *executionContext) _CandleEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.CandleEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, candleEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("CandleEdge") case "node": - out.Values[i] = ec._CandleEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._CandleEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -106707,34 +107907,43 @@ var collateralIncreaseEstimateImplementors = []string{"CollateralIncreaseEstimat 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) - var invalids uint32 + 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 { - invalids++ + out.Invalids++ } case "bestCase": - out.Values[i] = ec._CollateralIncreaseEstimate_bestCase(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -106742,23 +107951,22 @@ var compositePriceConfigurationImplementors = []string{"CompositePriceConfigurat 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) - var invalids uint32 + 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(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "decayPower": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -106766,37 +107974,47 @@ func (ec *executionContext) _CompositePriceConfiguration(ctx context.Context, se }() res = ec._CompositePriceConfiguration_decayPower(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "cashAmount": + // 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(&invalids, 1) + 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(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "CompositePriceType": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -106804,23 +108022,37 @@ func (ec *executionContext) _CompositePriceConfiguration(ctx context.Context, se }() res = ec._CompositePriceConfiguration_CompositePriceType(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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) (res graphql.Marshaler) { + 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)) @@ -106830,18 +108062,46 @@ func (ec *executionContext) _CompositePriceConfiguration(ctx context.Context, se return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -106849,41 +108109,48 @@ 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) - var invalids uint32 + 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 { - invalids++ + out.Invalids++ } case "lastUpdated": - out.Values[i] = ec._CompositePriceSource_lastUpdated(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "PriceSource": - out.Values[i] = ec._CompositePriceSource_PriceSource(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -106891,24 +108158,35 @@ 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) - var invalids uint32 + 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() - if invalids > 0 { + 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 } @@ -106916,31 +108194,40 @@ var conditionImplementors = []string{"Condition"} func (ec *executionContext) _Condition(ctx context.Context, sel ast.SelectionSet, obj *Condition) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, conditionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Condition") case "operator": - out.Values[i] = ec._Condition_operator(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "value": - out.Values[i] = ec._Condition_value(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -106948,27 +108235,38 @@ var continuousTradingImplementors = []string{"ContinuousTrading"} func (ec *executionContext) _ContinuousTrading(ctx context.Context, sel ast.SelectionSet, obj *ContinuousTrading) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, continuousTradingImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ContinuousTrading") case "tickSize": - out.Values[i] = ec._ContinuousTrading_tickSize(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -106976,28 +108274,37 @@ var coreSnapshotConnectionImplementors = []string{"CoreSnapshotConnection"} func (ec *executionContext) _CoreSnapshotConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.CoreSnapshotConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, coreSnapshotConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("CoreSnapshotConnection") case "edges": - out.Values[i] = ec._CoreSnapshotConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._CoreSnapshotConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -107005,8 +108312,9 @@ var coreSnapshotDataImplementors = []string{"CoreSnapshotData"} func (ec *executionContext) _CoreSnapshotData(ctx context.Context, sel ast.SelectionSet, obj *v1.CoreSnapshotData) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, coreSnapshotDataImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -107014,7 +108322,7 @@ func (ec *executionContext) _CoreSnapshotData(ctx context.Context, sel ast.Selec case "blockHeight": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107022,26 +108330,40 @@ func (ec *executionContext) _CoreSnapshotData(ctx context.Context, sel ast.Selec }() res = ec._CoreSnapshotData_blockHeight(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "blockHash": - out.Values[i] = ec._CoreSnapshotData_blockHash(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "vegaCoreVersion": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107049,23 +108371,51 @@ func (ec *executionContext) _CoreSnapshotData(ctx context.Context, sel ast.Selec }() res = ec._CoreSnapshotData_vegaCoreVersion(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -107073,34 +108423,43 @@ var coreSnapshotEdgeImplementors = []string{"CoreSnapshotEdge"} func (ec *executionContext) _CoreSnapshotEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.CoreSnapshotEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, coreSnapshotEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("CoreSnapshotEdge") case "node": - out.Values[i] = ec._CoreSnapshotEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._CoreSnapshotEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -107108,23 +108467,22 @@ var currentReferralProgramImplementors = []string{"CurrentReferralProgram"} func (ec *executionContext) _CurrentReferralProgram(ctx context.Context, sel ast.SelectionSet, obj *v2.ReferralProgram) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, currentReferralProgramImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("CurrentReferralProgram") case "id": - out.Values[i] = ec._CurrentReferralProgram_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "version": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107132,33 +108490,45 @@ func (ec *executionContext) _CurrentReferralProgram(ctx context.Context, sel ast }() res = ec._CurrentReferralProgram_version(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "benefitTiers": - out.Values[i] = ec._CurrentReferralProgram_benefitTiers(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "endOfProgramTimestamp": - out.Values[i] = ec._CurrentReferralProgram_endOfProgramTimestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "windowLength": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107166,34 +108536,58 @@ func (ec *executionContext) _CurrentReferralProgram(ctx context.Context, sel ast }() res = ec._CurrentReferralProgram_windowLength(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "stakingTiers": - out.Values[i] = ec._CurrentReferralProgram_stakingTiers(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "endedAt": - out.Values[i] = ec._CurrentReferralProgram_endedAt(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -107201,43 +108595,46 @@ var dataImplementors = []string{"Data"} func (ec *executionContext) _Data(ctx context.Context, sel ast.SelectionSet, obj *Data) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, dataImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Data") case "signers": - out.Values[i] = ec._Data_signers(ctx, field, obj) - case "data": - out.Values[i] = ec._Data_data(ctx, field, obj) - case "metaData": - out.Values[i] = ec._Data_metaData(ctx, field, obj) - case "matchedSpecIds": - out.Values[i] = ec._Data_matchedSpecIds(ctx, field, obj) - case "broadcastAt": - out.Values[i] = ec._Data_broadcastAt(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -107245,8 +108642,9 @@ var dataSourceDefinitionImplementors = []string{"DataSourceDefinition"} func (ec *executionContext) _DataSourceDefinition(ctx context.Context, sel ast.SelectionSet, obj *vega.DataSourceDefinition) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, dataSourceDefinitionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -107254,7 +108652,7 @@ func (ec *executionContext) _DataSourceDefinition(ctx context.Context, sel ast.S case "sourceType": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107262,23 +108660,51 @@ func (ec *executionContext) _DataSourceDefinition(ctx context.Context, sel ast.S }() res = ec._DataSourceDefinition_sourceType(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -107286,8 +108712,9 @@ var dataSourceDefinitionExternalImplementors = []string{"DataSourceDefinitionExt func (ec *executionContext) _DataSourceDefinitionExternal(ctx context.Context, sel ast.SelectionSet, obj *vega.DataSourceDefinitionExternal) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, dataSourceDefinitionExternalImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -107295,7 +108722,7 @@ func (ec *executionContext) _DataSourceDefinitionExternal(ctx context.Context, s case "sourceType": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107303,23 +108730,51 @@ func (ec *executionContext) _DataSourceDefinitionExternal(ctx context.Context, s }() res = ec._DataSourceDefinitionExternal_sourceType(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -107327,8 +108782,9 @@ var dataSourceDefinitionInternalImplementors = []string{"DataSourceDefinitionInt func (ec *executionContext) _DataSourceDefinitionInternal(ctx context.Context, sel ast.SelectionSet, obj *vega.DataSourceDefinitionInternal) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, dataSourceDefinitionInternalImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -107336,7 +108792,7 @@ func (ec *executionContext) _DataSourceDefinitionInternal(ctx context.Context, s case "sourceType": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107344,23 +108800,51 @@ func (ec *executionContext) _DataSourceDefinitionInternal(ctx context.Context, s }() res = ec._DataSourceDefinitionInternal_sourceType(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -107368,52 +108852,55 @@ var dataSourceSpecImplementors = []string{"DataSourceSpec"} func (ec *executionContext) _DataSourceSpec(ctx context.Context, sel ast.SelectionSet, obj *DataSourceSpec) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, dataSourceSpecImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("DataSourceSpec") case "id": - out.Values[i] = ec._DataSourceSpec_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "createdAt": - out.Values[i] = ec._DataSourceSpec_createdAt(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "updatedAt": - out.Values[i] = ec._DataSourceSpec_updatedAt(ctx, field, obj) - case "data": - out.Values[i] = ec._DataSourceSpec_data(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "status": - out.Values[i] = ec._DataSourceSpec_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -107421,8 +108908,9 @@ var dataSourceSpecConfigurationImplementors = []string{"DataSourceSpecConfigurat func (ec *executionContext) _DataSourceSpecConfiguration(ctx context.Context, sel ast.SelectionSet, obj *vega.DataSourceSpecConfiguration) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, dataSourceSpecConfigurationImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -107430,7 +108918,7 @@ func (ec *executionContext) _DataSourceSpecConfiguration(ctx context.Context, se case "signers": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107440,14 +108928,30 @@ func (ec *executionContext) _DataSourceSpecConfiguration(ctx context.Context, se return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "filters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107457,18 +108961,46 @@ func (ec *executionContext) _DataSourceSpecConfiguration(ctx context.Context, se return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -107476,8 +109008,9 @@ var dataSourceSpecConfigurationTimeImplementors = []string{"DataSourceSpecConfig func (ec *executionContext) _DataSourceSpecConfigurationTime(ctx context.Context, sel ast.SelectionSet, obj *vega.DataSourceSpecConfigurationTime) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, dataSourceSpecConfigurationTimeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -107485,7 +109018,7 @@ func (ec *executionContext) _DataSourceSpecConfigurationTime(ctx context.Context case "conditions": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107493,23 +109026,51 @@ func (ec *executionContext) _DataSourceSpecConfigurationTime(ctx context.Context }() res = ec._DataSourceSpecConfigurationTime_conditions(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -107517,8 +109078,9 @@ var dataSourceSpecConfigurationTimeTriggerImplementors = []string{"DataSourceSpe func (ec *executionContext) _DataSourceSpecConfigurationTimeTrigger(ctx context.Context, sel ast.SelectionSet, obj *vega.DataSourceSpecConfigurationTimeTrigger) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, dataSourceSpecConfigurationTimeTriggerImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -107526,7 +109088,7 @@ func (ec *executionContext) _DataSourceSpecConfigurationTimeTrigger(ctx context. case "conditions": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107534,30 +109096,56 @@ func (ec *executionContext) _DataSourceSpecConfigurationTimeTrigger(ctx context. }() res = ec._DataSourceSpecConfigurationTimeTrigger_conditions(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "triggers": - out.Values[i] = ec._DataSourceSpecConfigurationTimeTrigger_triggers(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -107565,34 +109153,43 @@ var dataSourceSpecPerpetualBindingImplementors = []string{"DataSourceSpecPerpetu func (ec *executionContext) _DataSourceSpecPerpetualBinding(ctx context.Context, sel ast.SelectionSet, obj *vega.DataSourceSpecToPerpetualBinding) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, dataSourceSpecPerpetualBindingImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("DataSourceSpecPerpetualBinding") case "settlementDataProperty": - out.Values[i] = ec._DataSourceSpecPerpetualBinding_settlementDataProperty(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "settlementScheduleProperty": - out.Values[i] = ec._DataSourceSpecPerpetualBinding_settlementScheduleProperty(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -107600,34 +109197,43 @@ var dataSourceSpecToFutureBindingImplementors = []string{"DataSourceSpecToFuture func (ec *executionContext) _DataSourceSpecToFutureBinding(ctx context.Context, sel ast.SelectionSet, obj *vega.DataSourceSpecToFutureBinding) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, dataSourceSpecToFutureBindingImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("DataSourceSpecToFutureBinding") case "settlementDataProperty": - out.Values[i] = ec._DataSourceSpecToFutureBinding_settlementDataProperty(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "tradingTerminationProperty": - out.Values[i] = ec._DataSourceSpecToFutureBinding_tradingTerminationProperty(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -107635,23 +109241,22 @@ var delegationImplementors = []string{"Delegation"} func (ec *executionContext) _Delegation(ctx context.Context, sel ast.SelectionSet, obj *vega.Delegation) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, delegationImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Delegation") case "amount": - out.Values[i] = ec._Delegation_amount(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107659,19 +109264,35 @@ func (ec *executionContext) _Delegation(ctx context.Context, sel ast.SelectionSe }() res = ec._Delegation_party(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "node": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107679,19 +109300,35 @@ func (ec *executionContext) _Delegation(ctx context.Context, sel ast.SelectionSe }() res = ec._Delegation_node(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "epoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107699,23 +109336,51 @@ func (ec *executionContext) _Delegation(ctx context.Context, sel ast.SelectionSe }() res = ec._Delegation_epoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -107723,34 +109388,43 @@ var delegationEdgeImplementors = []string{"DelegationEdge"} func (ec *executionContext) _DelegationEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.DelegationEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, delegationEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("DelegationEdge") case "node": - out.Values[i] = ec._DelegationEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._DelegationEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -107758,31 +109432,40 @@ var delegationsConnectionImplementors = []string{"DelegationsConnection"} func (ec *executionContext) _DelegationsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.DelegationsConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, delegationsConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("DelegationsConnection") case "edges": - out.Values[i] = ec._DelegationsConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._DelegationsConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -107790,23 +109473,22 @@ var depositImplementors = []string{"Deposit", "Event"} func (ec *executionContext) _Deposit(ctx context.Context, sel ast.SelectionSet, obj *vega.Deposit) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, depositImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Deposit") case "id": - out.Values[i] = ec._Deposit_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107814,26 +109496,40 @@ func (ec *executionContext) _Deposit(ctx context.Context, sel ast.SelectionSet, }() res = ec._Deposit_party(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "amount": + // 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._Deposit_amount(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "asset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -107841,45 +109537,65 @@ func (ec *executionContext) _Deposit(ctx context.Context, sel ast.SelectionSet, }() res = ec._Deposit_asset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "status": - out.Values[i] = ec._Deposit_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "createdTimestamp": - out.Values[i] = ec._Deposit_createdTimestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "creditedTimestamp": - out.Values[i] = ec._Deposit_creditedTimestamp(ctx, field, obj) - case "txHash": - out.Values[i] = ec._Deposit_txHash(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -107887,34 +109603,43 @@ var depositEdgeImplementors = []string{"DepositEdge"} func (ec *executionContext) _DepositEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.DepositEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, depositEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("DepositEdge") case "node": - out.Values[i] = ec._DepositEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._DepositEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -107922,28 +109647,37 @@ var depositsConnectionImplementors = []string{"DepositsConnection"} func (ec *executionContext) _DepositsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.DepositsConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, depositsConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("DepositsConnection") case "edges": - out.Values[i] = ec._DepositsConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._DepositsConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -107951,34 +109685,43 @@ var discreteTradingImplementors = []string{"DiscreteTrading"} func (ec *executionContext) _DiscreteTrading(ctx context.Context, sel ast.SelectionSet, obj *DiscreteTrading) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, discreteTradingImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("DiscreteTrading") case "duration": - out.Values[i] = ec._DiscreteTrading_duration(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "tickSize": - out.Values[i] = ec._DiscreteTrading_tickSize(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -107986,8 +109729,9 @@ var dispatchStrategyImplementors = []string{"DispatchStrategy"} func (ec *executionContext) _DispatchStrategy(ctx context.Context, sel ast.SelectionSet, obj *vega.DispatchStrategy) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, dispatchStrategyImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -107995,7 +109739,7 @@ func (ec *executionContext) _DispatchStrategy(ctx context.Context, sel ast.Selec case "dispatchMetric": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -108003,19 +109747,35 @@ func (ec *executionContext) _DispatchStrategy(ctx context.Context, sel ast.Selec }() res = ec._DispatchStrategy_dispatchMetric(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "dispatchMetricAssetId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -108023,19 +109783,35 @@ func (ec *executionContext) _DispatchStrategy(ctx context.Context, sel ast.Selec }() res = ec._DispatchStrategy_dispatchMetricAssetId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "marketIdsInScope": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -108045,47 +109821,51 @@ func (ec *executionContext) _DispatchStrategy(ctx context.Context, sel ast.Selec return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "entityScope": - out.Values[i] = ec._DispatchStrategy_entityScope(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "individualScope": - out.Values[i] = ec._DispatchStrategy_individualScope(ctx, field, obj) - case "teamScope": - out.Values[i] = ec._DispatchStrategy_teamScope(ctx, field, obj) - case "nTopPerformers": - out.Values[i] = ec._DispatchStrategy_nTopPerformers(ctx, field, obj) - case "stakingRequirement": - out.Values[i] = ec._DispatchStrategy_stakingRequirement(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "notionalTimeWeightedAveragePositionRequirement": - out.Values[i] = ec._DispatchStrategy_notionalTimeWeightedAveragePositionRequirement(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "windowLength": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -108093,19 +109873,35 @@ func (ec *executionContext) _DispatchStrategy(ctx context.Context, sel ast.Selec }() res = ec._DispatchStrategy_windowLength(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "lockPeriod": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -108113,38 +109909,62 @@ func (ec *executionContext) _DispatchStrategy(ctx context.Context, sel ast.Selec }() res = ec._DispatchStrategy_lockPeriod(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "distributionStrategy": - out.Values[i] = ec._DispatchStrategy_distributionStrategy(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "rankTable": - out.Values[i] = ec._DispatchStrategy_rankTable(ctx, field, obj) - case "capRewardFeeMultiple": - out.Values[i] = ec._DispatchStrategy_capRewardFeeMultiple(ctx, field, obj) - + case "transferInterval": + out.Values[i] = ec._DispatchStrategy_transferInterval(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108152,41 +109972,53 @@ var eRC20Implementors = []string{"ERC20", "AssetSource"} func (ec *executionContext) _ERC20(ctx context.Context, sel ast.SelectionSet, obj *Erc20) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, eRC20Implementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ERC20") case "contractAddress": - out.Values[i] = ec._ERC20_contractAddress(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "lifetimeLimit": - out.Values[i] = ec._ERC20_lifetimeLimit(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "withdrawThreshold": - out.Values[i] = ec._ERC20_withdrawThreshold(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ + } + case "chainId": + out.Values[i] = ec._ERC20_chainId(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108194,37 +110026,32 @@ var eRC20MultiSigSignerAddedBundleImplementors = []string{"ERC20MultiSigSignerAd func (ec *executionContext) _ERC20MultiSigSignerAddedBundle(ctx context.Context, sel ast.SelectionSet, obj *v2.ERC20MultiSigSignerAddedBundle) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, eRC20MultiSigSignerAddedBundleImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ERC20MultiSigSignerAddedBundle") case "newSigner": - out.Values[i] = ec._ERC20MultiSigSignerAddedBundle_newSigner(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "submitter": - out.Values[i] = ec._ERC20MultiSigSignerAddedBundle_submitter(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "nonce": - out.Values[i] = ec._ERC20MultiSigSignerAddedBundle_nonce(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "timestamp": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -108232,37 +110059,66 @@ func (ec *executionContext) _ERC20MultiSigSignerAddedBundle(ctx context.Context, }() res = ec._ERC20MultiSigSignerAddedBundle_timestamp(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "signatures": + // 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 "signatures": out.Values[i] = ec._ERC20MultiSigSignerAddedBundle_signatures(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "epochSeq": - out.Values[i] = ec._ERC20MultiSigSignerAddedBundle_epochSeq(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) + } + case "chainID": + out.Values[i] = ec._ERC20MultiSigSignerAddedBundle_chainID(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108270,34 +110126,43 @@ var eRC20MultiSigSignerAddedBundleEdgeImplementors = []string{"ERC20MultiSigSign func (ec *executionContext) _ERC20MultiSigSignerAddedBundleEdge(ctx context.Context, sel ast.SelectionSet, obj *ERC20MultiSigSignerAddedBundleEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, eRC20MultiSigSignerAddedBundleEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ERC20MultiSigSignerAddedBundleEdge") case "node": - out.Values[i] = ec._ERC20MultiSigSignerAddedBundleEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._ERC20MultiSigSignerAddedBundleEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108305,28 +110170,37 @@ var eRC20MultiSigSignerAddedConnectionImplementors = []string{"ERC20MultiSigSign func (ec *executionContext) _ERC20MultiSigSignerAddedConnection(ctx context.Context, sel ast.SelectionSet, obj *ERC20MultiSigSignerAddedConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, eRC20MultiSigSignerAddedConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ERC20MultiSigSignerAddedConnection") case "edges": - out.Values[i] = ec._ERC20MultiSigSignerAddedConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._ERC20MultiSigSignerAddedConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108334,37 +110208,32 @@ var eRC20MultiSigSignerRemovedBundleImplementors = []string{"ERC20MultiSigSigner func (ec *executionContext) _ERC20MultiSigSignerRemovedBundle(ctx context.Context, sel ast.SelectionSet, obj *v2.ERC20MultiSigSignerRemovedBundle) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, eRC20MultiSigSignerRemovedBundleImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ERC20MultiSigSignerRemovedBundle") case "oldSigner": - out.Values[i] = ec._ERC20MultiSigSignerRemovedBundle_oldSigner(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "submitter": - out.Values[i] = ec._ERC20MultiSigSignerRemovedBundle_submitter(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "nonce": - out.Values[i] = ec._ERC20MultiSigSignerRemovedBundle_nonce(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "timestamp": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -108372,37 +110241,66 @@ func (ec *executionContext) _ERC20MultiSigSignerRemovedBundle(ctx context.Contex }() res = ec._ERC20MultiSigSignerRemovedBundle_timestamp(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "signatures": + // 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 "signatures": out.Values[i] = ec._ERC20MultiSigSignerRemovedBundle_signatures(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "epochSeq": - out.Values[i] = ec._ERC20MultiSigSignerRemovedBundle_epochSeq(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) + } + case "chainID": + out.Values[i] = ec._ERC20MultiSigSignerRemovedBundle_chainID(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108410,34 +110308,43 @@ var eRC20MultiSigSignerRemovedBundleEdgeImplementors = []string{"ERC20MultiSigSi func (ec *executionContext) _ERC20MultiSigSignerRemovedBundleEdge(ctx context.Context, sel ast.SelectionSet, obj *ERC20MultiSigSignerRemovedBundleEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, eRC20MultiSigSignerRemovedBundleEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ERC20MultiSigSignerRemovedBundleEdge") case "node": - out.Values[i] = ec._ERC20MultiSigSignerRemovedBundleEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._ERC20MultiSigSignerRemovedBundleEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108445,28 +110352,37 @@ var eRC20MultiSigSignerRemovedConnectionImplementors = []string{"ERC20MultiSigSi func (ec *executionContext) _ERC20MultiSigSignerRemovedConnection(ctx context.Context, sel ast.SelectionSet, obj *ERC20MultiSigSignerRemovedConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, eRC20MultiSigSignerRemovedConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ERC20MultiSigSignerRemovedConnection") case "edges": - out.Values[i] = ec._ERC20MultiSigSignerRemovedConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._ERC20MultiSigSignerRemovedConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108474,62 +110390,63 @@ var eRC20SetAssetLimitsBundleImplementors = []string{"ERC20SetAssetLimitsBundle" func (ec *executionContext) _ERC20SetAssetLimitsBundle(ctx context.Context, sel ast.SelectionSet, obj *ERC20SetAssetLimitsBundle) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, eRC20SetAssetLimitsBundleImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ERC20SetAssetLimitsBundle") case "assetSource": - out.Values[i] = ec._ERC20SetAssetLimitsBundle_assetSource(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "vegaAssetId": - out.Values[i] = ec._ERC20SetAssetLimitsBundle_vegaAssetId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "nonce": - out.Values[i] = ec._ERC20SetAssetLimitsBundle_nonce(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "lifetimeLimit": - out.Values[i] = ec._ERC20SetAssetLimitsBundle_lifetimeLimit(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "threshold": - out.Values[i] = ec._ERC20SetAssetLimitsBundle_threshold(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "signatures": - out.Values[i] = ec._ERC20SetAssetLimitsBundle_signatures(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108537,24 +110454,35 @@ var eTHAddressImplementors = []string{"ETHAddress", "SignerKind"} func (ec *executionContext) _ETHAddress(ctx context.Context, sel ast.SelectionSet, obj *ETHAddress) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, eTHAddressImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ETHAddress") case "address": - out.Values[i] = ec._ETHAddress_address(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108562,132 +110490,89 @@ var entitiesImplementors = []string{"Entities"} func (ec *executionContext) _Entities(ctx context.Context, sel ast.SelectionSet, obj *v2.ListEntitiesResponse) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, entitiesImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Entities") case "accounts": - out.Values[i] = ec._Entities_accounts(ctx, field, obj) - case "orders": - out.Values[i] = ec._Entities_orders(ctx, field, obj) - case "positions": - out.Values[i] = ec._Entities_positions(ctx, field, obj) - case "ledgerEntries": - out.Values[i] = ec._Entities_ledgerEntries(ctx, field, obj) - case "balanceChanges": - out.Values[i] = ec._Entities_balanceChanges(ctx, field, obj) - case "transfers": - out.Values[i] = ec._Entities_transfers(ctx, field, obj) - case "votes": - out.Values[i] = ec._Entities_votes(ctx, field, obj) - case "erc20MultiSigSignerAddedBundles": - out.Values[i] = ec._Entities_erc20MultiSigSignerAddedBundles(ctx, field, obj) - case "erc20MultiSigSignerRemovedBundles": - out.Values[i] = ec._Entities_erc20MultiSigSignerRemovedBundles(ctx, field, obj) - case "trades": - out.Values[i] = ec._Entities_trades(ctx, field, obj) - case "oracleSpecs": - out.Values[i] = ec._Entities_oracleSpecs(ctx, field, obj) - case "oracleData": - out.Values[i] = ec._Entities_oracleData(ctx, field, obj) - case "markets": - out.Values[i] = ec._Entities_markets(ctx, field, obj) - case "parties": - out.Values[i] = ec._Entities_parties(ctx, field, obj) - case "marginLevels": - out.Values[i] = ec._Entities_marginLevels(ctx, field, obj) - case "rewards": - out.Values[i] = ec._Entities_rewards(ctx, field, obj) - case "deposits": - out.Values[i] = ec._Entities_deposits(ctx, field, obj) - case "withdrawals": - out.Values[i] = ec._Entities_withdrawals(ctx, field, obj) - case "assets": - out.Values[i] = ec._Entities_assets(ctx, field, obj) - case "liquidityProvisions": - out.Values[i] = ec._Entities_liquidityProvisions(ctx, field, obj) - case "proposals": - out.Values[i] = ec._Entities_proposals(ctx, field, obj) - case "delegations": - out.Values[i] = ec._Entities_delegations(ctx, field, obj) - case "nodes": - out.Values[i] = ec._Entities_nodes(ctx, field, obj) - case "nodeSignatures": - out.Values[i] = ec._Entities_nodeSignatures(ctx, field, obj) - case "networkParameters": - out.Values[i] = ec._Entities_networkParameters(ctx, field, obj) - case "keyRotations": - out.Values[i] = ec._Entities_keyRotations(ctx, field, obj) - case "ethereumKeyRotations": - out.Values[i] = ec._Entities_ethereumKeyRotations(ctx, field, obj) - case "protocolUpgradeProposals": - out.Values[i] = ec._Entities_protocolUpgradeProposals(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108695,8 +110580,9 @@ var epochImplementors = []string{"Epoch"} func (ec *executionContext) _Epoch(ctx context.Context, sel ast.SelectionSet, obj *vega.Epoch) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, epochImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -108704,7 +110590,7 @@ func (ec *executionContext) _Epoch(ctx context.Context, sel ast.SelectionSet, ob case "id": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -108712,26 +110598,40 @@ func (ec *executionContext) _Epoch(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Epoch_id(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "timestamps": + // 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 "timestamps": out.Values[i] = ec._Epoch_timestamps(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "validatorsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -108741,14 +110641,30 @@ func (ec *executionContext) _Epoch(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "delegationsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -108758,18 +110674,46 @@ func (ec *executionContext) _Epoch(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -108777,41 +110721,48 @@ var epochDataImplementors = []string{"EpochData"} func (ec *executionContext) _EpochData(ctx context.Context, sel ast.SelectionSet, obj *vega.EpochData) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, epochDataImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("EpochData") case "total": - out.Values[i] = ec._EpochData_total(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "offline": - out.Values[i] = ec._EpochData_offline(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "online": - out.Values[i] = ec._EpochData_online(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108819,36 +110770,41 @@ var epochParticipationImplementors = []string{"EpochParticipation"} func (ec *executionContext) _EpochParticipation(ctx context.Context, sel ast.SelectionSet, obj *EpochParticipation) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, epochParticipationImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("EpochParticipation") case "epoch": - out.Values[i] = ec._EpochParticipation_epoch(ctx, field, obj) - case "offline": - out.Values[i] = ec._EpochParticipation_offline(ctx, field, obj) - case "online": - out.Values[i] = ec._EpochParticipation_online(ctx, field, obj) - case "totalRewards": - out.Values[i] = ec._EpochParticipation_totalRewards(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108856,8 +110812,9 @@ var epochRewardSummaryImplementors = []string{"EpochRewardSummary"} func (ec *executionContext) _EpochRewardSummary(ctx context.Context, sel ast.SelectionSet, obj *vega.EpochRewardSummary) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, epochRewardSummaryImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -108865,7 +110822,7 @@ func (ec *executionContext) _EpochRewardSummary(ctx context.Context, sel ast.Sel case "epoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -108873,30 +110830,42 @@ func (ec *executionContext) _EpochRewardSummary(ctx context.Context, sel ast.Sel }() res = ec._EpochRewardSummary_epoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "marketId": + // 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 "marketId": out.Values[i] = ec._EpochRewardSummary_marketId(ctx, field, obj) - case "assetId": - out.Values[i] = ec._EpochRewardSummary_assetId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "rewardType": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -108904,30 +110873,56 @@ func (ec *executionContext) _EpochRewardSummary(ctx context.Context, sel ast.Sel }() res = ec._EpochRewardSummary_rewardType(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "amount": + // 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._EpochRewardSummary_amount(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108935,28 +110930,37 @@ var epochRewardSummaryConnectionImplementors = []string{"EpochRewardSummaryConne func (ec *executionContext) _EpochRewardSummaryConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.EpochRewardSummaryConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, epochRewardSummaryConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("EpochRewardSummaryConnection") case "edges": - out.Values[i] = ec._EpochRewardSummaryConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._EpochRewardSummaryConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108964,34 +110968,43 @@ var epochRewardSummaryEdgeImplementors = []string{"EpochRewardSummaryEdge"} func (ec *executionContext) _EpochRewardSummaryEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.EpochRewardSummaryEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, epochRewardSummaryEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("EpochRewardSummaryEdge") case "node": - out.Values[i] = ec._EpochRewardSummaryEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._EpochRewardSummaryEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -108999,8 +111012,9 @@ var epochTimestampsImplementors = []string{"EpochTimestamps"} func (ec *executionContext) _EpochTimestamps(ctx context.Context, sel ast.SelectionSet, obj *vega.EpochTimestamps) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, epochTimestampsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -109008,7 +111022,7 @@ func (ec *executionContext) _EpochTimestamps(ctx context.Context, sel ast.Select case "start": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109018,14 +111032,30 @@ func (ec *executionContext) _EpochTimestamps(ctx context.Context, sel ast.Select return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "expiry": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109035,14 +111065,30 @@ func (ec *executionContext) _EpochTimestamps(ctx context.Context, sel ast.Select return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "end": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109052,14 +111098,30 @@ func (ec *executionContext) _EpochTimestamps(ctx context.Context, sel ast.Select return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "firstBlock": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109067,19 +111129,35 @@ func (ec *executionContext) _EpochTimestamps(ctx context.Context, sel ast.Select }() res = ec._EpochTimestamps_firstBlock(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "lastBlock": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109089,18 +111167,46 @@ func (ec *executionContext) _EpochTimestamps(ctx context.Context, sel ast.Select return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -109108,23 +111214,22 @@ var equityLikeShareWeightPerMarketImplementors = []string{"EquityLikeShareWeight func (ec *executionContext) _EquityLikeShareWeightPerMarket(ctx context.Context, sel ast.SelectionSet, obj *vega.VoteELSPair) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, equityLikeShareWeightPerMarketImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("EquityLikeShareWeightPerMarket") case "marketId": - out.Values[i] = ec._EquityLikeShareWeightPerMarket_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "equityLikeShareWeight": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109132,23 +111237,51 @@ func (ec *executionContext) _EquityLikeShareWeightPerMarket(ctx context.Context, }() res = ec._EquityLikeShareWeightPerMarket_equityLikeShareWeight(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -109156,48 +111289,53 @@ var erc20ListAssetBundleImplementors = []string{"Erc20ListAssetBundle"} func (ec *executionContext) _Erc20ListAssetBundle(ctx context.Context, sel ast.SelectionSet, obj *Erc20ListAssetBundle) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, erc20ListAssetBundleImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Erc20ListAssetBundle") case "assetSource": - out.Values[i] = ec._Erc20ListAssetBundle_assetSource(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "vegaAssetId": - out.Values[i] = ec._Erc20ListAssetBundle_vegaAssetId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "nonce": - out.Values[i] = ec._Erc20ListAssetBundle_nonce(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "signatures": - out.Values[i] = ec._Erc20ListAssetBundle_signatures(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -109205,62 +111343,68 @@ var erc20WithdrawalApprovalImplementors = []string{"Erc20WithdrawalApproval"} func (ec *executionContext) _Erc20WithdrawalApproval(ctx context.Context, sel ast.SelectionSet, obj *Erc20WithdrawalApproval) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, erc20WithdrawalApprovalImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Erc20WithdrawalApproval") case "assetSource": - out.Values[i] = ec._Erc20WithdrawalApproval_assetSource(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "amount": - out.Values[i] = ec._Erc20WithdrawalApproval_amount(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "nonce": - out.Values[i] = ec._Erc20WithdrawalApproval_nonce(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "signatures": - out.Values[i] = ec._Erc20WithdrawalApproval_signatures(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "targetAddress": - out.Values[i] = ec._Erc20WithdrawalApproval_targetAddress(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "creation": - out.Values[i] = ec._Erc20WithdrawalApproval_creation(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ + } + case "sourceChainId": + out.Values[i] = ec._Erc20WithdrawalApproval_sourceChainId(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -109268,27 +111412,38 @@ var erc20WithdrawalDetailsImplementors = []string{"Erc20WithdrawalDetails", "Wit func (ec *executionContext) _Erc20WithdrawalDetails(ctx context.Context, sel ast.SelectionSet, obj *Erc20WithdrawalDetails) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, erc20WithdrawalDetailsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Erc20WithdrawalDetails") case "receiverAddress": - out.Values[i] = ec._Erc20WithdrawalDetails_receiverAddress(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -109296,34 +111451,43 @@ var estimatedTransferFeeImplementors = []string{"EstimatedTransferFee"} func (ec *executionContext) _EstimatedTransferFee(ctx context.Context, sel ast.SelectionSet, obj *v2.EstimateTransferFeeResponse) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, estimatedTransferFeeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("EstimatedTransferFee") case "fee": - out.Values[i] = ec._EstimatedTransferFee_fee(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "discount": - out.Values[i] = ec._EstimatedTransferFee_discount(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -109331,23 +111495,22 @@ var ethCallSpecImplementors = []string{"EthCallSpec", "ExternalDataSourceKind"} func (ec *executionContext) _EthCallSpec(ctx context.Context, sel ast.SelectionSet, obj *vega.EthCallSpec) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, ethCallSpecImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("EthCallSpec") case "address": - out.Values[i] = ec._EthCallSpec_address(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "abi": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109357,21 +111520,35 @@ func (ec *executionContext) _EthCallSpec(ctx context.Context, sel ast.SelectionS return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "method": + // 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 "method": out.Values[i] = ec._EthCallSpec_method(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "args": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109381,14 +111558,30 @@ func (ec *executionContext) _EthCallSpec(ctx context.Context, sel ast.SelectionS return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "trigger": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109396,19 +111589,35 @@ func (ec *executionContext) _EthCallSpec(ctx context.Context, sel ast.SelectionS }() res = ec._EthCallSpec_trigger(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "requiredConfirmations": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109416,19 +111625,35 @@ func (ec *executionContext) _EthCallSpec(ctx context.Context, sel ast.SelectionS }() res = ec._EthCallSpec_requiredConfirmations(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "normalisers": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109438,14 +111663,30 @@ func (ec *executionContext) _EthCallSpec(ctx context.Context, sel ast.SelectionS return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "filters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109455,14 +111696,30 @@ func (ec *executionContext) _EthCallSpec(ctx context.Context, sel ast.SelectionS return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "sourceChainId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109470,23 +111727,51 @@ func (ec *executionContext) _EthCallSpec(ctx context.Context, sel ast.SelectionS }() res = ec._EthCallSpec_sourceChainId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -109494,27 +111779,38 @@ var ethCallTriggerImplementors = []string{"EthCallTrigger"} func (ec *executionContext) _EthCallTrigger(ctx context.Context, sel ast.SelectionSet, obj *EthCallTrigger) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, ethCallTriggerImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("EthCallTrigger") case "trigger": - out.Values[i] = ec._EthCallTrigger_trigger(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -109522,32 +111818,39 @@ var ethTimeTriggerImplementors = []string{"EthTimeTrigger", "TriggerKind"} func (ec *executionContext) _EthTimeTrigger(ctx context.Context, sel ast.SelectionSet, obj *EthTimeTrigger) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, ethTimeTriggerImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("EthTimeTrigger") case "initial": - out.Values[i] = ec._EthTimeTrigger_initial(ctx, field, obj) - case "every": - out.Values[i] = ec._EthTimeTrigger_every(ctx, field, obj) - case "until": - out.Values[i] = ec._EthTimeTrigger_until(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -109555,34 +111858,43 @@ var ethereumEventImplementors = []string{"EthereumEvent", "Oracle"} func (ec *executionContext) _EthereumEvent(ctx context.Context, sel ast.SelectionSet, obj *EthereumEvent) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, ethereumEventImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("EthereumEvent") case "contractId": - out.Values[i] = ec._EthereumEvent_contractId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "event": - out.Values[i] = ec._EthereumEvent_event(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -109590,37 +111902,32 @@ var ethereumKeyRotationImplementors = []string{"EthereumKeyRotation"} func (ec *executionContext) _EthereumKeyRotation(ctx context.Context, sel ast.SelectionSet, obj *v1.EthereumKeyRotation) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, ethereumKeyRotationImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("EthereumKeyRotation") case "nodeId": - out.Values[i] = ec._EthereumKeyRotation_nodeId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "oldAddress": - out.Values[i] = ec._EthereumKeyRotation_oldAddress(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "newAddress": - out.Values[i] = ec._EthereumKeyRotation_newAddress(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "blockHeight": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109628,23 +111935,51 @@ func (ec *executionContext) _EthereumKeyRotation(ctx context.Context, sel ast.Se }() res = ec._EthereumKeyRotation_blockHeight(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -109652,31 +111987,40 @@ var ethereumKeyRotationEdgeImplementors = []string{"EthereumKeyRotationEdge"} func (ec *executionContext) _EthereumKeyRotationEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.EthereumKeyRotationEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, ethereumKeyRotationEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("EthereumKeyRotationEdge") case "node": - out.Values[i] = ec._EthereumKeyRotationEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._EthereumKeyRotationEdge_cursor(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -109684,31 +112028,40 @@ var ethereumKeyRotationsConnectionImplementors = []string{"EthereumKeyRotationsC func (ec *executionContext) _EthereumKeyRotationsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.EthereumKeyRotationsConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, ethereumKeyRotationsConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("EthereumKeyRotationsConnection") case "edges": - out.Values[i] = ec._EthereumKeyRotationsConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._EthereumKeyRotationsConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -109716,27 +112069,38 @@ var externalDataImplementors = []string{"ExternalData"} func (ec *executionContext) _ExternalData(ctx context.Context, sel ast.SelectionSet, obj *ExternalData) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, externalDataImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ExternalData") case "data": - out.Values[i] = ec._ExternalData_data(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -109744,27 +112108,38 @@ var externalDataSourceSpecImplementors = []string{"ExternalDataSourceSpec"} func (ec *executionContext) _ExternalDataSourceSpec(ctx context.Context, sel ast.SelectionSet, obj *ExternalDataSourceSpec) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, externalDataSourceSpecImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ExternalDataSourceSpec") case "spec": - out.Values[i] = ec._ExternalDataSourceSpec_spec(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -109772,34 +112147,43 @@ var feeEstimateImplementors = []string{"FeeEstimate"} func (ec *executionContext) _FeeEstimate(ctx context.Context, sel ast.SelectionSet, obj *FeeEstimate) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, feeEstimateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("FeeEstimate") case "fees": - out.Values[i] = ec._FeeEstimate_fees(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalFeeAmount": - out.Values[i] = ec._FeeEstimate_totalFeeAmount(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -109807,41 +112191,48 @@ var feeFactorsImplementors = []string{"FeeFactors"} func (ec *executionContext) _FeeFactors(ctx context.Context, sel ast.SelectionSet, obj *vega.FeeFactors) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, feeFactorsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("FeeFactors") case "makerFee": - out.Values[i] = ec._FeeFactors_makerFee(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "infrastructureFee": - out.Values[i] = ec._FeeFactors_infrastructureFee(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "liquidityFee": - out.Values[i] = ec._FeeFactors_liquidityFee(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -109849,31 +112240,40 @@ var feesImplementors = []string{"Fees"} func (ec *executionContext) _Fees(ctx context.Context, sel ast.SelectionSet, obj *vega.Fees) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, feesImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Fees") case "factors": - out.Values[i] = ec._Fees_factors(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "liquidityFeeSettings": - out.Values[i] = ec._Fees_liquidityFeeSettings(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -109881,8 +112281,9 @@ var feesStatsImplementors = []string{"FeesStats"} func (ec *executionContext) _FeesStats(ctx context.Context, sel ast.SelectionSet, obj *v1.FeesStats) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, feesStatsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -109890,7 +112291,7 @@ func (ec *executionContext) _FeesStats(ctx context.Context, sel ast.SelectionSet case "marketId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109898,19 +112299,35 @@ func (ec *executionContext) _FeesStats(ctx context.Context, sel ast.SelectionSet }() res = ec._FeesStats_marketId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "assetId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109918,19 +112335,35 @@ func (ec *executionContext) _FeesStats(ctx context.Context, sel ast.SelectionSet }() res = ec._FeesStats_assetId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "epoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -109938,65 +112371,81 @@ func (ec *executionContext) _FeesStats(ctx context.Context, sel ast.SelectionSet }() res = ec._FeesStats_epoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "totalRewardsReceived": + // 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 "totalRewardsReceived": out.Values[i] = ec._FeesStats_totalRewardsReceived(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "referrerRewardsGenerated": - out.Values[i] = ec._FeesStats_referrerRewardsGenerated(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "refereesDiscountApplied": - out.Values[i] = ec._FeesStats_refereesDiscountApplied(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "volumeDiscountApplied": - out.Values[i] = ec._FeesStats_volumeDiscountApplied(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "totalMakerFeesReceived": - out.Values[i] = ec._FeesStats_totalMakerFeesReceived(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "makerFeesGenerated": - out.Values[i] = ec._FeesStats_makerFeesGenerated(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110004,55 +112453,58 @@ var feesStatsForPartyImplementors = []string{"FeesStatsForParty"} func (ec *executionContext) _FeesStatsForParty(ctx context.Context, sel ast.SelectionSet, obj *v2.FeesStatsForParty) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, feesStatsForPartyImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("FeesStatsForParty") case "assetId": - out.Values[i] = ec._FeesStatsForParty_assetId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalRewardsReceived": - out.Values[i] = ec._FeesStatsForParty_totalRewardsReceived(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "refereesDiscountApplied": - out.Values[i] = ec._FeesStatsForParty_refereesDiscountApplied(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "volumeDiscountApplied": - out.Values[i] = ec._FeesStatsForParty_volumeDiscountApplied(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalMakerFeesReceived": - out.Values[i] = ec._FeesStatsForParty_totalMakerFeesReceived(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110060,31 +112512,40 @@ var filterImplementors = []string{"Filter"} func (ec *executionContext) _Filter(ctx context.Context, sel ast.SelectionSet, obj *Filter) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, filterImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Filter") case "key": - out.Values[i] = ec._Filter_key(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "conditions": - out.Values[i] = ec._Filter_conditions(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110092,30 +112553,27 @@ var fundingPaymentImplementors = []string{"FundingPayment"} func (ec *executionContext) _FundingPayment(ctx context.Context, sel ast.SelectionSet, obj *v2.FundingPayment) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, fundingPaymentImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("FundingPayment") case "marketId": - out.Values[i] = ec._FundingPayment_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "partyId": - out.Values[i] = ec._FundingPayment_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "fundingPeriodSeq": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -110123,34 +112581,58 @@ func (ec *executionContext) _FundingPayment(ctx context.Context, sel ast.Selecti }() res = ec._FundingPayment_fundingPeriodSeq(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "amount": + // 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._FundingPayment_amount(ctx, field, obj) - case "timestamp": - out.Values[i] = ec._FundingPayment_timestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110158,34 +112640,43 @@ var fundingPaymentConnectionImplementors = []string{"FundingPaymentConnection"} func (ec *executionContext) _FundingPaymentConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.FundingPaymentConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, fundingPaymentConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("FundingPaymentConnection") case "edges": - out.Values[i] = ec._FundingPaymentConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._FundingPaymentConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110193,34 +112684,43 @@ var fundingPaymentEdgeImplementors = []string{"FundingPaymentEdge"} func (ec *executionContext) _FundingPaymentEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.FundingPaymentEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, fundingPaymentEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("FundingPaymentEdge") case "node": - out.Values[i] = ec._FundingPaymentEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._FundingPaymentEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110228,23 +112728,22 @@ var fundingPeriodImplementors = []string{"FundingPeriod"} func (ec *executionContext) _FundingPeriod(ctx context.Context, sel ast.SelectionSet, obj *v1.FundingPeriod) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, fundingPeriodImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("FundingPeriod") case "marketId": - out.Values[i] = ec._FundingPeriod_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "seq": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -110252,19 +112751,35 @@ func (ec *executionContext) _FundingPeriod(ctx context.Context, sel ast.Selectio }() res = ec._FundingPeriod_seq(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "startTime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -110272,19 +112787,35 @@ func (ec *executionContext) _FundingPeriod(ctx context.Context, sel ast.Selectio }() res = ec._FundingPeriod_startTime(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "endTime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -110294,34 +112825,54 @@ func (ec *executionContext) _FundingPeriod(ctx context.Context, sel ast.Selectio return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "fundingPayment": + // 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 "fundingPayment": out.Values[i] = ec._FundingPeriod_fundingPayment(ctx, field, obj) - case "fundingRate": - out.Values[i] = ec._FundingPeriod_fundingRate(ctx, field, obj) - case "externalTwap": - out.Values[i] = ec._FundingPeriod_externalTwap(ctx, field, obj) - case "internalTwap": - out.Values[i] = ec._FundingPeriod_internalTwap(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110329,34 +112880,43 @@ var fundingPeriodConnectionImplementors = []string{"FundingPeriodConnection"} func (ec *executionContext) _FundingPeriodConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.FundingPeriodConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, fundingPeriodConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("FundingPeriodConnection") case "edges": - out.Values[i] = ec._FundingPeriodConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._FundingPeriodConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110364,23 +112924,22 @@ var fundingPeriodDataPointImplementors = []string{"FundingPeriodDataPoint"} func (ec *executionContext) _FundingPeriodDataPoint(ctx context.Context, sel ast.SelectionSet, obj *v1.FundingPeriodDataPoint) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, fundingPeriodDataPointImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("FundingPeriodDataPoint") case "marketId": - out.Values[i] = ec._FundingPeriodDataPoint_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "seq": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -110388,19 +112947,35 @@ func (ec *executionContext) _FundingPeriodDataPoint(ctx context.Context, sel ast }() res = ec._FundingPeriodDataPoint_seq(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "dataPointSource": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -110410,36 +112985,58 @@ func (ec *executionContext) _FundingPeriodDataPoint(ctx context.Context, sel ast return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "price": + // 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 "price": out.Values[i] = ec._FundingPeriodDataPoint_price(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "twap": - out.Values[i] = ec._FundingPeriodDataPoint_twap(ctx, field, obj) - case "timestamp": - out.Values[i] = ec._FundingPeriodDataPoint_timestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110447,34 +113044,43 @@ var fundingPeriodDataPointConnectionImplementors = []string{"FundingPeriodDataPo func (ec *executionContext) _FundingPeriodDataPointConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.FundingPeriodDataPointConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, fundingPeriodDataPointConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("FundingPeriodDataPointConnection") case "edges": - out.Values[i] = ec._FundingPeriodDataPointConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._FundingPeriodDataPointConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110482,34 +113088,43 @@ var fundingPeriodDataPointEdgeImplementors = []string{"FundingPeriodDataPointEdg func (ec *executionContext) _FundingPeriodDataPointEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.FundingPeriodDataPointEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, fundingPeriodDataPointEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("FundingPeriodDataPointEdge") case "node": - out.Values[i] = ec._FundingPeriodDataPointEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._FundingPeriodDataPointEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110517,34 +113132,43 @@ var fundingPeriodEdgeImplementors = []string{"FundingPeriodEdge"} func (ec *executionContext) _FundingPeriodEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.FundingPeriodEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, fundingPeriodEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("FundingPeriodEdge") case "node": - out.Values[i] = ec._FundingPeriodEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._FundingPeriodEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110552,8 +113176,9 @@ var futureImplementors = []string{"Future", "Product"} func (ec *executionContext) _Future(ctx context.Context, sel ast.SelectionSet, obj *vega.Future) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, futureImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -110561,7 +113186,7 @@ func (ec *executionContext) _Future(ctx context.Context, sel ast.SelectionSet, o case "settlementAsset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -110569,26 +113194,40 @@ func (ec *executionContext) _Future(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Future_settlementAsset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "quoteName": + // 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._Future_quoteName(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "dataSourceSpecForSettlementData": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -110596,19 +113235,35 @@ func (ec *executionContext) _Future(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Future_dataSourceSpecForSettlementData(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "dataSourceSpecForTradingTermination": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -110616,30 +113271,56 @@ func (ec *executionContext) _Future(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Future_dataSourceSpecForTradingTermination(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "dataSourceSpecBinding": + // 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 "dataSourceSpecBinding": out.Values[i] = ec._Future_dataSourceSpecBinding(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110647,8 +113328,9 @@ 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) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -110656,7 +113338,7 @@ func (ec *executionContext) _FutureProduct(ctx context.Context, sel ast.Selectio case "settlementAsset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -110664,51 +113346,71 @@ func (ec *executionContext) _FutureProduct(ctx context.Context, sel ast.Selectio }() res = ec._FutureProduct_settlementAsset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "dataSourceSpecForSettlementData": - out.Values[i] = ec._FutureProduct_dataSourceSpecForSettlementData(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "dataSourceSpecForTradingTermination": - out.Values[i] = ec._FutureProduct_dataSourceSpecForTradingTermination(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "dataSourceSpecBinding": - out.Values[i] = ec._FutureProduct_dataSourceSpecBinding(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110716,23 +113418,22 @@ 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) - var invalids uint32 + 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(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "epoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -110740,19 +113441,35 @@ func (ec *executionContext) _Game(ctx context.Context, sel ast.SelectionSet, obj }() res = ec._Game_epoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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) (res graphql.Marshaler) { + 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)) @@ -110760,19 +113477,35 @@ func (ec *executionContext) _Game(ctx context.Context, sel ast.SelectionSet, obj }() res = ec._Game_numberOfParticipants(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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) (res graphql.Marshaler) { + 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)) @@ -110780,30 +113513,56 @@ func (ec *executionContext) _Game(ctx context.Context, sel ast.SelectionSet, obj }() res = ec._Game_entities(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "rewardAssetId": + // 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(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110811,34 +113570,43 @@ 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) - var invalids uint32 + 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 { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._GameEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110846,28 +113614,37 @@ var gamesConnectionImplementors = []string{"GamesConnection"} func (ec *executionContext) _GamesConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.GamesConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, gamesConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("GamesConnection") case "edges": - out.Values[i] = ec._GamesConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._GamesConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110875,41 +113652,48 @@ var historySegmentImplementors = []string{"HistorySegment"} func (ec *executionContext) _HistorySegment(ctx context.Context, sel ast.SelectionSet, obj *v2.HistorySegment) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, historySegmentImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("HistorySegment") case "fromHeight": - out.Values[i] = ec._HistorySegment_fromHeight(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "toHeight": - out.Values[i] = ec._HistorySegment_toHeight(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "historySegmentId": - out.Values[i] = ec._HistorySegment_historySegmentId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -110917,8 +113701,9 @@ var icebergOrderImplementors = []string{"IcebergOrder"} func (ec *executionContext) _IcebergOrder(ctx context.Context, sel ast.SelectionSet, obj *vega.IcebergOrder) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, icebergOrderImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -110926,7 +113711,7 @@ func (ec *executionContext) _IcebergOrder(ctx context.Context, sel ast.Selection case "peakSize": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -110934,19 +113719,35 @@ func (ec *executionContext) _IcebergOrder(ctx context.Context, sel ast.Selection }() res = ec._IcebergOrder_peakSize(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "minimumVisibleSize": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -110954,19 +113755,35 @@ func (ec *executionContext) _IcebergOrder(ctx context.Context, sel ast.Selection }() res = ec._IcebergOrder_minimumVisibleSize(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "reservedRemaining": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -110974,23 +113791,51 @@ func (ec *executionContext) _IcebergOrder(ctx context.Context, sel ast.Selection }() res = ec._IcebergOrder_reservedRemaining(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -110998,76 +113843,73 @@ var individualGameEntityImplementors = []string{"IndividualGameEntity", "GameEnt func (ec *executionContext) _IndividualGameEntity(ctx context.Context, sel ast.SelectionSet, obj *IndividualGameEntity) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, individualGameEntityImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("IndividualGameEntity") case "individual": - out.Values[i] = ec._IndividualGameEntity_individual(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "rank": - out.Values[i] = ec._IndividualGameEntity_rank(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "volume": - out.Values[i] = ec._IndividualGameEntity_volume(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "rewardMetric": - out.Values[i] = ec._IndividualGameEntity_rewardMetric(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "rewardEarned": - out.Values[i] = ec._IndividualGameEntity_rewardEarned(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalRewardsEarned": - out.Values[i] = ec._IndividualGameEntity_totalRewardsEarned(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "rewardEarnedQuantum": - out.Values[i] = ec._IndividualGameEntity_rewardEarnedQuantum(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalRewardsEarnedQuantum": - out.Values[i] = ec._IndividualGameEntity_totalRewardsEarnedQuantum(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111075,44 +113917,37 @@ var instrumentImplementors = []string{"Instrument"} func (ec *executionContext) _Instrument(ctx context.Context, sel ast.SelectionSet, obj *vega.Instrument) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, instrumentImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Instrument") case "id": - out.Values[i] = ec._Instrument_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "code": - out.Values[i] = ec._Instrument_code(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "name": - out.Values[i] = ec._Instrument_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "metadata": - out.Values[i] = ec._Instrument_metadata(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "product": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -111120,23 +113955,51 @@ func (ec *executionContext) _Instrument(ctx context.Context, sel ast.SelectionSe }() res = ec._Instrument_product(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -111144,30 +114007,27 @@ var instrumentConfigurationImplementors = []string{"InstrumentConfiguration"} func (ec *executionContext) _InstrumentConfiguration(ctx context.Context, sel ast.SelectionSet, obj *vega.InstrumentConfiguration) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, instrumentConfigurationImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("InstrumentConfiguration") case "name": - out.Values[i] = ec._InstrumentConfiguration_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "code": - out.Values[i] = ec._InstrumentConfiguration_code(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "futureProduct": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -111177,14 +114037,30 @@ func (ec *executionContext) _InstrumentConfiguration(ctx context.Context, sel as return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "product": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -111194,18 +114070,46 @@ func (ec *executionContext) _InstrumentConfiguration(ctx context.Context, sel as return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -111213,24 +114117,35 @@ var instrumentMetadataImplementors = []string{"InstrumentMetadata"} func (ec *executionContext) _InstrumentMetadata(ctx context.Context, sel ast.SelectionSet, obj *vega.InstrumentMetadata) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, instrumentMetadataImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("InstrumentMetadata") case "tags": - out.Values[i] = ec._InstrumentMetadata_tags(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111238,28 +114153,37 @@ var internalTimeTriggerImplementors = []string{"InternalTimeTrigger"} func (ec *executionContext) _InternalTimeTrigger(ctx context.Context, sel ast.SelectionSet, obj *v13.InternalTimeTrigger) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, internalTimeTriggerImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("InternalTimeTrigger") case "initial": - out.Values[i] = ec._InternalTimeTrigger_initial(ctx, field, obj) - case "every": - out.Values[i] = ec._InternalTimeTrigger_every(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111267,37 +114191,32 @@ var keyRotationImplementors = []string{"KeyRotation"} func (ec *executionContext) _KeyRotation(ctx context.Context, sel ast.SelectionSet, obj *v1.KeyRotation) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, keyRotationImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("KeyRotation") case "nodeId": - out.Values[i] = ec._KeyRotation_nodeId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "oldPubKey": - out.Values[i] = ec._KeyRotation_oldPubKey(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "newPubKey": - out.Values[i] = ec._KeyRotation_newPubKey(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "blockHeight": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -111305,23 +114224,51 @@ func (ec *executionContext) _KeyRotation(ctx context.Context, sel ast.SelectionS }() res = ec._KeyRotation_blockHeight(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -111329,31 +114276,40 @@ var keyRotationConnectionImplementors = []string{"KeyRotationConnection"} func (ec *executionContext) _KeyRotationConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.KeyRotationConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, keyRotationConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("KeyRotationConnection") case "edges": - out.Values[i] = ec._KeyRotationConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._KeyRotationConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111361,34 +114317,43 @@ var keyRotationEdgeImplementors = []string{"KeyRotationEdge"} func (ec *executionContext) _KeyRotationEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.KeyRotationEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, keyRotationEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("KeyRotationEdge") case "node": - out.Values[i] = ec._KeyRotationEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._KeyRotationEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111396,8 +114361,9 @@ var ledgerEntryImplementors = []string{"LedgerEntry"} func (ec *executionContext) _LedgerEntry(ctx context.Context, sel ast.SelectionSet, obj *vega.LedgerEntry) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, ledgerEntryImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -111405,7 +114371,7 @@ func (ec *executionContext) _LedgerEntry(ctx context.Context, sel ast.SelectionS case "fromAccountId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -111413,19 +114379,35 @@ func (ec *executionContext) _LedgerEntry(ctx context.Context, sel ast.SelectionS }() res = ec._LedgerEntry_fromAccountId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "toAccountId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -111433,58 +114415,76 @@ func (ec *executionContext) _LedgerEntry(ctx context.Context, sel ast.SelectionS }() res = ec._LedgerEntry_toAccountId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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._LedgerEntry_amount(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "type": - out.Values[i] = ec._LedgerEntry_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "timestamp": - out.Values[i] = ec._LedgerEntry_timestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "fromAccountBalance": - out.Values[i] = ec._LedgerEntry_fromAccountBalance(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "toAccountBalance": - out.Values[i] = ec._LedgerEntry_toAccountBalance(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111492,34 +114492,43 @@ var liquidationEstimateImplementors = []string{"LiquidationEstimate"} func (ec *executionContext) _LiquidationEstimate(ctx context.Context, sel ast.SelectionSet, obj *v2.LiquidationEstimate) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidationEstimateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidationEstimate") case "worstCase": - out.Values[i] = ec._LiquidationEstimate_worstCase(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "bestCase": - out.Values[i] = ec._LiquidationEstimate_bestCase(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111527,41 +114536,48 @@ var liquidationPriceImplementors = []string{"LiquidationPrice"} func (ec *executionContext) _LiquidationPrice(ctx context.Context, sel ast.SelectionSet, obj *v2.LiquidationPrice) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidationPriceImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidationPrice") case "open_volume_only": - out.Values[i] = ec._LiquidationPrice_open_volume_only(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "including_buy_orders": - out.Values[i] = ec._LiquidationPrice_including_buy_orders(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "including_sell_orders": - out.Values[i] = ec._LiquidationPrice_including_sell_orders(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111569,30 +114585,27 @@ var liquidationStrategyImplementors = []string{"LiquidationStrategy"} func (ec *executionContext) _LiquidationStrategy(ctx context.Context, sel ast.SelectionSet, obj *vega.LiquidationStrategy) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidationStrategyImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidationStrategy") case "disposalTimeStep": - out.Values[i] = ec._LiquidationStrategy_disposalTimeStep(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "disposalFraction": - out.Values[i] = ec._LiquidationStrategy_disposalFraction(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "fullDisposalSize": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -111600,30 +114613,61 @@ func (ec *executionContext) _LiquidationStrategy(ctx context.Context, sel ast.Se }() res = ec._LiquidationStrategy_fullDisposalSize(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "maxFractionConsumed": + // 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 "maxFractionConsumed": out.Values[i] = ec._LiquidationStrategy_maxFractionConsumed(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) + } + case "disposalSlippageRange": + out.Values[i] = ec._LiquidationStrategy_disposalSlippageRange(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111631,31 +114675,40 @@ var liquidityFeeSettingsImplementors = []string{"LiquidityFeeSettings"} func (ec *executionContext) _LiquidityFeeSettings(ctx context.Context, sel ast.SelectionSet, obj *vega.LiquidityFeeSettings) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityFeeSettingsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityFeeSettings") case "method": - out.Values[i] = ec._LiquidityFeeSettings_method(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "feeConstant": - out.Values[i] = ec._LiquidityFeeSettings_feeConstant(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111663,27 +114716,38 @@ var liquidityMonitoringParametersImplementors = []string{"LiquidityMonitoringPar func (ec *executionContext) _LiquidityMonitoringParameters(ctx context.Context, sel ast.SelectionSet, obj *LiquidityMonitoringParameters) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityMonitoringParametersImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityMonitoringParameters") case "targetStakeParameters": - out.Values[i] = ec._LiquidityMonitoringParameters_targetStakeParameters(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111691,41 +114755,48 @@ var liquidityOrderImplementors = []string{"LiquidityOrder"} func (ec *executionContext) _LiquidityOrder(ctx context.Context, sel ast.SelectionSet, obj *vega.LiquidityOrder) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityOrderImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityOrder") case "reference": - out.Values[i] = ec._LiquidityOrder_reference(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "proportion": - out.Values[i] = ec._LiquidityOrder_proportion(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "offset": - out.Values[i] = ec._LiquidityOrder_offset(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111733,8 +114804,9 @@ var liquidityOrderReferenceImplementors = []string{"LiquidityOrderReference"} func (ec *executionContext) _LiquidityOrderReference(ctx context.Context, sel ast.SelectionSet, obj *vega.LiquidityOrderReference) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityOrderReferenceImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -111742,7 +114814,7 @@ func (ec *executionContext) _LiquidityOrderReference(ctx context.Context, sel as case "order": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -111752,25 +114824,51 @@ func (ec *executionContext) _LiquidityOrderReference(ctx context.Context, sel as return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "liquidityOrder": + // 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 "liquidityOrder": out.Values[i] = ec._LiquidityOrderReference_liquidityOrder(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111778,30 +114876,27 @@ var liquidityProviderImplementors = []string{"LiquidityProvider"} func (ec *executionContext) _LiquidityProvider(ctx context.Context, sel ast.SelectionSet, obj *v2.LiquidityProvider) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityProviderImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityProvider") case "partyId": - out.Values[i] = ec._LiquidityProvider_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marketId": - out.Values[i] = ec._LiquidityProvider_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "feeShare": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -111811,14 +114906,30 @@ func (ec *executionContext) _LiquidityProvider(ctx context.Context, sel ast.Sele return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "sla": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -111828,18 +114939,46 @@ func (ec *executionContext) _LiquidityProvider(ctx context.Context, sel ast.Sele return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -111847,31 +114986,40 @@ var liquidityProviderConnectionImplementors = []string{"LiquidityProviderConnect func (ec *executionContext) _LiquidityProviderConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.LiquidityProviderConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityProviderConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityProviderConnection") case "edges": - out.Values[i] = ec._LiquidityProviderConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._LiquidityProviderConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111879,34 +115027,43 @@ var liquidityProviderEdgeImplementors = []string{"LiquidityProviderEdge"} func (ec *executionContext) _LiquidityProviderEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.LiquidityProviderEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityProviderEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityProviderEdge") case "node": - out.Values[i] = ec._LiquidityProviderEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._LiquidityProviderEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111914,55 +115071,58 @@ var liquidityProviderFeeShareImplementors = []string{"LiquidityProviderFeeShare" func (ec *executionContext) _LiquidityProviderFeeShare(ctx context.Context, sel ast.SelectionSet, obj *LiquidityProviderFeeShare) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityProviderFeeShareImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityProviderFeeShare") case "party": - out.Values[i] = ec._LiquidityProviderFeeShare_party(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "equityLikeShare": - out.Values[i] = ec._LiquidityProviderFeeShare_equityLikeShare(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "averageEntryValuation": - out.Values[i] = ec._LiquidityProviderFeeShare_averageEntryValuation(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "averageScore": - out.Values[i] = ec._LiquidityProviderFeeShare_averageScore(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "virtualStake": - out.Values[i] = ec._LiquidityProviderFeeShare_virtualStake(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -111970,80 +115130,75 @@ var liquidityProviderSLAImplementors = []string{"LiquidityProviderSLA"} func (ec *executionContext) _LiquidityProviderSLA(ctx context.Context, sel ast.SelectionSet, obj *LiquidityProviderSLA) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityProviderSLAImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityProviderSLA") case "party": - out.Values[i] = ec._LiquidityProviderSLA_party(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "currentEpochFractionOfTimeOnBook": - out.Values[i] = ec._LiquidityProviderSLA_currentEpochFractionOfTimeOnBook(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "lastEpochFractionOfTimeOnBook": - out.Values[i] = ec._LiquidityProviderSLA_lastEpochFractionOfTimeOnBook(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "lastEpochFeePenalty": - out.Values[i] = ec._LiquidityProviderSLA_lastEpochFeePenalty(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "lastEpochBondPenalty": - out.Values[i] = ec._LiquidityProviderSLA_lastEpochBondPenalty(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "hysteresisPeriodFeePenalties": - out.Values[i] = ec._LiquidityProviderSLA_hysteresisPeriodFeePenalties(ctx, field, obj) - case "requiredLiquidity": - out.Values[i] = ec._LiquidityProviderSLA_requiredLiquidity(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "notionalVolumeBuys": - out.Values[i] = ec._LiquidityProviderSLA_notionalVolumeBuys(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "notionalVolumeSells": - out.Values[i] = ec._LiquidityProviderSLA_notionalVolumeSells(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112051,23 +115206,22 @@ var liquidityProvisionImplementors = []string{"LiquidityProvision"} func (ec *executionContext) _LiquidityProvision(ctx context.Context, sel ast.SelectionSet, obj *vega.LiquidityProvision) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityProvisionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityProvision") case "id": - out.Values[i] = ec._LiquidityProvision_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -112075,30 +115229,42 @@ func (ec *executionContext) _LiquidityProvision(ctx context.Context, sel ast.Sel }() res = ec._LiquidityProvision_party(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "createdAt": + // 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 "createdAt": out.Values[i] = ec._LiquidityProvision_createdAt(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "updatedAt": - out.Values[i] = ec._LiquidityProvision_updatedAt(ctx, field, obj) - case "market": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -112106,47 +115272,55 @@ func (ec *executionContext) _LiquidityProvision(ctx context.Context, sel ast.Sel }() res = ec._LiquidityProvision_market(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "commitmentAmount": - out.Values[i] = ec._LiquidityProvision_commitmentAmount(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "fee": - out.Values[i] = ec._LiquidityProvision_fee(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "sells": - out.Values[i] = ec._LiquidityProvision_sells(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "buys": - out.Values[i] = ec._LiquidityProvision_buys(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "version": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -112154,34 +115328,58 @@ func (ec *executionContext) _LiquidityProvision(ctx context.Context, sel ast.Sel }() res = ec._LiquidityProvision_version(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "status": + // 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 "status": out.Values[i] = ec._LiquidityProvision_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "reference": - out.Values[i] = ec._LiquidityProvision_reference(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112189,76 +115387,59 @@ var liquidityProvisionUpdateImplementors = []string{"LiquidityProvisionUpdate"} func (ec *executionContext) _LiquidityProvisionUpdate(ctx context.Context, sel ast.SelectionSet, obj *vega.LiquidityProvision) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityProvisionUpdateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityProvisionUpdate") case "id": - out.Values[i] = ec._LiquidityProvisionUpdate_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "partyID": - out.Values[i] = ec._LiquidityProvisionUpdate_partyID(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "createdAt": - out.Values[i] = ec._LiquidityProvisionUpdate_createdAt(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "updatedAt": - out.Values[i] = ec._LiquidityProvisionUpdate_updatedAt(ctx, field, obj) - case "marketID": - out.Values[i] = ec._LiquidityProvisionUpdate_marketID(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "commitmentAmount": - out.Values[i] = ec._LiquidityProvisionUpdate_commitmentAmount(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "fee": - out.Values[i] = ec._LiquidityProvisionUpdate_fee(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "sells": - out.Values[i] = ec._LiquidityProvisionUpdate_sells(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "buys": - out.Values[i] = ec._LiquidityProvisionUpdate_buys(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "version": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -112266,34 +115447,58 @@ func (ec *executionContext) _LiquidityProvisionUpdate(ctx context.Context, sel a }() res = ec._LiquidityProvisionUpdate_version(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "status": + // 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 "status": out.Values[i] = ec._LiquidityProvisionUpdate_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "reference": - out.Values[i] = ec._LiquidityProvisionUpdate_reference(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112301,31 +115506,40 @@ var liquidityProvisionWithPendingImplementors = []string{"LiquidityProvisionWith func (ec *executionContext) _LiquidityProvisionWithPending(ctx context.Context, sel ast.SelectionSet, obj *v2.LiquidityProvision) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityProvisionWithPendingImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityProvisionWithPending") case "current": - out.Values[i] = ec._LiquidityProvisionWithPending_current(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pending": - out.Values[i] = ec._LiquidityProvisionWithPending_pending(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112333,34 +115547,43 @@ var liquidityProvisionWithPendingEdgeImplementors = []string{"LiquidityProvision func (ec *executionContext) _LiquidityProvisionWithPendingEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.LiquidityProvisionWithPendingEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityProvisionWithPendingEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityProvisionWithPendingEdge") case "node": - out.Values[i] = ec._LiquidityProvisionWithPendingEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._LiquidityProvisionWithPendingEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112368,31 +115591,40 @@ var liquidityProvisionsConnectionImplementors = []string{"LiquidityProvisionsCon func (ec *executionContext) _LiquidityProvisionsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.LiquidityProvisionsConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityProvisionsConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityProvisionsConnection") case "edges": - out.Values[i] = ec._LiquidityProvisionsConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._LiquidityProvisionsConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112400,34 +115632,43 @@ var liquidityProvisionsEdgeImplementors = []string{"LiquidityProvisionsEdge"} func (ec *executionContext) _LiquidityProvisionsEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.LiquidityProvisionsEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityProvisionsEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityProvisionsEdge") case "node": - out.Values[i] = ec._LiquidityProvisionsEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._LiquidityProvisionsEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112435,31 +115676,40 @@ var liquidityProvisionsWithPendingConnectionImplementors = []string{"LiquidityPr func (ec *executionContext) _LiquidityProvisionsWithPendingConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.LiquidityProvisionsWithPendingConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquidityProvisionsWithPendingConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquidityProvisionsWithPendingConnection") case "edges": - out.Values[i] = ec._LiquidityProvisionsWithPendingConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._LiquidityProvisionsWithPendingConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112467,30 +115717,27 @@ var liquiditySLAParametersImplementors = []string{"LiquiditySLAParameters"} func (ec *executionContext) _LiquiditySLAParameters(ctx context.Context, sel ast.SelectionSet, obj *vega.LiquiditySLAParameters) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, liquiditySLAParametersImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LiquiditySLAParameters") case "priceRange": - out.Values[i] = ec._LiquiditySLAParameters_priceRange(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "commitmentMinTimeFraction": - out.Values[i] = ec._LiquiditySLAParameters_commitmentMinTimeFraction(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "performanceHysteresisEpochs": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -112498,30 +115745,56 @@ func (ec *executionContext) _LiquiditySLAParameters(ctx context.Context, sel ast }() res = ec._LiquiditySLAParameters_performanceHysteresisEpochs(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "slaCompetitionFactor": + // 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 "slaCompetitionFactor": out.Values[i] = ec._LiquiditySLAParameters_slaCompetitionFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112529,41 +115802,48 @@ var logNormalModelParamsImplementors = []string{"LogNormalModelParams"} func (ec *executionContext) _LogNormalModelParams(ctx context.Context, sel ast.SelectionSet, obj *vega.LogNormalModelParams) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, logNormalModelParamsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LogNormalModelParams") case "mu": - out.Values[i] = ec._LogNormalModelParams_mu(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "r": - out.Values[i] = ec._LogNormalModelParams_r(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "sigma": - out.Values[i] = ec._LogNormalModelParams_sigma(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112571,41 +115851,48 @@ var logNormalRiskModelImplementors = []string{"LogNormalRiskModel", "RiskModel"} func (ec *executionContext) _LogNormalRiskModel(ctx context.Context, sel ast.SelectionSet, obj *vega.LogNormalRiskModel) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, logNormalRiskModelImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LogNormalRiskModel") case "riskAversionParameter": - out.Values[i] = ec._LogNormalRiskModel_riskAversionParameter(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "tau": - out.Values[i] = ec._LogNormalRiskModel_tau(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "params": - out.Values[i] = ec._LogNormalRiskModel_params(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112613,41 +115900,48 @@ var lossSocializationImplementors = []string{"LossSocialization"} func (ec *executionContext) _LossSocialization(ctx context.Context, sel ast.SelectionSet, obj *LossSocialization) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, lossSocializationImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("LossSocialization") case "marketId": - out.Values[i] = ec._LossSocialization_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "partyId": - out.Values[i] = ec._LossSocialization_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "amount": - out.Values[i] = ec._LossSocialization_amount(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112655,34 +115949,43 @@ var makerFeesGeneratedImplementors = []string{"MakerFeesGenerated"} func (ec *executionContext) _MakerFeesGenerated(ctx context.Context, sel ast.SelectionSet, obj *v1.MakerFeesGenerated) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, makerFeesGeneratedImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MakerFeesGenerated") case "taker": - out.Values[i] = ec._MakerFeesGenerated_taker(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "makerFeesPaid": - out.Values[i] = ec._MakerFeesGenerated_makerFeesPaid(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112690,27 +115993,38 @@ var marginCalculatorImplementors = []string{"MarginCalculator"} func (ec *executionContext) _MarginCalculator(ctx context.Context, sel ast.SelectionSet, obj *vega.MarginCalculator) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marginCalculatorImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MarginCalculator") case "scalingFactors": - out.Values[i] = ec._MarginCalculator_scalingFactors(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112718,28 +116032,37 @@ var marginConnectionImplementors = []string{"MarginConnection"} func (ec *executionContext) _MarginConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.MarginConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marginConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MarginConnection") case "edges": - out.Values[i] = ec._MarginConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._MarginConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112747,31 +116070,40 @@ var marginEdgeImplementors = []string{"MarginEdge"} func (ec *executionContext) _MarginEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.MarginEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marginEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MarginEdge") case "node": - out.Values[i] = ec._MarginEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._MarginEdge_cursor(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -112779,8 +116111,9 @@ var marginEstimateImplementors = []string{"MarginEstimate"} func (ec *executionContext) _MarginEstimate(ctx context.Context, sel ast.SelectionSet, obj *v2.MarginEstimate) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marginEstimateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -112788,7 +116121,7 @@ func (ec *executionContext) _MarginEstimate(ctx context.Context, sel ast.Selecti case "worstCase": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -112796,19 +116129,35 @@ func (ec *executionContext) _MarginEstimate(ctx context.Context, sel ast.Selecti }() res = ec._MarginEstimate_worstCase(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "bestCase": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -112816,23 +116165,51 @@ func (ec *executionContext) _MarginEstimate(ctx context.Context, sel ast.Selecti }() res = ec._MarginEstimate_bestCase(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -112840,8 +116217,9 @@ var marginLevelsImplementors = []string{"MarginLevels"} func (ec *executionContext) _MarginLevels(ctx context.Context, sel ast.SelectionSet, obj *vega.MarginLevels) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marginLevelsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -112849,7 +116227,7 @@ func (ec *executionContext) _MarginLevels(ctx context.Context, sel ast.Selection case "market": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -112857,19 +116235,35 @@ func (ec *executionContext) _MarginLevels(ctx context.Context, sel ast.Selection }() res = ec._MarginLevels_market(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "asset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -112877,19 +116271,35 @@ func (ec *executionContext) _MarginLevels(ctx context.Context, sel ast.Selection }() res = ec._MarginLevels_asset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -112897,19 +116307,35 @@ func (ec *executionContext) _MarginLevels(ctx context.Context, sel ast.Selection }() res = ec._MarginLevels_party(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "maintenanceLevel": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -112917,26 +116343,40 @@ func (ec *executionContext) _MarginLevels(ctx context.Context, sel ast.Selection }() res = ec._MarginLevels_maintenanceLevel(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "searchLevel": + // 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 "searchLevel": out.Values[i] = ec._MarginLevels_searchLevel(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "initialLevel": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -112944,19 +116384,35 @@ func (ec *executionContext) _MarginLevels(ctx context.Context, sel ast.Selection }() res = ec._MarginLevels_initialLevel(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "orderMarginLevel": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -112964,51 +116420,71 @@ func (ec *executionContext) _MarginLevels(ctx context.Context, sel ast.Selection }() res = ec._MarginLevels_orderMarginLevel(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "collateralReleaseLevel": + // 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 "collateralReleaseLevel": out.Values[i] = ec._MarginLevels_collateralReleaseLevel(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "timestamp": - out.Values[i] = ec._MarginLevels_timestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marginMode": - out.Values[i] = ec._MarginLevels_marginMode(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marginFactor": - out.Values[i] = ec._MarginLevels_marginFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -113016,37 +116492,32 @@ var marginLevelsUpdateImplementors = []string{"MarginLevelsUpdate"} func (ec *executionContext) _MarginLevelsUpdate(ctx context.Context, sel ast.SelectionSet, obj *vega.MarginLevels) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marginLevelsUpdateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MarginLevelsUpdate") case "marketId": - out.Values[i] = ec._MarginLevelsUpdate_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "asset": - out.Values[i] = ec._MarginLevelsUpdate_asset(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "partyId": - out.Values[i] = ec._MarginLevelsUpdate_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "maintenanceLevel": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113054,26 +116525,40 @@ func (ec *executionContext) _MarginLevelsUpdate(ctx context.Context, sel ast.Sel }() res = ec._MarginLevelsUpdate_maintenanceLevel(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "searchLevel": + // 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 "searchLevel": out.Values[i] = ec._MarginLevelsUpdate_searchLevel(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "initialLevel": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113081,19 +116566,35 @@ func (ec *executionContext) _MarginLevelsUpdate(ctx context.Context, sel ast.Sel }() res = ec._MarginLevelsUpdate_initialLevel(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "orderMarginLevel": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113101,51 +116602,71 @@ func (ec *executionContext) _MarginLevelsUpdate(ctx context.Context, sel ast.Sel }() res = ec._MarginLevelsUpdate_orderMarginLevel(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "collateralReleaseLevel": - out.Values[i] = ec._MarginLevelsUpdate_collateralReleaseLevel(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "timestamp": - out.Values[i] = ec._MarginLevelsUpdate_timestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marginMode": - out.Values[i] = ec._MarginLevelsUpdate_marginMode(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marginFactor": - out.Values[i] = ec._MarginLevelsUpdate_marginFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -113153,37 +116674,32 @@ var marketImplementors = []string{"Market"} func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, obj *vega.Market) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marketImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Market") case "id": - out.Values[i] = ec._Market_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "fees": - out.Values[i] = ec._Market_fees(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "tradableInstrument": - out.Values[i] = ec._Market_tradableInstrument(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "decimalPlaces": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113191,26 +116707,40 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Market_decimalPlaces(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "positionDecimalPlaces": + // 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 "positionDecimalPlaces": out.Values[i] = ec._Market_positionDecimalPlaces(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "openingAuction": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113218,19 +116748,35 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Market_openingAuction(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "priceMonitoringSettings": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113238,19 +116784,35 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Market_priceMonitoringSettings(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "liquidityMonitoringParameters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113258,33 +116820,45 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Market_liquidityMonitoringParameters(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "tradingMode": + // 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 "tradingMode": out.Values[i] = ec._Market_tradingMode(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "state": - out.Values[i] = ec._Market_state(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "proposal": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113294,14 +116868,30 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "marketProposal": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113311,14 +116901,30 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "ordersConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113328,14 +116934,30 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "accountsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113345,14 +116967,30 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "tradesConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113362,14 +117000,30 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "depth": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113377,19 +117031,35 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Market_depth(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "candlesConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113399,14 +117069,30 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "data": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113416,14 +117102,30 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "liquidityProvisions": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113433,14 +117135,30 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "liquidityProvisionsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113450,21 +117168,35 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "marketTimestamps": + // 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(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "riskFactors": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113474,40 +117206,46 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "linearSlippageFactor": + // 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(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "quadraticSlippageFactor": - out.Values[i] = ec._Market_quadraticSlippageFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + 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": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113517,36 +117255,58 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "liquidationStrategy": + // 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": 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(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "tickSize": - out.Values[i] = ec._Market_tickSize(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -113554,34 +117314,43 @@ var marketConnectionImplementors = []string{"MarketConnection"} func (ec *executionContext) _MarketConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.MarketConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marketConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MarketConnection") case "edges": - out.Values[i] = ec._MarketConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._MarketConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -113589,8 +117358,9 @@ var marketDataImplementors = []string{"MarketData"} func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSet, obj *vega.MarketData) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marketDataImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -113598,7 +117368,7 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe case "market": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113606,26 +117376,40 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe }() res = ec._MarketData_market(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "markPrice": + // 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 "markPrice": out.Values[i] = ec._MarketData_markPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "markPriceType": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113633,26 +117417,40 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe }() res = ec._MarketData_markPriceType(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "bestBidPrice": + // 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 "bestBidPrice": out.Values[i] = ec._MarketData_bestBidPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "bestBidVolume": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113660,26 +117458,40 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe }() res = ec._MarketData_bestBidVolume(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "bestOfferPrice": + // 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 "bestOfferPrice": out.Values[i] = ec._MarketData_bestOfferPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "bestOfferVolume": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113687,26 +117499,40 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe }() res = ec._MarketData_bestOfferVolume(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "bestStaticBidPrice": + // 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 "bestStaticBidPrice": out.Values[i] = ec._MarketData_bestStaticBidPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "bestStaticBidVolume": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113714,26 +117540,40 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe }() res = ec._MarketData_bestStaticBidVolume(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "bestStaticOfferPrice": + // 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 "bestStaticOfferPrice": out.Values[i] = ec._MarketData_bestStaticOfferPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "bestStaticOfferVolume": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113741,40 +117581,50 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe }() res = ec._MarketData_bestStaticOfferVolume(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "midPrice": + // 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 "midPrice": out.Values[i] = ec._MarketData_midPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "staticMidPrice": - out.Values[i] = ec._MarketData_staticMidPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "timestamp": - out.Values[i] = ec._MarketData_timestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "openInterest": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113782,19 +117632,35 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe }() res = ec._MarketData_openInterest(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "auctionEnd": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113804,14 +117670,30 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "auctionStart": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113821,21 +117703,35 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "indicativePrice": + // 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 "indicativePrice": out.Values[i] = ec._MarketData_indicativePrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "indicativeVolume": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113843,55 +117739,59 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe }() res = ec._MarketData_indicativeVolume(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "marketTradingMode": + // 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 "marketTradingMode": out.Values[i] = ec._MarketData_marketTradingMode(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marketState": - out.Values[i] = ec._MarketData_marketState(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "trigger": - out.Values[i] = ec._MarketData_trigger(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "extensionTrigger": - out.Values[i] = ec._MarketData_extensionTrigger(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "targetStake": - out.Values[i] = ec._MarketData_targetStake(ctx, field, obj) - case "suppliedStake": - out.Values[i] = ec._MarketData_suppliedStake(ctx, field, obj) - case "commitments": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113899,19 +117799,35 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe }() res = ec._MarketData_commitments(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "priceMonitoringBounds": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113921,21 +117837,35 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "marketValueProxy": + // 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 "marketValueProxy": out.Values[i] = ec._MarketData_marketValueProxy(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "liquidityProviderFeeShare": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113945,14 +117875,30 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "liquidityProviderSla": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113962,14 +117908,30 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "nextMarkToMarket": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -113977,33 +117939,45 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe }() res = ec._MarketData_nextMarkToMarket(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "marketGrowth": + // 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 "marketGrowth": out.Values[i] = ec._MarketData_marketGrowth(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "lastTradedPrice": - out.Values[i] = ec._MarketData_lastTradedPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "productData": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114013,14 +117987,30 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "nextNetworkCloseout": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114028,27 +118018,53 @@ func (ec *executionContext) _MarketData(ctx context.Context, sel ast.SelectionSe }() res = ec._MarketData_nextNetworkCloseout(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "markPriceState": + // 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 "markPriceState": out.Values[i] = ec._MarketData_markPriceState(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -114056,28 +118072,37 @@ var marketDataCommitmentsImplementors = []string{"MarketDataCommitments"} func (ec *executionContext) _MarketDataCommitments(ctx context.Context, sel ast.SelectionSet, obj *MarketDataCommitments) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marketDataCommitmentsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MarketDataCommitments") case "sells": - out.Values[i] = ec._MarketDataCommitments_sells(ctx, field, obj) - case "buys": - out.Values[i] = ec._MarketDataCommitments_buys(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -114085,28 +118110,37 @@ var marketDataConnectionImplementors = []string{"MarketDataConnection"} func (ec *executionContext) _MarketDataConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.MarketDataConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marketDataConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MarketDataConnection") case "edges": - out.Values[i] = ec._MarketDataConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._MarketDataConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -114114,31 +118148,40 @@ var marketDataEdgeImplementors = []string{"MarketDataEdge"} func (ec *executionContext) _MarketDataEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.MarketDataEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marketDataEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MarketDataEdge") case "node": - out.Values[i] = ec._MarketDataEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._MarketDataEdge_cursor(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -114146,8 +118189,9 @@ var marketDepthImplementors = []string{"MarketDepth"} func (ec *executionContext) _MarketDepth(ctx context.Context, sel ast.SelectionSet, obj *vega.MarketDepth) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marketDepthImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -114155,7 +118199,7 @@ func (ec *executionContext) _MarketDepth(ctx context.Context, sel ast.SelectionS case "market": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114163,27 +118207,39 @@ func (ec *executionContext) _MarketDepth(ctx context.Context, sel ast.SelectionS }() res = ec._MarketDepth_market(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "buy": + // 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 "buy": out.Values[i] = ec._MarketDepth_buy(ctx, field, obj) - case "sell": - out.Values[i] = ec._MarketDepth_sell(ctx, field, obj) - case "lastTrade": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114193,14 +118249,30 @@ func (ec *executionContext) _MarketDepth(ctx context.Context, sel ast.SelectionS return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "sequenceNumber": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114208,23 +118280,51 @@ func (ec *executionContext) _MarketDepth(ctx context.Context, sel ast.SelectionS }() res = ec._MarketDepth_sequenceNumber(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -114232,41 +118332,48 @@ var marketDepthTradeImplementors = []string{"MarketDepthTrade"} func (ec *executionContext) _MarketDepthTrade(ctx context.Context, sel ast.SelectionSet, obj *MarketDepthTrade) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marketDepthTradeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MarketDepthTrade") case "id": - out.Values[i] = ec._MarketDepthTrade_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "price": - out.Values[i] = ec._MarketDepthTrade_price(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "size": - out.Values[i] = ec._MarketDepthTrade_size(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -114274,8 +118381,9 @@ var marketDepthUpdateImplementors = []string{"MarketDepthUpdate"} func (ec *executionContext) _MarketDepthUpdate(ctx context.Context, sel ast.SelectionSet, obj *vega.MarketDepthUpdate) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marketDepthUpdateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -114283,7 +118391,7 @@ func (ec *executionContext) _MarketDepthUpdate(ctx context.Context, sel ast.Sele case "market": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114291,27 +118399,39 @@ func (ec *executionContext) _MarketDepthUpdate(ctx context.Context, sel ast.Sele }() res = ec._MarketDepthUpdate_market(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "buy": + // 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 "buy": out.Values[i] = ec._MarketDepthUpdate_buy(ctx, field, obj) - case "sell": - out.Values[i] = ec._MarketDepthUpdate_sell(ctx, field, obj) - case "sequenceNumber": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114319,19 +118439,35 @@ func (ec *executionContext) _MarketDepthUpdate(ctx context.Context, sel ast.Sele }() res = ec._MarketDepthUpdate_sequenceNumber(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "previousSequenceNumber": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114339,23 +118475,51 @@ func (ec *executionContext) _MarketDepthUpdate(ctx context.Context, sel ast.Sele }() res = ec._MarketDepthUpdate_previousSequenceNumber(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -114363,34 +118527,43 @@ var marketEdgeImplementors = []string{"MarketEdge"} func (ec *executionContext) _MarketEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.MarketEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marketEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MarketEdge") case "node": - out.Values[i] = ec._MarketEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._MarketEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -114398,34 +118571,43 @@ var marketEventImplementors = []string{"MarketEvent"} func (ec *executionContext) _MarketEvent(ctx context.Context, sel ast.SelectionSet, obj *MarketEvent) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marketEventImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MarketEvent") case "marketId": - out.Values[i] = ec._MarketEvent_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "payload": - out.Values[i] = ec._MarketEvent_payload(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -114433,34 +118615,43 @@ var marketTickImplementors = []string{"MarketTick"} func (ec *executionContext) _MarketTick(ctx context.Context, sel ast.SelectionSet, obj *MarketTick) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marketTickImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MarketTick") case "marketId": - out.Values[i] = ec._MarketTick_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "time": - out.Values[i] = ec._MarketTick_time(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -114468,45 +118659,50 @@ var marketTimestampsImplementors = []string{"MarketTimestamps"} func (ec *executionContext) _MarketTimestamps(ctx context.Context, sel ast.SelectionSet, obj *vega.MarketTimestamps) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, marketTimestampsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("MarketTimestamps") case "proposed": - out.Values[i] = ec._MarketTimestamps_proposed(ctx, field, obj) - case "pending": - out.Values[i] = ec._MarketTimestamps_pending(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "open": - out.Values[i] = ec._MarketTimestamps_open(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "close": - out.Values[i] = ec._MarketTimestamps_close(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -114514,34 +118710,43 @@ var metadataImplementors = []string{"Metadata"} func (ec *executionContext) _Metadata(ctx context.Context, sel ast.SelectionSet, obj *vega.Metadata) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, metadataImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Metadata") case "key": - out.Values[i] = ec._Metadata_key(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "value": - out.Values[i] = ec._Metadata_value(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -114549,69 +118754,68 @@ var networkLimitsImplementors = []string{"NetworkLimits"} func (ec *executionContext) _NetworkLimits(ctx context.Context, sel ast.SelectionSet, obj *vega.NetworkLimits) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, networkLimitsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("NetworkLimits") case "canProposeMarket": - out.Values[i] = ec._NetworkLimits_canProposeMarket(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "canProposeAsset": - out.Values[i] = ec._NetworkLimits_canProposeAsset(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "proposeMarketEnabled": - out.Values[i] = ec._NetworkLimits_proposeMarketEnabled(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "proposeAssetEnabled": - out.Values[i] = ec._NetworkLimits_proposeAssetEnabled(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "genesisLoaded": - out.Values[i] = ec._NetworkLimits_genesisLoaded(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "proposeMarketEnabledFrom": - out.Values[i] = ec._NetworkLimits_proposeMarketEnabledFrom(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "proposeAssetEnabledFrom": - out.Values[i] = ec._NetworkLimits_proposeAssetEnabledFrom(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -114619,34 +118823,43 @@ var networkParameterImplementors = []string{"NetworkParameter"} func (ec *executionContext) _NetworkParameter(ctx context.Context, sel ast.SelectionSet, obj *vega.NetworkParameter) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, networkParameterImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("NetworkParameter") case "key": - out.Values[i] = ec._NetworkParameter_key(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "value": - out.Values[i] = ec._NetworkParameter_value(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -114654,34 +118867,43 @@ var networkParameterEdgeImplementors = []string{"NetworkParameterEdge"} func (ec *executionContext) _NetworkParameterEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.NetworkParameterEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, networkParameterEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("NetworkParameterEdge") case "node": - out.Values[i] = ec._NetworkParameterEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._NetworkParameterEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -114689,31 +118911,40 @@ var networkParametersConnectionImplementors = []string{"NetworkParametersConnect func (ec *executionContext) _NetworkParametersConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.NetworkParameterConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, networkParametersConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("NetworkParametersConnection") case "edges": - out.Values[i] = ec._NetworkParametersConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._NetworkParametersConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -114721,8 +118952,9 @@ var newAssetImplementors = []string{"NewAsset", "ProposalChange"} func (ec *executionContext) _NewAsset(ctx context.Context, sel ast.SelectionSet, obj *vega.NewAsset) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, newAssetImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -114730,7 +118962,7 @@ func (ec *executionContext) _NewAsset(ctx context.Context, sel ast.SelectionSet, case "name": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114738,19 +118970,35 @@ func (ec *executionContext) _NewAsset(ctx context.Context, sel ast.SelectionSet, }() res = ec._NewAsset_name(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "symbol": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114758,19 +119006,35 @@ func (ec *executionContext) _NewAsset(ctx context.Context, sel ast.SelectionSet, }() res = ec._NewAsset_symbol(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "decimals": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114778,19 +119042,35 @@ func (ec *executionContext) _NewAsset(ctx context.Context, sel ast.SelectionSet, }() res = ec._NewAsset_decimals(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "quantum": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114798,19 +119078,35 @@ func (ec *executionContext) _NewAsset(ctx context.Context, sel ast.SelectionSet, }() res = ec._NewAsset_quantum(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "source": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114818,23 +119114,51 @@ func (ec *executionContext) _NewAsset(ctx context.Context, sel ast.SelectionSet, }() res = ec._NewAsset_source(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -114842,8 +119166,9 @@ var newFreeformImplementors = []string{"NewFreeform", "ProposalChange"} func (ec *executionContext) _NewFreeform(ctx context.Context, sel ast.SelectionSet, obj *vega.NewFreeform) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, newFreeformImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -114851,7 +119176,7 @@ func (ec *executionContext) _NewFreeform(ctx context.Context, sel ast.SelectionS case "_doNotUse": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114861,18 +119186,46 @@ func (ec *executionContext) _NewFreeform(ctx context.Context, sel ast.SelectionS return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -114880,8 +119233,9 @@ var newMarketImplementors = []string{"NewMarket", "ProposalChange"} func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet, obj *vega.NewMarket) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, newMarketImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -114889,7 +119243,7 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet case "instrument": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114897,19 +119251,35 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet }() res = ec._NewMarket_instrument(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "decimalPlaces": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114917,19 +119287,35 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet }() res = ec._NewMarket_decimalPlaces(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "riskParameters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114937,19 +119323,35 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet }() res = ec._NewMarket_riskParameters(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "metadata": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114959,14 +119361,30 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "priceMonitoringParameters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114974,19 +119392,35 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet }() res = ec._NewMarket_priceMonitoringParameters(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "liquidityMonitoringParameters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -114994,19 +119428,35 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet }() res = ec._NewMarket_liquidityMonitoringParameters(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "positionDecimalPlaces": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115014,19 +119464,35 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet }() res = ec._NewMarket_positionDecimalPlaces(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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) (res graphql.Marshaler) { + 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)) @@ -115034,19 +119500,35 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet }() res = ec._NewMarket_linearSlippageFactor(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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) (res graphql.Marshaler) { + 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)) @@ -115054,19 +119536,35 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet }() res = ec._NewMarket_quadraticSlippageFactor(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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) (res graphql.Marshaler) { + 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)) @@ -115076,14 +119574,30 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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) (res graphql.Marshaler) { + 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)) @@ -115093,14 +119607,30 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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) (res graphql.Marshaler) { + 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)) @@ -115110,14 +119640,30 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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) (res graphql.Marshaler) { + 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)) @@ -115127,14 +119673,30 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115142,19 +119704,35 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet }() res = ec._NewMarket_markPriceConfiguration(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "tickSize": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115162,23 +119740,51 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet }() res = ec._NewMarket_tickSize(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -115186,8 +119792,9 @@ var newSpotMarketImplementors = []string{"NewSpotMarket", "ProposalChange"} func (ec *executionContext) _NewSpotMarket(ctx context.Context, sel ast.SelectionSet, obj *vega.NewSpotMarket) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, newSpotMarketImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -115195,7 +119802,7 @@ func (ec *executionContext) _NewSpotMarket(ctx context.Context, sel ast.Selectio case "instrument": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115203,39 +119810,71 @@ func (ec *executionContext) _NewSpotMarket(ctx context.Context, sel ast.Selectio }() res = ec._NewSpotMarket_instrument(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "decimal_places": + // 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 "priceDecimalPlaces": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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_decimal_places(ctx, field, obj) + res = ec._NewSpotMarket_priceDecimalPlaces(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "metadata": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115243,19 +119882,35 @@ func (ec *executionContext) _NewSpotMarket(ctx context.Context, sel ast.Selectio }() res = ec._NewSpotMarket_metadata(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "priceMonitoringParameters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115263,19 +119918,35 @@ func (ec *executionContext) _NewSpotMarket(ctx context.Context, sel ast.Selectio }() res = ec._NewSpotMarket_priceMonitoringParameters(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "targetStakeParameters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115283,19 +119954,35 @@ func (ec *executionContext) _NewSpotMarket(ctx context.Context, sel ast.Selectio }() res = ec._NewSpotMarket_targetStakeParameters(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "riskParameters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115305,34 +119992,66 @@ func (ec *executionContext) _NewSpotMarket(ctx context.Context, sel ast.Selectio return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "positionDecimalPlaces": + // 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 "sizeDecimalPlaces": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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_positionDecimalPlaces(ctx, field, obj) + res = ec._NewSpotMarket_sizeDecimalPlaces(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "liquiditySLAParams": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115340,19 +120059,35 @@ func (ec *executionContext) _NewSpotMarket(ctx context.Context, sel ast.Selectio }() res = ec._NewSpotMarket_liquiditySLAParams(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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) (res graphql.Marshaler) { + 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)) @@ -115362,14 +120097,30 @@ func (ec *executionContext) _NewSpotMarket(ctx context.Context, sel ast.Selectio return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "tickSize": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115377,23 +120128,51 @@ func (ec *executionContext) _NewSpotMarket(ctx context.Context, sel ast.Selectio }() res = ec._NewSpotMarket_tickSize(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -115401,8 +120180,9 @@ var newTransferImplementors = []string{"NewTransfer", "ProposalChange"} func (ec *executionContext) _NewTransfer(ctx context.Context, sel ast.SelectionSet, obj *vega.NewTransfer) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, newTransferImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -115410,7 +120190,7 @@ func (ec *executionContext) _NewTransfer(ctx context.Context, sel ast.SelectionS case "source": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115418,19 +120198,35 @@ func (ec *executionContext) _NewTransfer(ctx context.Context, sel ast.SelectionS }() res = ec._NewTransfer_source(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "sourceType": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115438,19 +120234,35 @@ func (ec *executionContext) _NewTransfer(ctx context.Context, sel ast.SelectionS }() res = ec._NewTransfer_sourceType(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "destination": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115458,19 +120270,35 @@ func (ec *executionContext) _NewTransfer(ctx context.Context, sel ast.SelectionS }() res = ec._NewTransfer_destination(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "destinationType": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115478,19 +120306,35 @@ func (ec *executionContext) _NewTransfer(ctx context.Context, sel ast.SelectionS }() res = ec._NewTransfer_destinationType(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "asset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115498,19 +120342,35 @@ func (ec *executionContext) _NewTransfer(ctx context.Context, sel ast.SelectionS }() res = ec._NewTransfer_asset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "fraction_of_balance": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115518,19 +120378,35 @@ func (ec *executionContext) _NewTransfer(ctx context.Context, sel ast.SelectionS }() res = ec._NewTransfer_fraction_of_balance(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115538,19 +120414,35 @@ func (ec *executionContext) _NewTransfer(ctx context.Context, sel ast.SelectionS }() res = ec._NewTransfer_amount(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "transferType": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115558,19 +120450,35 @@ func (ec *executionContext) _NewTransfer(ctx context.Context, sel ast.SelectionS }() res = ec._NewTransfer_transferType(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "kind": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115578,23 +120486,51 @@ func (ec *executionContext) _NewTransfer(ctx context.Context, sel ast.SelectionS }() res = ec._NewTransfer_kind(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -115602,97 +120538,74 @@ var nodeImplementors = []string{"Node"} func (ec *executionContext) _Node(ctx context.Context, sel ast.SelectionSet, obj *vega.Node) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, nodeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Node") case "id": - out.Values[i] = ec._Node_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "pubkey": - out.Values[i] = ec._Node_pubkey(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "tmPubkey": - out.Values[i] = ec._Node_tmPubkey(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "ethereumAddress": - out.Values[i] = ec._Node_ethereumAddress(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "infoUrl": - out.Values[i] = ec._Node_infoUrl(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "location": - out.Values[i] = ec._Node_location(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "stakedByOperator": - out.Values[i] = ec._Node_stakedByOperator(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "stakedByDelegates": - out.Values[i] = ec._Node_stakedByDelegates(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "stakedTotal": - out.Values[i] = ec._Node_stakedTotal(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "pendingStake": - out.Values[i] = ec._Node_pendingStake(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "epochData": - out.Values[i] = ec._Node_epochData(ctx, field, obj) - case "status": - out.Values[i] = ec._Node_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "delegationsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115702,40 +120615,60 @@ func (ec *executionContext) _Node(ctx context.Context, sel ast.SelectionSet, obj return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "rewardScore": - out.Values[i] = ec._Node_rewardScore(ctx, field, obj) - case "rankingScore": - out.Values[i] = ec._Node_rankingScore(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "name": - out.Values[i] = ec._Node_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "avatarUrl": - out.Values[i] = ec._Node_avatarUrl(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -115743,80 +120676,75 @@ var nodeBasicImplementors = []string{"NodeBasic"} func (ec *executionContext) _NodeBasic(ctx context.Context, sel ast.SelectionSet, obj *v2.NodeBasic) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, nodeBasicImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("NodeBasic") case "id": - out.Values[i] = ec._NodeBasic_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pubkey": - out.Values[i] = ec._NodeBasic_pubkey(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "tmPubkey": - out.Values[i] = ec._NodeBasic_tmPubkey(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "ethereumAddress": - out.Values[i] = ec._NodeBasic_ethereumAddress(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "infoUrl": - out.Values[i] = ec._NodeBasic_infoUrl(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "location": - out.Values[i] = ec._NodeBasic_location(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "status": - out.Values[i] = ec._NodeBasic_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "name": - out.Values[i] = ec._NodeBasic_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "avatarUrl": - out.Values[i] = ec._NodeBasic_avatarUrl(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -115824,37 +120752,32 @@ var nodeDataImplementors = []string{"NodeData"} func (ec *executionContext) _NodeData(ctx context.Context, sel ast.SelectionSet, obj *vega.NodeData) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, nodeDataImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("NodeData") case "stakedTotal": - out.Values[i] = ec._NodeData_stakedTotal(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "totalNodes": - out.Values[i] = ec._NodeData_totalNodes(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "inactiveNodes": - out.Values[i] = ec._NodeData_inactiveNodes(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "tendermintNodes": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115862,19 +120785,35 @@ func (ec *executionContext) _NodeData(ctx context.Context, sel ast.SelectionSet, }() res = ec._NodeData_tendermintNodes(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "ersatzNodes": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115884,14 +120823,30 @@ func (ec *executionContext) _NodeData(ctx context.Context, sel ast.SelectionSet, return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "pendingNodes": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115901,14 +120856,30 @@ func (ec *executionContext) _NodeData(ctx context.Context, sel ast.SelectionSet, return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "uptime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -115916,23 +120887,51 @@ func (ec *executionContext) _NodeData(ctx context.Context, sel ast.SelectionSet, }() res = ec._NodeData_uptime(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -115940,34 +120939,43 @@ var nodeEdgeImplementors = []string{"NodeEdge"} func (ec *executionContext) _NodeEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.NodeEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, nodeEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("NodeEdge") case "node": - out.Values[i] = ec._NodeEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._NodeEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -115975,46 +120983,49 @@ var nodeSetImplementors = []string{"NodeSet"} func (ec *executionContext) _NodeSet(ctx context.Context, sel ast.SelectionSet, obj *NodeSet) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, nodeSetImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("NodeSet") case "total": - out.Values[i] = ec._NodeSet_total(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "inactive": - out.Values[i] = ec._NodeSet_inactive(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "promoted": - out.Values[i] = ec._NodeSet_promoted(ctx, field, obj) - case "demoted": - out.Values[i] = ec._NodeSet_demoted(ctx, field, obj) - case "maximum": - out.Values[i] = ec._NodeSet_maximum(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -116022,23 +121033,22 @@ var nodeSignatureImplementors = []string{"NodeSignature"} func (ec *executionContext) _NodeSignature(ctx context.Context, sel ast.SelectionSet, obj *v11.NodeSignature) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, nodeSignatureImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("NodeSignature") case "id": - out.Values[i] = ec._NodeSignature_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "signature": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116048,22 +121058,48 @@ func (ec *executionContext) _NodeSignature(ctx context.Context, sel ast.Selectio return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "kind": + // 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 "kind": out.Values[i] = ec._NodeSignature_kind(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -116071,34 +121107,43 @@ var nodeSignatureEdgeImplementors = []string{"NodeSignatureEdge"} func (ec *executionContext) _NodeSignatureEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.NodeSignatureEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, nodeSignatureEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("NodeSignatureEdge") case "node": - out.Values[i] = ec._NodeSignatureEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._NodeSignatureEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -116106,34 +121151,43 @@ var nodeSignaturesConnectionImplementors = []string{"NodeSignaturesConnection"} func (ec *executionContext) _NodeSignaturesConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.NodeSignaturesConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, nodeSignaturesConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("NodeSignaturesConnection") case "edges": - out.Values[i] = ec._NodeSignaturesConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._NodeSignaturesConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -116141,31 +121195,40 @@ var nodesConnectionImplementors = []string{"NodesConnection"} func (ec *executionContext) _NodesConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.NodesConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, nodesConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("NodesConnection") case "edges": - out.Values[i] = ec._NodesConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._NodesConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -116173,34 +121236,43 @@ var normaliserImplementors = []string{"Normaliser"} func (ec *executionContext) _Normaliser(ctx context.Context, sel ast.SelectionSet, obj *Normaliser) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, normaliserImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Normaliser") case "name": - out.Values[i] = ec._Normaliser_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "expression": - out.Values[i] = ec._Normaliser_expression(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -116208,48 +121280,53 @@ var observableLiquidityProviderFeeShareImplementors = []string{"ObservableLiquid func (ec *executionContext) _ObservableLiquidityProviderFeeShare(ctx context.Context, sel ast.SelectionSet, obj *ObservableLiquidityProviderFeeShare) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, observableLiquidityProviderFeeShareImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ObservableLiquidityProviderFeeShare") case "partyId": - out.Values[i] = ec._ObservableLiquidityProviderFeeShare_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "equityLikeShare": - out.Values[i] = ec._ObservableLiquidityProviderFeeShare_equityLikeShare(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "averageEntryValuation": - out.Values[i] = ec._ObservableLiquidityProviderFeeShare_averageEntryValuation(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "averageScore": - out.Values[i] = ec._ObservableLiquidityProviderFeeShare_averageScore(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -116257,80 +121334,75 @@ var observableLiquidityProviderSLAImplementors = []string{"ObservableLiquidityPr func (ec *executionContext) _ObservableLiquidityProviderSLA(ctx context.Context, sel ast.SelectionSet, obj *ObservableLiquidityProviderSLA) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, observableLiquidityProviderSLAImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ObservableLiquidityProviderSLA") case "party": - out.Values[i] = ec._ObservableLiquidityProviderSLA_party(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "currentEpochFractionOfTimeOnBook": - out.Values[i] = ec._ObservableLiquidityProviderSLA_currentEpochFractionOfTimeOnBook(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "lastEpochFractionOfTimeOnBook": - out.Values[i] = ec._ObservableLiquidityProviderSLA_lastEpochFractionOfTimeOnBook(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "lastEpochFeePenalty": - out.Values[i] = ec._ObservableLiquidityProviderSLA_lastEpochFeePenalty(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "lastEpochBondPenalty": - out.Values[i] = ec._ObservableLiquidityProviderSLA_lastEpochBondPenalty(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "hysteresisPeriodFeePenalties": - out.Values[i] = ec._ObservableLiquidityProviderSLA_hysteresisPeriodFeePenalties(ctx, field, obj) - case "requiredLiquidity": - out.Values[i] = ec._ObservableLiquidityProviderSLA_requiredLiquidity(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "notionalVolumeBuys": - out.Values[i] = ec._ObservableLiquidityProviderSLA_notionalVolumeBuys(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "notionalVolumeSells": - out.Values[i] = ec._ObservableLiquidityProviderSLA_notionalVolumeSells(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -116338,8 +121410,9 @@ var observableMarketDataImplementors = []string{"ObservableMarketData"} func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.SelectionSet, obj *vega.MarketData) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, observableMarketDataImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -116347,7 +121420,7 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S case "marketId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116355,33 +121428,45 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S }() res = ec._ObservableMarketData_marketId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "markPrice": - out.Values[i] = ec._ObservableMarketData_markPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "bestBidPrice": - out.Values[i] = ec._ObservableMarketData_bestBidPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "bestBidVolume": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116389,26 +121474,40 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S }() res = ec._ObservableMarketData_bestBidVolume(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "bestOfferPrice": - out.Values[i] = ec._ObservableMarketData_bestOfferPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "bestOfferVolume": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116416,26 +121515,40 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S }() res = ec._ObservableMarketData_bestOfferVolume(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "bestStaticBidPrice": + // 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 "bestStaticBidPrice": out.Values[i] = ec._ObservableMarketData_bestStaticBidPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "bestStaticBidVolume": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116443,26 +121556,40 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S }() res = ec._ObservableMarketData_bestStaticBidVolume(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "bestStaticOfferPrice": - out.Values[i] = ec._ObservableMarketData_bestStaticOfferPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "bestStaticOfferVolume": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116470,40 +121597,50 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S }() res = ec._ObservableMarketData_bestStaticOfferVolume(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "midPrice": + // 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 "midPrice": out.Values[i] = ec._ObservableMarketData_midPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "staticMidPrice": - out.Values[i] = ec._ObservableMarketData_staticMidPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "timestamp": - out.Values[i] = ec._ObservableMarketData_timestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "openInterest": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116511,19 +121648,35 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S }() res = ec._ObservableMarketData_openInterest(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "auctionEnd": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116533,14 +121686,30 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "auctionStart": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116550,21 +121719,35 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "indicativePrice": - out.Values[i] = ec._ObservableMarketData_indicativePrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "indicativeVolume": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116572,55 +121755,59 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S }() res = ec._ObservableMarketData_indicativeVolume(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "marketTradingMode": + // 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 "marketTradingMode": out.Values[i] = ec._ObservableMarketData_marketTradingMode(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marketState": - out.Values[i] = ec._ObservableMarketData_marketState(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "trigger": - out.Values[i] = ec._ObservableMarketData_trigger(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "extensionTrigger": - out.Values[i] = ec._ObservableMarketData_extensionTrigger(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "targetStake": - out.Values[i] = ec._ObservableMarketData_targetStake(ctx, field, obj) - case "suppliedStake": - out.Values[i] = ec._ObservableMarketData_suppliedStake(ctx, field, obj) - case "priceMonitoringBounds": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116630,21 +121817,35 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "marketValueProxy": + // 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 "marketValueProxy": out.Values[i] = ec._ObservableMarketData_marketValueProxy(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "liquidityProviderFeeShare": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116654,14 +121855,30 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "liquidityProviderSla": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116671,14 +121888,30 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "nextMarkToMarket": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116686,33 +121919,45 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S }() res = ec._ObservableMarketData_nextMarkToMarket(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "marketGrowth": - out.Values[i] = ec._ObservableMarketData_marketGrowth(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "lastTradedPrice": - out.Values[i] = ec._ObservableMarketData_lastTradedPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "productData": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116722,14 +121967,30 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "markPriceType": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116737,27 +121998,53 @@ func (ec *executionContext) _ObservableMarketData(ctx context.Context, sel ast.S }() res = ec._ObservableMarketData_markPriceType(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "markPriceState": - out.Values[i] = ec._ObservableMarketData_markPriceState(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -116765,31 +122052,26 @@ var observableMarketDepthImplementors = []string{"ObservableMarketDepth"} func (ec *executionContext) _ObservableMarketDepth(ctx context.Context, sel ast.SelectionSet, obj *vega.MarketDepth) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, observableMarketDepthImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ObservableMarketDepth") case "marketId": - out.Values[i] = ec._ObservableMarketDepth_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "buy": - out.Values[i] = ec._ObservableMarketDepth_buy(ctx, field, obj) - case "sell": - out.Values[i] = ec._ObservableMarketDepth_sell(ctx, field, obj) - case "lastTrade": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116797,19 +122079,35 @@ func (ec *executionContext) _ObservableMarketDepth(ctx context.Context, sel ast. }() res = ec._ObservableMarketDepth_lastTrade(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "sequenceNumber": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116817,23 +122115,51 @@ func (ec *executionContext) _ObservableMarketDepth(ctx context.Context, sel ast. }() res = ec._ObservableMarketDepth_sequenceNumber(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -116841,31 +122167,26 @@ var observableMarketDepthUpdateImplementors = []string{"ObservableMarketDepthUpd func (ec *executionContext) _ObservableMarketDepthUpdate(ctx context.Context, sel ast.SelectionSet, obj *vega.MarketDepthUpdate) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, observableMarketDepthUpdateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ObservableMarketDepthUpdate") case "marketId": - out.Values[i] = ec._ObservableMarketDepthUpdate_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "buy": - out.Values[i] = ec._ObservableMarketDepthUpdate_buy(ctx, field, obj) - case "sell": - out.Values[i] = ec._ObservableMarketDepthUpdate_sell(ctx, field, obj) - case "sequenceNumber": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116873,19 +122194,35 @@ func (ec *executionContext) _ObservableMarketDepthUpdate(ctx context.Context, se }() res = ec._ObservableMarketDepthUpdate_sequenceNumber(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "previousSequenceNumber": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116893,23 +122230,51 @@ func (ec *executionContext) _ObservableMarketDepthUpdate(ctx context.Context, se }() res = ec._ObservableMarketDepthUpdate_previousSequenceNumber(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -116917,24 +122282,35 @@ var oneOffGovernanceTransferImplementors = []string{"OneOffGovernanceTransfer", func (ec *executionContext) _OneOffGovernanceTransfer(ctx context.Context, sel ast.SelectionSet, obj *v1.OneOffGovernanceTransfer) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, oneOffGovernanceTransferImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("OneOffGovernanceTransfer") case "deliverOn": - out.Values[i] = ec._OneOffGovernanceTransfer_deliverOn(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -116942,24 +122318,35 @@ var oneOffTransferImplementors = []string{"OneOffTransfer", "TransferKind"} func (ec *executionContext) _OneOffTransfer(ctx context.Context, sel ast.SelectionSet, obj *v1.OneOffTransfer) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, oneOffTransferImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("OneOffTransfer") case "deliverOn": - out.Values[i] = ec._OneOffTransfer_deliverOn(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -116967,8 +122354,9 @@ var oracleDataImplementors = []string{"OracleData"} func (ec *executionContext) _OracleData(ctx context.Context, sel ast.SelectionSet, obj *vega.OracleData) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, oracleDataImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -116976,7 +122364,7 @@ func (ec *executionContext) _OracleData(ctx context.Context, sel ast.SelectionSe case "externalData": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -116984,23 +122372,51 @@ func (ec *executionContext) _OracleData(ctx context.Context, sel ast.SelectionSe }() res = ec._OracleData_externalData(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -117008,31 +122424,40 @@ var oracleDataConnectionImplementors = []string{"OracleDataConnection"} func (ec *executionContext) _OracleDataConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.OracleDataConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, oracleDataConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("OracleDataConnection") case "edges": - out.Values[i] = ec._OracleDataConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._OracleDataConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -117040,34 +122465,43 @@ var oracleDataEdgeImplementors = []string{"OracleDataEdge"} func (ec *executionContext) _OracleDataEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.OracleDataEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, oracleDataEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("OracleDataEdge") case "node": - out.Values[i] = ec._OracleDataEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._OracleDataEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -117075,8 +122509,9 @@ var oracleSpecImplementors = []string{"OracleSpec"} func (ec *executionContext) _OracleSpec(ctx context.Context, sel ast.SelectionSet, obj *vega.OracleSpec) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, oracleSpecImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -117084,7 +122519,7 @@ func (ec *executionContext) _OracleSpec(ctx context.Context, sel ast.SelectionSe case "dataSourceSpec": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117092,19 +122527,35 @@ func (ec *executionContext) _OracleSpec(ctx context.Context, sel ast.SelectionSe }() res = ec._OracleSpec_dataSourceSpec(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "dataConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117112,23 +122563,51 @@ func (ec *executionContext) _OracleSpec(ctx context.Context, sel ast.SelectionSe }() res = ec._OracleSpec_dataConnection(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -117136,34 +122615,43 @@ var oracleSpecEdgeImplementors = []string{"OracleSpecEdge"} func (ec *executionContext) _OracleSpecEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.OracleSpecEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, oracleSpecEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("OracleSpecEdge") case "node": - out.Values[i] = ec._OracleSpecEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._OracleSpecEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -117171,31 +122659,40 @@ var oracleSpecsConnectionImplementors = []string{"OracleSpecsConnection"} func (ec *executionContext) _OracleSpecsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.OracleSpecsConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, oracleSpecsConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("OracleSpecsConnection") case "edges": - out.Values[i] = ec._OracleSpecsConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._OracleSpecsConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -117203,44 +122700,37 @@ var orderImplementors = []string{"Order"} func (ec *executionContext) _Order(ctx context.Context, sel ast.SelectionSet, obj *vega.Order) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, orderImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Order") case "id": - out.Values[i] = ec._Order_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "price": - out.Values[i] = ec._Order_price(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "timeInForce": - out.Values[i] = ec._Order_timeInForce(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "side": - out.Values[i] = ec._Order_side(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "market": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117248,19 +122738,35 @@ func (ec *executionContext) _Order(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Order_market(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "size": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117268,19 +122774,35 @@ func (ec *executionContext) _Order(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Order_size(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "remaining": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117288,19 +122810,35 @@ func (ec *executionContext) _Order(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Order_remaining(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117308,44 +122846,52 @@ func (ec *executionContext) _Order(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Order_party(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "createdAt": - out.Values[i] = ec._Order_createdAt(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "expiresAt": - out.Values[i] = ec._Order_expiresAt(ctx, field, obj) - case "status": - out.Values[i] = ec._Order_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "reference": - out.Values[i] = ec._Order_reference(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "tradesConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117355,18 +122901,32 @@ func (ec *executionContext) _Order(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "type": - out.Values[i] = ec._Order_type(ctx, field, obj) - case "rejectionReason": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117376,14 +122936,30 @@ func (ec *executionContext) _Order(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "version": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117391,27 +122967,39 @@ func (ec *executionContext) _Order(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Order_version(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "updatedAt": + // 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 "updatedAt": out.Values[i] = ec._Order_updatedAt(ctx, field, obj) - case "peggedOrder": - out.Values[i] = ec._Order_peggedOrder(ctx, field, obj) - case "liquidityProvision": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117421,30 +123009,52 @@ func (ec *executionContext) _Order(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "postOnly": + // 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 "postOnly": out.Values[i] = ec._Order_postOnly(ctx, field, obj) - case "reduceOnly": - out.Values[i] = ec._Order_reduceOnly(ctx, field, obj) - case "icebergOrder": - out.Values[i] = ec._Order_icebergOrder(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -117452,28 +123062,37 @@ var orderConnectionImplementors = []string{"OrderConnection"} func (ec *executionContext) _OrderConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.OrderConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, orderConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("OrderConnection") case "edges": - out.Values[i] = ec._OrderConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._OrderConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -117481,31 +123100,40 @@ var orderEdgeImplementors = []string{"OrderEdge"} func (ec *executionContext) _OrderEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.OrderEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, orderEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("OrderEdge") case "node": - out.Values[i] = ec._OrderEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._OrderEdge_cursor(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -117513,41 +123141,48 @@ var orderEstimateImplementors = []string{"OrderEstimate"} func (ec *executionContext) _OrderEstimate(ctx context.Context, sel ast.SelectionSet, obj *OrderEstimate) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, orderEstimateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("OrderEstimate") case "fee": - out.Values[i] = ec._OrderEstimate_fee(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalFeeAmount": - out.Values[i] = ec._OrderEstimate_totalFeeAmount(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "marginLevels": - out.Values[i] = ec._OrderEstimate_marginLevels(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -117555,30 +123190,27 @@ var orderSubmissionImplementors = []string{"OrderSubmission"} func (ec *executionContext) _OrderSubmission(ctx context.Context, sel ast.SelectionSet, obj *v11.OrderSubmission) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, orderSubmissionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("OrderSubmission") case "marketId": - out.Values[i] = ec._OrderSubmission_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "price": - out.Values[i] = ec._OrderSubmission_price(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "size": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117586,63 +123218,63 @@ func (ec *executionContext) _OrderSubmission(ctx context.Context, sel ast.Select }() res = ec._OrderSubmission_size(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "side": - out.Values[i] = ec._OrderSubmission_side(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "timeInForce": - out.Values[i] = ec._OrderSubmission_timeInForce(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "expiresAt": - out.Values[i] = ec._OrderSubmission_expiresAt(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "type": - out.Values[i] = ec._OrderSubmission_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "reference": - out.Values[i] = ec._OrderSubmission_reference(ctx, field, obj) - case "peggedOrder": - out.Values[i] = ec._OrderSubmission_peggedOrder(ctx, field, obj) - case "postOnly": - out.Values[i] = ec._OrderSubmission_postOnly(ctx, field, obj) - case "reduceOnly": - out.Values[i] = ec._OrderSubmission_reduceOnly(ctx, field, obj) - case "icebergOrder": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117652,18 +123284,46 @@ func (ec *executionContext) _OrderSubmission(ctx context.Context, sel ast.Select return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -117671,51 +123331,42 @@ var orderUpdateImplementors = []string{"OrderUpdate"} func (ec *executionContext) _OrderUpdate(ctx context.Context, sel ast.SelectionSet, obj *vega.Order) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, orderUpdateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("OrderUpdate") case "id": - out.Values[i] = ec._OrderUpdate_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "price": - out.Values[i] = ec._OrderUpdate_price(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "timeInForce": - out.Values[i] = ec._OrderUpdate_timeInForce(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "side": - out.Values[i] = ec._OrderUpdate_side(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marketId": - out.Values[i] = ec._OrderUpdate_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "size": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117723,19 +123374,35 @@ func (ec *executionContext) _OrderUpdate(ctx context.Context, sel ast.SelectionS }() res = ec._OrderUpdate_size(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "remaining": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117743,55 +123410,59 @@ func (ec *executionContext) _OrderUpdate(ctx context.Context, sel ast.SelectionS }() res = ec._OrderUpdate_remaining(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "partyId": + // 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": out.Values[i] = ec._OrderUpdate_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "createdAt": - out.Values[i] = ec._OrderUpdate_createdAt(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "expiresAt": - out.Values[i] = ec._OrderUpdate_expiresAt(ctx, field, obj) - case "status": - out.Values[i] = ec._OrderUpdate_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "reference": - out.Values[i] = ec._OrderUpdate_reference(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "type": - out.Values[i] = ec._OrderUpdate_type(ctx, field, obj) - case "rejectionReason": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117801,14 +123472,30 @@ func (ec *executionContext) _OrderUpdate(ctx context.Context, sel ast.SelectionS return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "version": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117816,39 +123503,59 @@ func (ec *executionContext) _OrderUpdate(ctx context.Context, sel ast.SelectionS }() res = ec._OrderUpdate_version(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "updatedAt": + // 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 "updatedAt": out.Values[i] = ec._OrderUpdate_updatedAt(ctx, field, obj) - case "peggedOrder": - out.Values[i] = ec._OrderUpdate_peggedOrder(ctx, field, obj) - case "liquidityProvisionId": - out.Values[i] = ec._OrderUpdate_liquidityProvisionId(ctx, field, obj) - case "icebergOrder": - out.Values[i] = ec._OrderUpdate_icebergOrder(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -117856,48 +123563,53 @@ var pageInfoImplementors = []string{"PageInfo"} func (ec *executionContext) _PageInfo(ctx context.Context, sel ast.SelectionSet, obj *v2.PageInfo) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, pageInfoImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PageInfo") case "hasNextPage": - out.Values[i] = ec._PageInfo_hasNextPage(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "hasPreviousPage": - out.Values[i] = ec._PageInfo_hasPreviousPage(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "startCursor": - out.Values[i] = ec._PageInfo_startCursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "endCursor": - out.Values[i] = ec._PageInfo_endCursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -117905,8 +123617,9 @@ var paidLiquidityFeesImplementors = []string{"PaidLiquidityFees"} func (ec *executionContext) _PaidLiquidityFees(ctx context.Context, sel ast.SelectionSet, obj *v1.PaidLiquidityFeesStats) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, paidLiquidityFeesImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -117914,7 +123627,7 @@ func (ec *executionContext) _PaidLiquidityFees(ctx context.Context, sel ast.Sele case "marketId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117922,19 +123635,35 @@ func (ec *executionContext) _PaidLiquidityFees(ctx context.Context, sel ast.Sele }() res = ec._PaidLiquidityFees_marketId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "assetId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117942,19 +123671,35 @@ func (ec *executionContext) _PaidLiquidityFees(ctx context.Context, sel ast.Sele }() res = ec._PaidLiquidityFees_assetId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "epoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -117962,37 +123707,61 @@ func (ec *executionContext) _PaidLiquidityFees(ctx context.Context, sel ast.Sele }() res = ec._PaidLiquidityFees_epoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "totalFeesPaid": + // 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 "totalFeesPaid": out.Values[i] = ec._PaidLiquidityFees_totalFeesPaid(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "feesPaidPerParty": - out.Values[i] = ec._PaidLiquidityFees_feesPaidPerParty(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -118000,34 +123769,43 @@ var paidLiquidityFeesConnectionImplementors = []string{"PaidLiquidityFeesConnect func (ec *executionContext) _PaidLiquidityFeesConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.PaidLiquidityFeesConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, paidLiquidityFeesConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PaidLiquidityFeesConnection") case "edges": - out.Values[i] = ec._PaidLiquidityFeesConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._PaidLiquidityFeesConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -118035,34 +123813,43 @@ var paidLiquidityFeesEdgeImplementors = []string{"PaidLiquidityFeesEdge"} func (ec *executionContext) _PaidLiquidityFeesEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.PaidLiquidityFeesEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, paidLiquidityFeesEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PaidLiquidityFeesEdge") case "node": - out.Values[i] = ec._PaidLiquidityFeesEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._PaidLiquidityFeesEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -118070,34 +123857,43 @@ var partiesProfilesConnectionImplementors = []string{"PartiesProfilesConnection" func (ec *executionContext) _PartiesProfilesConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.PartiesProfilesConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partiesProfilesConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PartiesProfilesConnection") case "edges": - out.Values[i] = ec._PartiesProfilesConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._PartiesProfilesConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -118105,23 +123901,22 @@ var partyImplementors = []string{"Party"} func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, obj *vega.Party) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Party") case "id": - out.Values[i] = ec._Party_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "ordersConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118131,14 +123926,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "tradesConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118148,14 +123959,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "accountsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118165,14 +123992,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "positionsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118182,14 +124025,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "marginsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118199,14 +124058,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "proposalsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118216,14 +124091,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "votesConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118233,14 +124124,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "withdrawalsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118250,14 +124157,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "depositsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118267,14 +124190,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "liquidityProvisions": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118284,14 +124223,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "liquidityProvisionsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118301,14 +124256,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "delegationsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118318,14 +124289,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "stakingSummary": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118333,19 +124320,35 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Party_stakingSummary(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "rewardsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118355,14 +124358,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "rewardSummaries": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118372,14 +124391,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "transfersConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118389,14 +124424,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "activityStreak": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118406,14 +124457,30 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "vestingBalancesSummary": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118421,19 +124488,35 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Party_vestingBalancesSummary(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "vestingStats": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118443,18 +124526,46 @@ func (ec *executionContext) _Party(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -118462,8 +124573,9 @@ var partyActivityStreakImplementors = []string{"PartyActivityStreak"} func (ec *executionContext) _PartyActivityStreak(ctx context.Context, sel ast.SelectionSet, obj *v1.PartyActivityStreak) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyActivityStreakImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -118471,7 +124583,7 @@ func (ec *executionContext) _PartyActivityStreak(ctx context.Context, sel ast.Se case "activeFor": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118479,19 +124591,35 @@ func (ec *executionContext) _PartyActivityStreak(ctx context.Context, sel ast.Se }() res = ec._PartyActivityStreak_activeFor(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "inactiveFor": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118499,26 +124627,40 @@ func (ec *executionContext) _PartyActivityStreak(ctx context.Context, sel ast.Se }() res = ec._PartyActivityStreak_inactiveFor(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "isActive": + // 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 "isActive": out.Values[i] = ec._PartyActivityStreak_isActive(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "rewardDistributionMultiplier": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118526,19 +124668,35 @@ func (ec *executionContext) _PartyActivityStreak(ctx context.Context, sel ast.Se }() res = ec._PartyActivityStreak_rewardDistributionMultiplier(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "rewardVestingMultiplier": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118546,19 +124704,35 @@ func (ec *executionContext) _PartyActivityStreak(ctx context.Context, sel ast.Se }() res = ec._PartyActivityStreak_rewardVestingMultiplier(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "epoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118566,37 +124740,61 @@ func (ec *executionContext) _PartyActivityStreak(ctx context.Context, sel ast.Se }() res = ec._PartyActivityStreak_epoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "tradedVolume": - out.Values[i] = ec._PartyActivityStreak_tradedVolume(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "openVolume": - out.Values[i] = ec._PartyActivityStreak_openVolume(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -118604,8 +124802,9 @@ var partyAmountImplementors = []string{"PartyAmount"} func (ec *executionContext) _PartyAmount(ctx context.Context, sel ast.SelectionSet, obj *v1.PartyAmount) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyAmountImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -118613,7 +124812,7 @@ func (ec *executionContext) _PartyAmount(ctx context.Context, sel ast.SelectionS case "partyId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118621,30 +124820,56 @@ func (ec *executionContext) _PartyAmount(ctx context.Context, sel ast.SelectionS }() res = ec._PartyAmount_partyId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "amount": + // 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._PartyAmount_amount(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -118652,34 +124877,43 @@ var partyConnectionImplementors = []string{"PartyConnection"} func (ec *executionContext) _PartyConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.PartyConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PartyConnection") case "edges": - out.Values[i] = ec._PartyConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._PartyConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -118687,34 +124921,43 @@ var partyEdgeImplementors = []string{"PartyEdge"} func (ec *executionContext) _PartyEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.PartyEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PartyEdge") case "node": - out.Values[i] = ec._PartyEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._PartyEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -118722,8 +124965,9 @@ var partyLockedBalanceImplementors = []string{"PartyLockedBalance"} func (ec *executionContext) _PartyLockedBalance(ctx context.Context, sel ast.SelectionSet, obj *v1.PartyLockedBalance) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyLockedBalanceImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -118731,7 +124975,7 @@ func (ec *executionContext) _PartyLockedBalance(ctx context.Context, sel ast.Sel case "asset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118739,26 +124983,40 @@ func (ec *executionContext) _PartyLockedBalance(ctx context.Context, sel ast.Sel }() res = ec._PartyLockedBalance_asset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "balance": + // 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 "balance": out.Values[i] = ec._PartyLockedBalance_balance(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "untilEpoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118766,23 +125024,51 @@ func (ec *executionContext) _PartyLockedBalance(ctx context.Context, sel ast.Sel }() res = ec._PartyLockedBalance_untilEpoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -118790,49 +125076,38 @@ var partyMarginModeImplementors = []string{"PartyMarginMode"} func (ec *executionContext) _PartyMarginMode(ctx context.Context, sel ast.SelectionSet, obj *v2.PartyMarginMode) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyMarginModeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PartyMarginMode") case "marketId": - out.Values[i] = ec._PartyMarginMode_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "partyId": - out.Values[i] = ec._PartyMarginMode_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marginMode": - out.Values[i] = ec._PartyMarginMode_marginMode(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marginFactor": - out.Values[i] = ec._PartyMarginMode_marginFactor(ctx, field, obj) - case "minTheoreticalMarginFactor": - out.Values[i] = ec._PartyMarginMode_minTheoreticalMarginFactor(ctx, field, obj) - case "maxTheoreticalLeverage": - out.Values[i] = ec._PartyMarginMode_maxTheoreticalLeverage(ctx, field, obj) - case "atEpoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -118840,23 +125115,51 @@ func (ec *executionContext) _PartyMarginMode(ctx context.Context, sel ast.Select }() res = ec._PartyMarginMode_atEpoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -118864,34 +125167,43 @@ var partyMarginModeEdgeImplementors = []string{"PartyMarginModeEdge"} func (ec *executionContext) _PartyMarginModeEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.PartyMarginModeEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyMarginModeEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PartyMarginModeEdge") case "node": - out.Values[i] = ec._PartyMarginModeEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._PartyMarginModeEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -118899,28 +125211,37 @@ var partyMarginModesConnectionImplementors = []string{"PartyMarginModesConnectio func (ec *executionContext) _PartyMarginModesConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.PartyMarginModesConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyMarginModesConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PartyMarginModesConnection") case "edges": - out.Values[i] = ec._PartyMarginModesConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._PartyMarginModesConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -118928,41 +125249,48 @@ var partyProfileImplementors = []string{"PartyProfile"} func (ec *executionContext) _PartyProfile(ctx context.Context, sel ast.SelectionSet, obj *vega.PartyProfile) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyProfileImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PartyProfile") case "partyId": - out.Values[i] = ec._PartyProfile_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "alias": - out.Values[i] = ec._PartyProfile_alias(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "metadata": - out.Values[i] = ec._PartyProfile_metadata(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -118970,34 +125298,43 @@ var partyProfileEdgeImplementors = []string{"PartyProfileEdge"} func (ec *executionContext) _PartyProfileEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.PartyProfileEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyProfileEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PartyProfileEdge") case "node": - out.Values[i] = ec._PartyProfileEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._PartyProfileEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -119005,23 +125342,22 @@ var partyStakeImplementors = []string{"PartyStake"} func (ec *executionContext) _PartyStake(ctx context.Context, sel ast.SelectionSet, obj *v2.GetStakeResponse) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyStakeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PartyStake") case "currentStakeAvailable": - out.Values[i] = ec._PartyStake_currentStakeAvailable(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "linkings": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119031,18 +125367,46 @@ func (ec *executionContext) _PartyStake(ctx context.Context, sel ast.SelectionSe return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -119050,8 +125414,9 @@ var partyVestingBalanceImplementors = []string{"PartyVestingBalance"} func (ec *executionContext) _PartyVestingBalance(ctx context.Context, sel ast.SelectionSet, obj *v1.PartyVestingBalance) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyVestingBalanceImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -119059,7 +125424,7 @@ func (ec *executionContext) _PartyVestingBalance(ctx context.Context, sel ast.Se case "asset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119067,30 +125432,56 @@ func (ec *executionContext) _PartyVestingBalance(ctx context.Context, sel ast.Se }() res = ec._PartyVestingBalance_asset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "balance": + // 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 "balance": out.Values[i] = ec._PartyVestingBalance_balance(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -119098,8 +125489,9 @@ var partyVestingBalancesSummaryImplementors = []string{"PartyVestingBalancesSumm func (ec *executionContext) _PartyVestingBalancesSummary(ctx context.Context, sel ast.SelectionSet, obj *v2.GetVestingBalancesSummaryResponse) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyVestingBalancesSummaryImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -119107,7 +125499,7 @@ func (ec *executionContext) _PartyVestingBalancesSummary(ctx context.Context, se case "epoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119117,26 +125509,50 @@ func (ec *executionContext) _PartyVestingBalancesSummary(ctx context.Context, se return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "vestingBalances": + // 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 "vestingBalances": out.Values[i] = ec._PartyVestingBalancesSummary_vestingBalances(ctx, field, obj) - case "lockedBalances": - out.Values[i] = ec._PartyVestingBalancesSummary_lockedBalances(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -119144,8 +125560,9 @@ var partyVestingStatsImplementors = []string{"PartyVestingStats"} func (ec *executionContext) _PartyVestingStats(ctx context.Context, sel ast.SelectionSet, obj *v2.GetPartyVestingStatsResponse) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, partyVestingStatsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -119153,7 +125570,7 @@ func (ec *executionContext) _PartyVestingStats(ctx context.Context, sel ast.Sele case "epochSeq": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119161,37 +125578,61 @@ func (ec *executionContext) _PartyVestingStats(ctx context.Context, sel ast.Sele }() res = ec._PartyVestingStats_epochSeq(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "rewardBonusMultiplier": - out.Values[i] = ec._PartyVestingStats_rewardBonusMultiplier(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "quantumBalance": - out.Values[i] = ec._PartyVestingStats_quantumBalance(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -119199,34 +125640,43 @@ var peggedOrderImplementors = []string{"PeggedOrder"} func (ec *executionContext) _PeggedOrder(ctx context.Context, sel ast.SelectionSet, obj *vega.PeggedOrder) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, peggedOrderImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PeggedOrder") case "reference": - out.Values[i] = ec._PeggedOrder_reference(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "offset": - out.Values[i] = ec._PeggedOrder_offset(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -119234,8 +125684,9 @@ var perpetualImplementors = []string{"Perpetual", "Product"} func (ec *executionContext) _Perpetual(ctx context.Context, sel ast.SelectionSet, obj *vega.Perpetual) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, perpetualImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -119243,7 +125694,7 @@ func (ec *executionContext) _Perpetual(ctx context.Context, sel ast.SelectionSet case "settlementAsset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119251,54 +125702,60 @@ func (ec *executionContext) _Perpetual(ctx context.Context, sel ast.SelectionSet }() res = ec._Perpetual_settlementAsset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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._Perpetual_quoteName(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marginFundingFactor": - out.Values[i] = ec._Perpetual_marginFundingFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "interestRate": - out.Values[i] = ec._Perpetual_interestRate(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "clampLowerBound": - out.Values[i] = ec._Perpetual_clampLowerBound(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "clampUpperBound": - out.Values[i] = ec._Perpetual_clampUpperBound(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "dataSourceSpecForSettlementSchedule": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119306,19 +125763,35 @@ func (ec *executionContext) _Perpetual(ctx context.Context, sel ast.SelectionSet }() res = ec._Perpetual_dataSourceSpecForSettlementSchedule(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "dataSourceSpecForSettlementData": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119326,46 +125799,64 @@ func (ec *executionContext) _Perpetual(ctx context.Context, sel ast.SelectionSet }() res = ec._Perpetual_dataSourceSpecForSettlementData(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "dataSourceSpecBinding": + // 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 "dataSourceSpecBinding": out.Values[i] = ec._Perpetual_dataSourceSpecBinding(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "fundingRateScalingFactor": - out.Values[i] = ec._Perpetual_fundingRateScalingFactor(ctx, field, obj) - case "fundingRateLowerBound": - out.Values[i] = ec._Perpetual_fundingRateLowerBound(ctx, field, obj) - case "fundingRateUpperBound": - out.Values[i] = ec._Perpetual_fundingRateUpperBound(ctx, field, obj) - case "internalCompositePriceConfig": - out.Values[i] = ec._Perpetual_internalCompositePriceConfig(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -119373,32 +125864,25 @@ var perpetualDataImplementors = []string{"PerpetualData", "ProductData"} func (ec *executionContext) _PerpetualData(ctx context.Context, sel ast.SelectionSet, obj *vega.PerpetualData) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, perpetualDataImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PerpetualData") case "fundingPayment": - out.Values[i] = ec._PerpetualData_fundingPayment(ctx, field, obj) - case "fundingRate": - out.Values[i] = ec._PerpetualData_fundingRate(ctx, field, obj) - case "externalTwap": - out.Values[i] = ec._PerpetualData_externalTwap(ctx, field, obj) - case "internalTwap": - out.Values[i] = ec._PerpetualData_internalTwap(ctx, field, obj) - case "seqNum": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119406,33 +125890,45 @@ func (ec *executionContext) _PerpetualData(ctx context.Context, sel ast.Selectio }() res = ec._PerpetualData_seqNum(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "startTime": + // 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 "startTime": out.Values[i] = ec._PerpetualData_startTime(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "internalCompositePrice": - out.Values[i] = ec._PerpetualData_internalCompositePrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "internalCompositePriceType": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119440,19 +125936,35 @@ func (ec *executionContext) _PerpetualData(ctx context.Context, sel ast.Selectio }() res = ec._PerpetualData_internalCompositePriceType(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "nextInternalCompositePriceCalc": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119460,34 +125972,58 @@ func (ec *executionContext) _PerpetualData(ctx context.Context, sel ast.Selectio }() res = ec._PerpetualData_nextInternalCompositePriceCalc(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "underlyingIndexPrice": + // 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 "underlyingIndexPrice": out.Values[i] = ec._PerpetualData_underlyingIndexPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "internalCompositePriceState": - out.Values[i] = ec._PerpetualData_internalCompositePriceState(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -119495,8 +126031,9 @@ var perpetualProductImplementors = []string{"PerpetualProduct", "ProductConfigur func (ec *executionContext) _PerpetualProduct(ctx context.Context, sel ast.SelectionSet, obj *vega.PerpetualProduct) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, perpetualProductImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -119504,7 +126041,7 @@ func (ec *executionContext) _PerpetualProduct(ctx context.Context, sel ast.Selec case "settlementAsset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119512,91 +126049,97 @@ func (ec *executionContext) _PerpetualProduct(ctx context.Context, sel ast.Selec }() res = ec._PerpetualProduct_settlementAsset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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._PerpetualProduct_quoteName(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marginFundingFactor": - out.Values[i] = ec._PerpetualProduct_marginFundingFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "interestRate": - out.Values[i] = ec._PerpetualProduct_interestRate(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "clampLowerBound": - out.Values[i] = ec._PerpetualProduct_clampLowerBound(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "clampUpperBound": - out.Values[i] = ec._PerpetualProduct_clampUpperBound(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "dataSourceSpecForSettlementSchedule": - out.Values[i] = ec._PerpetualProduct_dataSourceSpecForSettlementSchedule(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "dataSourceSpecForSettlementData": - out.Values[i] = ec._PerpetualProduct_dataSourceSpecForSettlementData(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "dataSourceSpecBinding": - out.Values[i] = ec._PerpetualProduct_dataSourceSpecBinding(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "fundingRateScalingFactor": - out.Values[i] = ec._PerpetualProduct_fundingRateScalingFactor(ctx, field, obj) - case "fundingRateLowerBound": - out.Values[i] = ec._PerpetualProduct_fundingRateLowerBound(ctx, field, obj) - case "fundingRateUpperBound": - out.Values[i] = ec._PerpetualProduct_fundingRateUpperBound(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -119604,8 +126147,9 @@ var positionImplementors = []string{"Position"} func (ec *executionContext) _Position(ctx context.Context, sel ast.SelectionSet, obj *vega.Position) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, positionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -119613,7 +126157,7 @@ func (ec *executionContext) _Position(ctx context.Context, sel ast.SelectionSet, case "market": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119621,19 +126165,35 @@ func (ec *executionContext) _Position(ctx context.Context, sel ast.SelectionSet, }() res = ec._Position_market(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119641,19 +126201,35 @@ func (ec *executionContext) _Position(ctx context.Context, sel ast.SelectionSet, }() res = ec._Position_party(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "openVolume": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119661,40 +126237,50 @@ func (ec *executionContext) _Position(ctx context.Context, sel ast.SelectionSet, }() res = ec._Position_openVolume(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "realisedPNL": - out.Values[i] = ec._Position_realisedPNL(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "unrealisedPNL": - out.Values[i] = ec._Position_unrealisedPNL(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "averageEntryPrice": - out.Values[i] = ec._Position_averageEntryPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "lossSocializationAmount": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119702,26 +126288,40 @@ func (ec *executionContext) _Position(ctx context.Context, sel ast.SelectionSet, }() res = ec._Position_lossSocializationAmount(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "positionStatus": + // 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 "positionStatus": out.Values[i] = ec._Position_positionStatus(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marginsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119731,22 +126331,48 @@ func (ec *executionContext) _Position(ctx context.Context, sel ast.SelectionSet, return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "updatedAt": - out.Values[i] = ec._Position_updatedAt(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -119754,28 +126380,37 @@ var positionConnectionImplementors = []string{"PositionConnection"} func (ec *executionContext) _PositionConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.PositionConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, positionConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PositionConnection") case "edges": - out.Values[i] = ec._PositionConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._PositionConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -119783,31 +126418,40 @@ var positionEdgeImplementors = []string{"PositionEdge"} func (ec *executionContext) _PositionEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.PositionEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, positionEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PositionEdge") case "node": - out.Values[i] = ec._PositionEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._PositionEdge_cursor(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -119815,38 +126459,45 @@ var positionEstimateImplementors = []string{"PositionEstimate"} func (ec *executionContext) _PositionEstimate(ctx context.Context, sel ast.SelectionSet, obj *PositionEstimate) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, positionEstimateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PositionEstimate") case "margin": - out.Values[i] = ec._PositionEstimate_margin(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "collateralIncreaseEstimate": - out.Values[i] = ec._PositionEstimate_collateralIncreaseEstimate(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "liquidation": - out.Values[i] = ec._PositionEstimate_liquidation(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -119854,48 +126505,53 @@ var positionResolutionImplementors = []string{"PositionResolution"} func (ec *executionContext) _PositionResolution(ctx context.Context, sel ast.SelectionSet, obj *PositionResolution) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, positionResolutionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PositionResolution") case "marketId": - out.Values[i] = ec._PositionResolution_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "distressed": - out.Values[i] = ec._PositionResolution_distressed(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "closed": - out.Values[i] = ec._PositionResolution_closed(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "markPrice": - out.Values[i] = ec._PositionResolution_markPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -119903,30 +126559,27 @@ var positionUpdateImplementors = []string{"PositionUpdate"} func (ec *executionContext) _PositionUpdate(ctx context.Context, sel ast.SelectionSet, obj *vega.Position) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, positionUpdateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PositionUpdate") case "marketId": - out.Values[i] = ec._PositionUpdate_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "partyId": - out.Values[i] = ec._PositionUpdate_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "openVolume": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119934,44 +126587,52 @@ func (ec *executionContext) _PositionUpdate(ctx context.Context, sel ast.Selecti }() res = ec._PositionUpdate_openVolume(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "realisedPNL": + // 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 "realisedPNL": out.Values[i] = ec._PositionUpdate_realisedPNL(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "unrealisedPNL": - out.Values[i] = ec._PositionUpdate_unrealisedPNL(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "averageEntryPrice": - out.Values[i] = ec._PositionUpdate_averageEntryPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "updatedAt": - out.Values[i] = ec._PositionUpdate_updatedAt(ctx, field, obj) - case "lossSocializationAmount": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -119979,30 +126640,56 @@ func (ec *executionContext) _PositionUpdate(ctx context.Context, sel ast.Selecti }() res = ec._PositionUpdate_lossSocializationAmount(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "positionStatus": + // 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 "positionStatus": out.Values[i] = ec._PositionUpdate_positionStatus(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -120010,23 +126697,22 @@ var priceLevelImplementors = []string{"PriceLevel"} func (ec *executionContext) _PriceLevel(ctx context.Context, sel ast.SelectionSet, obj *vega.PriceLevel) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, priceLevelImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PriceLevel") case "price": - out.Values[i] = ec._PriceLevel_price(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "volume": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120034,19 +126720,35 @@ func (ec *executionContext) _PriceLevel(ctx context.Context, sel ast.SelectionSe }() res = ec._PriceLevel_volume(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120054,23 +126756,51 @@ func (ec *executionContext) _PriceLevel(ctx context.Context, sel ast.SelectionSe }() res = ec._PriceLevel_numberOfOrders(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -120078,48 +126808,53 @@ var priceMonitoringBoundsImplementors = []string{"PriceMonitoringBounds"} func (ec *executionContext) _PriceMonitoringBounds(ctx context.Context, sel ast.SelectionSet, obj *PriceMonitoringBounds) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, priceMonitoringBoundsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PriceMonitoringBounds") case "minValidPrice": - out.Values[i] = ec._PriceMonitoringBounds_minValidPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "maxValidPrice": - out.Values[i] = ec._PriceMonitoringBounds_maxValidPrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "trigger": - out.Values[i] = ec._PriceMonitoringBounds_trigger(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "referencePrice": - out.Values[i] = ec._PriceMonitoringBounds_referencePrice(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -120127,24 +126862,35 @@ var priceMonitoringParametersImplementors = []string{"PriceMonitoringParameters" func (ec *executionContext) _PriceMonitoringParameters(ctx context.Context, sel ast.SelectionSet, obj *PriceMonitoringParameters) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, priceMonitoringParametersImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PriceMonitoringParameters") case "triggers": - out.Values[i] = ec._PriceMonitoringParameters_triggers(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -120152,24 +126898,35 @@ var priceMonitoringSettingsImplementors = []string{"PriceMonitoringSettings"} func (ec *executionContext) _PriceMonitoringSettings(ctx context.Context, sel ast.SelectionSet, obj *PriceMonitoringSettings) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, priceMonitoringSettingsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PriceMonitoringSettings") case "parameters": - out.Values[i] = ec._PriceMonitoringSettings_parameters(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -120177,41 +126934,48 @@ var priceMonitoringTriggerImplementors = []string{"PriceMonitoringTrigger"} func (ec *executionContext) _PriceMonitoringTrigger(ctx context.Context, sel ast.SelectionSet, obj *PriceMonitoringTrigger) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, priceMonitoringTriggerImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PriceMonitoringTrigger") case "horizonSecs": - out.Values[i] = ec._PriceMonitoringTrigger_horizonSecs(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "probability": - out.Values[i] = ec._PriceMonitoringTrigger_probability(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "auctionExtensionSecs": - out.Values[i] = ec._PriceMonitoringTrigger_auctionExtensionSecs(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -120219,34 +126983,43 @@ var propertyImplementors = []string{"Property"} func (ec *executionContext) _Property(ctx context.Context, sel ast.SelectionSet, obj *v13.Property) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, propertyImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Property") case "name": - out.Values[i] = ec._Property_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "value": - out.Values[i] = ec._Property_value(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -120254,35 +127027,42 @@ var propertyKeyImplementors = []string{"PropertyKey"} func (ec *executionContext) _PropertyKey(ctx context.Context, sel ast.SelectionSet, obj *PropertyKey) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, propertyKeyImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PropertyKey") case "name": - out.Values[i] = ec._PropertyKey_name(ctx, field, obj) - case "type": - out.Values[i] = ec._PropertyKey_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "numberDecimalPlaces": - out.Values[i] = ec._PropertyKey_numberDecimalPlaces(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -120290,8 +127070,9 @@ var proposalImplementors = []string{"Proposal", "ProposalNode"} func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, obj *vega.GovernanceData) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, proposalImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -120299,7 +127080,7 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, case "id": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120309,14 +127090,30 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "reference": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120324,19 +127121,35 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, }() res = ec._Proposal_reference(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120344,19 +127157,35 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, }() res = ec._Proposal_party(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "state": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120364,19 +127193,35 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, }() res = ec._Proposal_state(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "datetime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120384,19 +127229,35 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, }() res = ec._Proposal_datetime(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "rationale": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120404,19 +127265,35 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, }() res = ec._Proposal_rationale(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "terms": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120424,19 +127301,35 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, }() res = ec._Proposal_terms(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "votes": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120444,19 +127337,35 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, }() res = ec._Proposal_votes(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "rejectionReason": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120466,14 +127375,30 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "errorDetails": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120483,14 +127408,30 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "requiredMajority": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120498,19 +127439,35 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, }() res = ec._Proposal_requiredMajority(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "requiredParticipation": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120518,19 +127475,35 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, }() res = ec._Proposal_requiredParticipation(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "requiredLpMajority": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120540,14 +127513,30 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "requiredLpParticipation": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120557,18 +127546,46 @@ func (ec *executionContext) _Proposal(ctx context.Context, sel ast.SelectionSet, return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -120576,31 +127593,26 @@ var proposalDetailImplementors = []string{"ProposalDetail"} func (ec *executionContext) _ProposalDetail(ctx context.Context, sel ast.SelectionSet, obj *vega.Proposal) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, proposalDetailImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ProposalDetail") case "id": - out.Values[i] = ec._ProposalDetail_id(ctx, field, obj) - case "batchId": - out.Values[i] = ec._ProposalDetail_batchId(ctx, field, obj) - case "reference": - out.Values[i] = ec._ProposalDetail_reference(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120608,26 +127620,40 @@ func (ec *executionContext) _ProposalDetail(ctx context.Context, sel ast.Selecti }() res = ec._ProposalDetail_party(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "state": + // 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 "state": out.Values[i] = ec._ProposalDetail_state(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "datetime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120635,34 +127661,44 @@ func (ec *executionContext) _ProposalDetail(ctx context.Context, sel ast.Selecti }() res = ec._ProposalDetail_datetime(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "terms": - out.Values[i] = ec._ProposalDetail_terms(ctx, field, obj) - case "batchTerms": - out.Values[i] = ec._ProposalDetail_batchTerms(ctx, field, obj) - case "rationale": - out.Values[i] = ec._ProposalDetail_rationale(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "rejectionReason": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120672,32 +127708,42 @@ func (ec *executionContext) _ProposalDetail(ctx context.Context, sel ast.Selecti return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "errorDetails": + // 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 "errorDetails": out.Values[i] = ec._ProposalDetail_errorDetails(ctx, field, obj) - case "requiredMajority": - out.Values[i] = ec._ProposalDetail_requiredMajority(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "requiredParticipation": - out.Values[i] = ec._ProposalDetail_requiredParticipation(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "requiredLpMajority": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120707,14 +127753,30 @@ func (ec *executionContext) _ProposalDetail(ctx context.Context, sel ast.Selecti return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "requiredLpParticipation": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120724,18 +127786,46 @@ func (ec *executionContext) _ProposalDetail(ctx context.Context, sel ast.Selecti return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -120743,23 +127833,22 @@ var proposalEdgeImplementors = []string{"ProposalEdge"} func (ec *executionContext) _ProposalEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.GovernanceDataEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, proposalEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ProposalEdge") case "node": - out.Values[i] = ec._ProposalEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "proposalNode": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120769,25 +127858,51 @@ func (ec *executionContext) _ProposalEdge(ctx context.Context, sel ast.Selection return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "cursor": - out.Values[i] = ec._ProposalEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -120795,34 +127910,43 @@ var proposalRationaleImplementors = []string{"ProposalRationale"} func (ec *executionContext) _ProposalRationale(ctx context.Context, sel ast.SelectionSet, obj *vega.ProposalRationale) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, proposalRationaleImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ProposalRationale") case "description": - out.Values[i] = ec._ProposalRationale_description(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "title": - out.Values[i] = ec._ProposalRationale_title(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -120830,8 +127954,9 @@ var proposalTermsImplementors = []string{"ProposalTerms"} func (ec *executionContext) _ProposalTerms(ctx context.Context, sel ast.SelectionSet, obj *vega.ProposalTerms) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, proposalTermsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -120839,7 +127964,7 @@ func (ec *executionContext) _ProposalTerms(ctx context.Context, sel ast.Selectio case "closingDatetime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120847,19 +127972,35 @@ func (ec *executionContext) _ProposalTerms(ctx context.Context, sel ast.Selectio }() res = ec._ProposalTerms_closingDatetime(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "enactmentDatetime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120869,14 +128010,30 @@ func (ec *executionContext) _ProposalTerms(ctx context.Context, sel ast.Selectio return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "validationDatetime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120886,14 +128043,30 @@ func (ec *executionContext) _ProposalTerms(ctx context.Context, sel ast.Selectio return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "change": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -120901,23 +128074,51 @@ func (ec *executionContext) _ProposalTerms(ctx context.Context, sel ast.Selectio }() res = ec._ProposalTerms_change(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -120925,34 +128126,43 @@ var proposalVoteImplementors = []string{"ProposalVote"} func (ec *executionContext) _ProposalVote(ctx context.Context, sel ast.SelectionSet, obj *ProposalVote) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, proposalVoteImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ProposalVote") case "vote": - out.Values[i] = ec._ProposalVote_vote(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "proposalId": - out.Values[i] = ec._ProposalVote_proposalId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -120960,28 +128170,37 @@ var proposalVoteConnectionImplementors = []string{"ProposalVoteConnection"} func (ec *executionContext) _ProposalVoteConnection(ctx context.Context, sel ast.SelectionSet, obj *ProposalVoteConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, proposalVoteConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ProposalVoteConnection") case "edges": - out.Values[i] = ec._ProposalVoteConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._ProposalVoteConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -120989,31 +128208,40 @@ var proposalVoteEdgeImplementors = []string{"ProposalVoteEdge"} func (ec *executionContext) _ProposalVoteEdge(ctx context.Context, sel ast.SelectionSet, obj *ProposalVoteEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, proposalVoteEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ProposalVoteEdge") case "node": - out.Values[i] = ec._ProposalVoteEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._ProposalVoteEdge_cursor(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -121021,52 +128249,55 @@ var proposalVoteSideImplementors = []string{"ProposalVoteSide"} func (ec *executionContext) _ProposalVoteSide(ctx context.Context, sel ast.SelectionSet, obj *ProposalVoteSide) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, proposalVoteSideImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ProposalVoteSide") case "votes": - out.Values[i] = ec._ProposalVoteSide_votes(ctx, field, obj) - case "totalNumber": - out.Values[i] = ec._ProposalVoteSide_totalNumber(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalWeight": - out.Values[i] = ec._ProposalVoteSide_totalWeight(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalTokens": - out.Values[i] = ec._ProposalVoteSide_totalTokens(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalEquityLikeShareWeight": - out.Values[i] = ec._ProposalVoteSide_totalEquityLikeShareWeight(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -121074,34 +128305,43 @@ var proposalVotesImplementors = []string{"ProposalVotes"} func (ec *executionContext) _ProposalVotes(ctx context.Context, sel ast.SelectionSet, obj *ProposalVotes) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, proposalVotesImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ProposalVotes") case "yes": - out.Values[i] = ec._ProposalVotes_yes(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "no": - out.Values[i] = ec._ProposalVotes_no(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -121109,31 +128349,40 @@ var proposalsConnectionImplementors = []string{"ProposalsConnection"} func (ec *executionContext) _ProposalsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.GovernanceDataConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, proposalsConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ProposalsConnection") case "edges": - out.Values[i] = ec._ProposalsConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._ProposalsConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -121141,8 +128390,9 @@ var protocolUpgradeProposalImplementors = []string{"ProtocolUpgradeProposal"} func (ec *executionContext) _ProtocolUpgradeProposal(ctx context.Context, sel ast.SelectionSet, obj *v1.ProtocolUpgradeEvent) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, protocolUpgradeProposalImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -121150,7 +128400,7 @@ func (ec *executionContext) _ProtocolUpgradeProposal(ctx context.Context, sel as case "upgradeBlockHeight": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121158,44 +128408,66 @@ func (ec *executionContext) _ProtocolUpgradeProposal(ctx context.Context, sel as }() res = ec._ProtocolUpgradeProposal_upgradeBlockHeight(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "vegaReleaseTag": + // 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 "vegaReleaseTag": out.Values[i] = ec._ProtocolUpgradeProposal_vegaReleaseTag(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "approvers": - out.Values[i] = ec._ProtocolUpgradeProposal_approvers(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "status": - out.Values[i] = ec._ProtocolUpgradeProposal_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -121203,28 +128475,37 @@ var protocolUpgradeProposalConnectionImplementors = []string{"ProtocolUpgradePro func (ec *executionContext) _ProtocolUpgradeProposalConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.ProtocolUpgradeProposalConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, protocolUpgradeProposalConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ProtocolUpgradeProposalConnection") case "edges": - out.Values[i] = ec._ProtocolUpgradeProposalConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._ProtocolUpgradeProposalConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -121232,34 +128513,43 @@ var protocolUpgradeProposalEdgeImplementors = []string{"ProtocolUpgradeProposalE func (ec *executionContext) _ProtocolUpgradeProposalEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.ProtocolUpgradeProposalEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, protocolUpgradeProposalEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ProtocolUpgradeProposalEdge") case "node": - out.Values[i] = ec._ProtocolUpgradeProposalEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._ProtocolUpgradeProposalEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -121267,27 +128557,38 @@ var protocolUpgradeStatusImplementors = []string{"ProtocolUpgradeStatus"} func (ec *executionContext) _ProtocolUpgradeStatus(ctx context.Context, sel ast.SelectionSet, obj *ProtocolUpgradeStatus) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, protocolUpgradeStatusImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ProtocolUpgradeStatus") case "ready": - out.Values[i] = ec._ProtocolUpgradeStatus_ready(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -121295,24 +128596,35 @@ var pubKeyImplementors = []string{"PubKey", "SignerKind"} func (ec *executionContext) _PubKey(ctx context.Context, sel ast.SelectionSet, obj *PubKey) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, pubKeyImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("PubKey") case "key": - out.Values[i] = ec._PubKey_key(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -121320,8 +128632,9 @@ var quantumRewardsPerEpochImplementors = []string{"QuantumRewardsPerEpoch"} func (ec *executionContext) _QuantumRewardsPerEpoch(ctx context.Context, sel ast.SelectionSet, obj *v2.QuantumRewardsPerEpoch) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, quantumRewardsPerEpochImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -121329,7 +128642,7 @@ func (ec *executionContext) _QuantumRewardsPerEpoch(ctx context.Context, sel ast case "epoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121337,30 +128650,56 @@ func (ec *executionContext) _QuantumRewardsPerEpoch(ctx context.Context, sel ast }() res = ec._QuantumRewardsPerEpoch_epoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "totalQuantumRewards": + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "totalQuantumRewards": out.Values[i] = ec._QuantumRewardsPerEpoch_totalQuantumRewards(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -121368,8 +128707,9 @@ var quantumVolumesPerEpochImplementors = []string{"QuantumVolumesPerEpoch"} func (ec *executionContext) _QuantumVolumesPerEpoch(ctx context.Context, sel ast.SelectionSet, obj *v2.QuantumVolumesPerEpoch) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, quantumVolumesPerEpochImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -121377,7 +128717,7 @@ func (ec *executionContext) _QuantumVolumesPerEpoch(ctx context.Context, sel ast case "epoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121385,30 +128725,56 @@ func (ec *executionContext) _QuantumVolumesPerEpoch(ctx context.Context, sel ast }() res = ec._QuantumVolumesPerEpoch_epoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "totalQuantumVolumes": + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "totalQuantumVolumes": out.Values[i] = ec._QuantumVolumesPerEpoch_totalQuantumVolumes(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -121421,7 +128787,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }) out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { innerCtx := graphql.WithRootFieldContext(ctx, &graphql.RootFieldContext{ Object: field.Name, @@ -121434,7 +128800,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr case "asset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121445,16 +128811,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "assetsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121465,16 +128830,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "balanceChanges": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121482,22 +128846,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_balanceChanges(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "currentReferralProgram": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121508,16 +128871,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "currentVolumeDiscountProgram": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121528,16 +128890,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "coreSnapshots": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121548,16 +128909,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "deposit": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121568,16 +128928,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "deposits": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121588,16 +128947,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "entities": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121605,22 +128963,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_entities(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "epoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121628,22 +128985,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_epoch(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "epochRewardSummaries": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121654,16 +129010,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "erc20ListAssetBundle": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121674,16 +129029,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "erc20MultiSigSignerAddedBundles": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121691,22 +129045,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_erc20MultiSigSignerAddedBundles(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "erc20MultiSigSignerRemovedBundles": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121714,22 +129067,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_erc20MultiSigSignerRemovedBundles(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "erc20SetAssetLimitsBundle": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121737,22 +129089,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_erc20SetAssetLimitsBundle(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "erc20WithdrawalApproval": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121763,16 +129114,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "estimateOrder": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121780,22 +129130,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_estimateOrder(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "estimateFees": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121803,22 +129152,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_estimateFees(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "estimatePosition": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121829,16 +129177,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "ethereumKeyRotations": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121846,22 +129193,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_ethereumKeyRotations(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "estimateTransferFee": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121872,16 +129218,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "feesStats": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121892,16 +129237,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "feesStatsForParty": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121912,16 +129256,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "fundingPayments": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121929,22 +129272,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_fundingPayments(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "fundingPeriods": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121952,22 +129294,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_fundingPeriods(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "fundingPeriodDataPoints": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121975,22 +129316,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_fundingPeriodDataPoints(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "games": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -121998,22 +129338,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_games(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "getMarketDataHistoryConnectionByID": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122024,16 +129363,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "keyRotationsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122041,22 +129379,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_keyRotationsConnection(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "ledgerEntries": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122064,22 +129401,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_ledgerEntries(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "liquidityProviders": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122090,16 +129426,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "lastBlockHeight": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122107,22 +129442,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_lastBlockHeight(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "market": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122133,16 +129467,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "marketsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122153,16 +129486,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "mostRecentHistorySegment": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122170,22 +129502,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_mostRecentHistorySegment(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "networkLimits": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122196,16 +129527,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "networkParameter": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122216,16 +129546,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "networkParametersConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122233,22 +129562,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_networkParametersConnection(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "node": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122259,16 +129587,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "nodeData": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122279,16 +129606,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "nodesConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122296,22 +129622,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_nodesConnection(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "nodeSignaturesConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122322,16 +129647,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "oracleDataBySpecConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122342,16 +129666,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "oracleDataConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122362,16 +129685,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "oracleSpec": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122382,16 +129704,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "oracleSpecsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122402,16 +129723,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "orderByID": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122419,22 +129739,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_orderByID(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "orderByReference": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122442,22 +129761,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_orderByReference(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "orderVersionsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122468,16 +129786,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "paidLiquidityFees": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122488,16 +129805,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "partiesConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122508,16 +129824,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "partiesProfilesConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122528,16 +129843,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122548,16 +129862,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "positions": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122568,16 +129881,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "proposal": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122588,16 +129900,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "proposalsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122608,16 +129919,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "protocolUpgradeStatus": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122628,16 +129938,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "protocolUpgradeProposals": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122648,16 +129957,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "referralSets": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122665,22 +129973,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_referralSets(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "referralSetReferees": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122688,22 +129995,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_referralSetReferees(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "referralSetStats": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122711,22 +130017,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_referralSetStats(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "statistics": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122734,22 +130039,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_statistics(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "stopOrder": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122760,16 +130064,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "stopOrders": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122780,16 +130083,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "successorMarkets": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122800,16 +130102,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "teams": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122820,16 +130121,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "teamsStatistics": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122840,16 +130140,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "teamMembersStatistics": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122860,16 +130159,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "teamReferees": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122880,16 +130178,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "teamRefereeHistory": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122900,16 +130197,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "timeWeightedNotionalPosition": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122920,16 +130216,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "totalTransferFeeDiscount": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122940,16 +130235,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "trades": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122960,16 +130254,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "transfersConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -122980,16 +130273,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "transfer": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123000,16 +130292,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "volumeDiscountStats": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123017,22 +130308,21 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }() res = ec._Query_volumeDiscountStats(ctx, field) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "withdrawal": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123043,16 +130333,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "withdrawals": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123063,16 +130352,15 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "partyMarginModes": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123083,32 +130371,39 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func() graphql.Marshaler { - return rrm(innerCtx) - }) + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "__type": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { return ec._Query___type(ctx, field) }) - case "__schema": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { return ec._Query___schema(ctx, field) }) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123116,34 +130411,43 @@ var rankTableImplementors = []string{"RankTable"} func (ec *executionContext) _RankTable(ctx context.Context, sel ast.SelectionSet, obj *vega.Rank) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, rankTableImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("RankTable") case "startRank": - out.Values[i] = ec._RankTable_startRank(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "shareRatio": - out.Values[i] = ec._RankTable_shareRatio(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123151,51 +130455,42 @@ var rankingScoreImplementors = []string{"RankingScore"} func (ec *executionContext) _RankingScore(ctx context.Context, sel ast.SelectionSet, obj *vega.RankingScore) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, rankingScoreImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("RankingScore") case "status": - out.Values[i] = ec._RankingScore_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "previousStatus": - out.Values[i] = ec._RankingScore_previousStatus(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "rankingScore": - out.Values[i] = ec._RankingScore_rankingScore(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "stakeScore": - out.Values[i] = ec._RankingScore_stakeScore(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "performanceScore": - out.Values[i] = ec._RankingScore_performanceScore(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "votingPower": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123203,23 +130498,51 @@ func (ec *executionContext) _RankingScore(ctx context.Context, sel ast.Selection }() res = ec._RankingScore_votingPower(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -123227,8 +130550,9 @@ var recurringGovernanceTransferImplementors = []string{"RecurringGovernanceTrans func (ec *executionContext) _RecurringGovernanceTransfer(ctx context.Context, sel ast.SelectionSet, obj *v1.RecurringGovernanceTransfer) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, recurringGovernanceTransferImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -123236,7 +130560,7 @@ func (ec *executionContext) _RecurringGovernanceTransfer(ctx context.Context, se case "startEpoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123244,19 +130568,35 @@ func (ec *executionContext) _RecurringGovernanceTransfer(ctx context.Context, se }() res = ec._RecurringGovernanceTransfer_startEpoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "endEpoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123266,22 +130606,48 @@ func (ec *executionContext) _RecurringGovernanceTransfer(ctx context.Context, se return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "dispatchStrategy": - out.Values[i] = ec._RecurringGovernanceTransfer_dispatchStrategy(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123289,8 +130655,9 @@ var recurringTransferImplementors = []string{"RecurringTransfer", "TransferKind" func (ec *executionContext) _RecurringTransfer(ctx context.Context, sel ast.SelectionSet, obj *v1.RecurringTransfer) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, recurringTransferImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -123298,7 +130665,7 @@ func (ec *executionContext) _RecurringTransfer(ctx context.Context, sel ast.Sele case "startEpoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123306,19 +130673,35 @@ func (ec *executionContext) _RecurringTransfer(ctx context.Context, sel ast.Sele }() res = ec._RecurringTransfer_startEpoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "endEpoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123328,29 +130711,53 @@ func (ec *executionContext) _RecurringTransfer(ctx context.Context, sel ast.Sele return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "factor": - out.Values[i] = ec._RecurringTransfer_factor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "dispatchStrategy": - out.Values[i] = ec._RecurringTransfer_dispatchStrategy(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123358,23 +130765,22 @@ var referralProgramImplementors = []string{"ReferralProgram"} func (ec *executionContext) _ReferralProgram(ctx context.Context, sel ast.SelectionSet, obj *vega.ReferralProgram) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, referralProgramImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ReferralProgram") case "id": - out.Values[i] = ec._ReferralProgram_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "version": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123382,33 +130788,45 @@ func (ec *executionContext) _ReferralProgram(ctx context.Context, sel ast.Select }() res = ec._ReferralProgram_version(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "benefitTiers": - out.Values[i] = ec._ReferralProgram_benefitTiers(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "endOfProgramTimestamp": - out.Values[i] = ec._ReferralProgram_endOfProgramTimestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "windowLength": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123416,30 +130834,56 @@ func (ec *executionContext) _ReferralProgram(ctx context.Context, sel ast.Select }() res = ec._ReferralProgram_windowLength(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "stakingTiers": - out.Values[i] = ec._ReferralProgram_stakingTiers(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123447,30 +130891,27 @@ var referralSetImplementors = []string{"ReferralSet"} func (ec *executionContext) _ReferralSet(ctx context.Context, sel ast.SelectionSet, obj *v2.ReferralSet) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, referralSetImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ReferralSet") case "id": - out.Values[i] = ec._ReferralSet_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "referrer": - out.Values[i] = ec._ReferralSet_referrer(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "totalMembers": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123478,37 +130919,61 @@ func (ec *executionContext) _ReferralSet(ctx context.Context, sel ast.SelectionS }() res = ec._ReferralSet_totalMembers(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "createdAt": - out.Values[i] = ec._ReferralSet_createdAt(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "updatedAt": - out.Values[i] = ec._ReferralSet_updatedAt(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123516,34 +130981,43 @@ var referralSetConnectionImplementors = []string{"ReferralSetConnection"} func (ec *executionContext) _ReferralSetConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.ReferralSetConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, referralSetConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ReferralSetConnection") case "edges": - out.Values[i] = ec._ReferralSetConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._ReferralSetConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123551,34 +131025,43 @@ var referralSetEdgeImplementors = []string{"ReferralSetEdge"} func (ec *executionContext) _ReferralSetEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.ReferralSetEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, referralSetEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ReferralSetEdge") case "node": - out.Values[i] = ec._ReferralSetEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._ReferralSetEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123586,23 +131069,22 @@ var referralSetRefereeImplementors = []string{"ReferralSetReferee"} func (ec *executionContext) _ReferralSetReferee(ctx context.Context, sel ast.SelectionSet, obj *v2.ReferralSetReferee) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, referralSetRefereeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ReferralSetReferee") case "referralSetId": - out.Values[i] = ec._ReferralSetReferee_referralSetId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "refereeId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123610,26 +131092,40 @@ func (ec *executionContext) _ReferralSetReferee(ctx context.Context, sel ast.Sel }() res = ec._ReferralSetReferee_refereeId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "joinedAt": - out.Values[i] = ec._ReferralSetReferee_joinedAt(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "atEpoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123637,37 +131133,61 @@ func (ec *executionContext) _ReferralSetReferee(ctx context.Context, sel ast.Sel }() res = ec._ReferralSetReferee_atEpoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "totalRefereeNotionalTakerVolume": + // 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 "totalRefereeNotionalTakerVolume": out.Values[i] = ec._ReferralSetReferee_totalRefereeNotionalTakerVolume(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "totalRefereeGeneratedRewards": - out.Values[i] = ec._ReferralSetReferee_totalRefereeGeneratedRewards(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123675,34 +131195,43 @@ var referralSetRefereeConnectionImplementors = []string{"ReferralSetRefereeConne func (ec *executionContext) _ReferralSetRefereeConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.ReferralSetRefereeConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, referralSetRefereeConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ReferralSetRefereeConnection") case "edges": - out.Values[i] = ec._ReferralSetRefereeConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._ReferralSetRefereeConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123710,34 +131239,43 @@ var referralSetRefereeEdgeImplementors = []string{"ReferralSetRefereeEdge"} func (ec *executionContext) _ReferralSetRefereeEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.ReferralSetRefereeEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, referralSetRefereeEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ReferralSetRefereeEdge") case "node": - out.Values[i] = ec._ReferralSetRefereeEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._ReferralSetRefereeEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123745,8 +131283,9 @@ var referralSetStatsImplementors = []string{"ReferralSetStats"} func (ec *executionContext) _ReferralSetStats(ctx context.Context, sel ast.SelectionSet, obj *v2.ReferralSetStats) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, referralSetStatsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -123754,7 +131293,7 @@ func (ec *executionContext) _ReferralSetStats(ctx context.Context, sel ast.Selec case "atEpoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123762,86 +131301,96 @@ func (ec *executionContext) _ReferralSetStats(ctx context.Context, sel ast.Selec }() res = ec._ReferralSetStats_atEpoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "partyId": + // 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": out.Values[i] = ec._ReferralSetStats_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "wasEligible": - out.Values[i] = ec._ReferralSetStats_wasEligible(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "discountFactor": - out.Values[i] = ec._ReferralSetStats_discountFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "rewardFactor": - out.Values[i] = ec._ReferralSetStats_rewardFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "epochNotionalTakerVolume": - out.Values[i] = ec._ReferralSetStats_epochNotionalTakerVolume(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "referralSetRunningNotionalTakerVolume": - out.Values[i] = ec._ReferralSetStats_referralSetRunningNotionalTakerVolume(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "rewardsMultiplier": - out.Values[i] = ec._ReferralSetStats_rewardsMultiplier(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "rewardsFactorMultiplier": - out.Values[i] = ec._ReferralSetStats_rewardsFactorMultiplier(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "referrerTakerVolume": - out.Values[i] = ec._ReferralSetStats_referrerTakerVolume(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123849,34 +131398,43 @@ var referralSetStatsConnectionImplementors = []string{"ReferralSetStatsConnectio func (ec *executionContext) _ReferralSetStatsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.ReferralSetStatsConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, referralSetStatsConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ReferralSetStatsConnection") case "edges": - out.Values[i] = ec._ReferralSetStatsConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._ReferralSetStatsConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123884,34 +131442,43 @@ var referralSetStatsEdgeImplementors = []string{"ReferralSetStatsEdge"} func (ec *executionContext) _ReferralSetStatsEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.ReferralSetStatsEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, referralSetStatsEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ReferralSetStatsEdge") case "node": - out.Values[i] = ec._ReferralSetStatsEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._ReferralSetStatsEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123919,8 +131486,9 @@ var referrerRewardsGeneratedImplementors = []string{"ReferrerRewardsGenerated"} func (ec *executionContext) _ReferrerRewardsGenerated(ctx context.Context, sel ast.SelectionSet, obj *v1.ReferrerRewardsGenerated) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, referrerRewardsGeneratedImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -123928,7 +131496,7 @@ func (ec *executionContext) _ReferrerRewardsGenerated(ctx context.Context, sel a case "referrerId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123936,30 +131504,56 @@ func (ec *executionContext) _ReferrerRewardsGenerated(ctx context.Context, sel a }() res = ec._ReferrerRewardsGenerated_referrerId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "generatedReward": + // 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 "generatedReward": out.Values[i] = ec._ReferrerRewardsGenerated_generatedReward(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -123967,8 +131561,9 @@ var rewardImplementors = []string{"Reward"} func (ec *executionContext) _Reward(ctx context.Context, sel ast.SelectionSet, obj *vega.Reward) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, rewardImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -123976,7 +131571,7 @@ func (ec *executionContext) _Reward(ctx context.Context, sel ast.SelectionSet, o case "asset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -123984,26 +131579,40 @@ func (ec *executionContext) _Reward(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Reward_asset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "marketId": + // 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 "marketId": out.Values[i] = ec._Reward_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "rewardType": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -124011,19 +131620,35 @@ func (ec *executionContext) _Reward(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Reward_rewardType(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -124031,19 +131656,35 @@ func (ec *executionContext) _Reward(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Reward_party(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "epoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -124051,47 +131692,55 @@ func (ec *executionContext) _Reward(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Reward_epoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "amount": + // 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._Reward_amount(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "quantumAmount": - out.Values[i] = ec._Reward_quantumAmount(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "percentageOfTotal": - out.Values[i] = ec._Reward_percentageOfTotal(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "receivedAt": - out.Values[i] = ec._Reward_receivedAt(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "lockedUntilEpoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -124099,31 +131748,55 @@ func (ec *executionContext) _Reward(ctx context.Context, sel ast.SelectionSet, o }() res = ec._Reward_lockedUntilEpoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "gameId": + // 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 "gameId": out.Values[i] = ec._Reward_gameId(ctx, field, obj) - case "teamId": - out.Values[i] = ec._Reward_teamId(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -124131,34 +131804,43 @@ var rewardEdgeImplementors = []string{"RewardEdge"} func (ec *executionContext) _RewardEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.RewardEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, rewardEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("RewardEdge") case "node": - out.Values[i] = ec._RewardEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._RewardEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -124166,62 +131848,63 @@ var rewardScoreImplementors = []string{"RewardScore"} func (ec *executionContext) _RewardScore(ctx context.Context, sel ast.SelectionSet, obj *vega.RewardScore) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, rewardScoreImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("RewardScore") case "rawValidatorScore": - out.Values[i] = ec._RewardScore_rawValidatorScore(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "performanceScore": - out.Values[i] = ec._RewardScore_performanceScore(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "multisigScore": - out.Values[i] = ec._RewardScore_multisigScore(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "validatorScore": - out.Values[i] = ec._RewardScore_validatorScore(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "normalisedScore": - out.Values[i] = ec._RewardScore_normalisedScore(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "validatorStatus": - out.Values[i] = ec._RewardScore_validatorStatus(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -124229,8 +131912,9 @@ 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) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -124238,7 +131922,7 @@ func (ec *executionContext) _RewardSummary(ctx context.Context, sel ast.Selectio case "asset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -124246,26 +131930,40 @@ func (ec *executionContext) _RewardSummary(ctx context.Context, sel ast.Selectio }() res = ec._RewardSummary_asset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "amount": + // 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(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "rewardsConnection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -124275,18 +131973,46 @@ func (ec *executionContext) _RewardSummary(ctx context.Context, sel ast.Selectio return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -124294,31 +132020,40 @@ 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) - var invalids uint32 + 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 { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -124326,34 +132061,43 @@ 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) - var invalids uint32 + 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 { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._RewardSummaryEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -124361,28 +132105,37 @@ var rewardsConnectionImplementors = []string{"RewardsConnection"} 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) - var invalids uint32 + 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() - if invalids > 0 { + 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 } @@ -124390,41 +132143,48 @@ 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) - var invalids uint32 + 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 { - invalids++ + out.Invalids++ } case "short": - out.Values[i] = ec._RiskFactor_short(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "long": - out.Values[i] = ec._RiskFactor_long(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -124432,41 +132192,48 @@ var scalingFactorsImplementors = []string{"ScalingFactors"} func (ec *executionContext) _ScalingFactors(ctx context.Context, sel ast.SelectionSet, obj *vega.ScalingFactors) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, scalingFactorsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("ScalingFactors") case "searchLevel": - out.Values[i] = ec._ScalingFactors_searchLevel(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "initialMargin": - out.Values[i] = ec._ScalingFactors_initialMargin(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "collateralRelease": - out.Values[i] = ec._ScalingFactors_collateralRelease(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -124474,48 +132241,53 @@ var settleDistressedImplementors = []string{"SettleDistressed"} func (ec *executionContext) _SettleDistressed(ctx context.Context, sel ast.SelectionSet, obj *SettleDistressed) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, settleDistressedImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("SettleDistressed") case "marketId": - out.Values[i] = ec._SettleDistressed_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "partyId": - out.Values[i] = ec._SettleDistressed_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "margin": - out.Values[i] = ec._SettleDistressed_margin(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "price": - out.Values[i] = ec._SettleDistressed_price(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -124523,45 +132295,50 @@ var settlePositionImplementors = []string{"SettlePosition"} func (ec *executionContext) _SettlePosition(ctx context.Context, sel ast.SelectionSet, obj *SettlePosition) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, settlePositionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("SettlePosition") case "marketId": - out.Values[i] = ec._SettlePosition_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "partyId": - out.Values[i] = ec._SettlePosition_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "price": - out.Values[i] = ec._SettlePosition_price(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "tradeSettlements": - out.Values[i] = ec._SettlePosition_tradeSettlements(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -124569,27 +132346,38 @@ var signerImplementors = []string{"Signer"} func (ec *executionContext) _Signer(ctx context.Context, sel ast.SelectionSet, obj *Signer) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, signerImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Signer") case "signer": - out.Values[i] = ec._Signer_signer(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -124597,27 +132385,38 @@ var simpleRiskModelImplementors = []string{"SimpleRiskModel", "RiskModel"} func (ec *executionContext) _SimpleRiskModel(ctx context.Context, sel ast.SelectionSet, obj *vega.SimpleRiskModel) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, simpleRiskModelImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("SimpleRiskModel") case "params": - out.Values[i] = ec._SimpleRiskModel_params(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -124625,34 +132424,43 @@ var simpleRiskModelParamsImplementors = []string{"SimpleRiskModelParams"} func (ec *executionContext) _SimpleRiskModelParams(ctx context.Context, sel ast.SelectionSet, obj *vega.SimpleModelParams) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, simpleRiskModelParamsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("SimpleRiskModelParams") case "factorLong": - out.Values[i] = ec._SimpleRiskModelParams_factorLong(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "factorShort": - out.Values[i] = ec._SimpleRiskModelParams_factorShort(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -124660,27 +132468,38 @@ var specBindingForCompositePriceImplementors = []string{"SpecBindingForComposite func (ec *executionContext) _SpecBindingForCompositePrice(ctx context.Context, sel ast.SelectionSet, obj *SpecBindingForCompositePrice) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, specBindingForCompositePriceImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("SpecBindingForCompositePrice") case "priceSourceProperty": - out.Values[i] = ec._SpecBindingForCompositePrice_priceSourceProperty(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -124688,8 +132507,9 @@ var spotImplementors = []string{"Spot", "Product"} func (ec *executionContext) _Spot(ctx context.Context, sel ast.SelectionSet, obj *vega.Spot) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, spotImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -124697,7 +132517,7 @@ func (ec *executionContext) _Spot(ctx context.Context, sel ast.SelectionSet, obj case "baseAsset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -124705,19 +132525,35 @@ func (ec *executionContext) _Spot(ctx context.Context, sel ast.SelectionSet, obj }() res = ec._Spot_baseAsset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "quoteAsset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -124725,30 +132561,51 @@ func (ec *executionContext) _Spot(ctx context.Context, sel ast.SelectionSet, obj }() res = ec._Spot_quoteAsset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(ctx) - - }) - case "name": - - out.Values[i] = ec._Spot_name(ctx, field, obj) + 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) + }) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + // 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() - if invalids > 0 { + 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 } @@ -124756,8 +132613,9 @@ var spotProductImplementors = []string{"SpotProduct", "ProductConfiguration"} func (ec *executionContext) _SpotProduct(ctx context.Context, sel ast.SelectionSet, obj *vega.SpotProduct) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, spotProductImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -124765,7 +132623,7 @@ func (ec *executionContext) _SpotProduct(ctx context.Context, sel ast.SelectionS case "baseAsset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -124773,19 +132631,35 @@ func (ec *executionContext) _SpotProduct(ctx context.Context, sel ast.SelectionS }() res = ec._SpotProduct_baseAsset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "quoteAsset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -124793,30 +132667,51 @@ func (ec *executionContext) _SpotProduct(ctx context.Context, sel ast.SelectionS }() res = ec._SpotProduct_quoteAsset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(ctx) - - }) - case "name": - - out.Values[i] = ec._SpotProduct_name(ctx, field, obj) + 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) + }) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + // 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() - if invalids > 0 { + 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 } @@ -124824,30 +132719,27 @@ var stakeLinkingImplementors = []string{"StakeLinking"} func (ec *executionContext) _StakeLinking(ctx context.Context, sel ast.SelectionSet, obj *v1.StakeLinking) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, stakeLinkingImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("StakeLinking") case "id": - out.Values[i] = ec._StakeLinking_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "type": - out.Values[i] = ec._StakeLinking_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "timestamp": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -124855,19 +132747,35 @@ func (ec *executionContext) _StakeLinking(ctx context.Context, sel ast.Selection }() res = ec._StakeLinking_timestamp(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -124875,44 +132783,52 @@ func (ec *executionContext) _StakeLinking(ctx context.Context, sel ast.Selection }() res = ec._StakeLinking_party(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "amount": + // 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._StakeLinking_amount(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "status": - out.Values[i] = ec._StakeLinking_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "finalizedAt": - out.Values[i] = ec._StakeLinking_finalizedAt(ctx, field, obj) - case "txHash": - out.Values[i] = ec._StakeLinking_txHash(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "blockHeight": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -124920,23 +132836,51 @@ func (ec *executionContext) _StakeLinking(ctx context.Context, sel ast.Selection }() res = ec._StakeLinking_blockHeight(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -124944,34 +132888,43 @@ var stakeLinkingEdgeImplementors = []string{"StakeLinkingEdge"} func (ec *executionContext) _StakeLinkingEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.StakeLinkingEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, stakeLinkingEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("StakeLinkingEdge") case "node": - out.Values[i] = ec._StakeLinkingEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._StakeLinkingEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -124979,31 +132932,40 @@ var stakesConnectionImplementors = []string{"StakesConnection"} func (ec *executionContext) _StakesConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.StakesConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, stakesConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("StakesConnection") case "edges": - out.Values[i] = ec._StakesConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._StakesConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -125011,34 +132973,43 @@ var stakingSummaryImplementors = []string{"StakingSummary"} func (ec *executionContext) _StakingSummary(ctx context.Context, sel ast.SelectionSet, obj *StakingSummary) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, stakingSummaryImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("StakingSummary") case "currentStakeAvailable": - out.Values[i] = ec._StakingSummary_currentStakeAvailable(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "linkings": - out.Values[i] = ec._StakingSummary_linkings(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -125046,34 +133017,43 @@ var stakingTierImplementors = []string{"StakingTier"} func (ec *executionContext) _StakingTier(ctx context.Context, sel ast.SelectionSet, obj *vega.StakingTier) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, stakingTierImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("StakingTier") case "minimumStakedTokens": - out.Values[i] = ec._StakingTier_minimumStakedTokens(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "referralRewardMultiplier": - out.Values[i] = ec._StakingTier_referralRewardMultiplier(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -125081,8 +133061,9 @@ var statisticsImplementors = []string{"Statistics"} func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSet, obj *v12.Statistics) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, statisticsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -125090,7 +133071,7 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe case "blockHeight": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125098,26 +133079,40 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_blockHeight(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "blockHash": + // 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 "blockHash": out.Values[i] = ec._Statistics_blockHash(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "backlogLength": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125125,19 +133120,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_backlogLength(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "totalPeers": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125145,19 +133156,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_totalPeers(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "genesisTime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125165,19 +133192,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_genesisTime(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "currentTime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125185,26 +133228,40 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_currentTime(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "upTime": + // 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 "upTime": out.Values[i] = ec._Statistics_upTime(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "vegaTime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125212,19 +133269,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_vegaTime(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "status": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125232,19 +133305,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_status(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "txPerBlock": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125252,19 +133341,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_txPerBlock(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "averageTxBytes": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125272,19 +133377,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_averageTxBytes(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "averageOrdersPerBlock": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125292,19 +133413,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_averageOrdersPerBlock(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "tradesPerSecond": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125312,19 +133449,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_tradesPerSecond(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "ordersPerSecond": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125332,19 +133485,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_ordersPerSecond(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "totalMarkets": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125352,19 +133521,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_totalMarkets(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "totalAmendOrder": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125372,19 +133557,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_totalAmendOrder(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "totalCancelOrder": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125392,19 +133593,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_totalCancelOrder(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "totalCreateOrder": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125412,19 +133629,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_totalCreateOrder(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "totalOrders": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125432,19 +133665,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_totalOrders(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "totalTrades": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125452,19 +133701,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_totalTrades(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "eventCount": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125472,19 +133737,35 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_eventCount(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "eventsPerSecond": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125492,40 +133773,50 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_eventsPerSecond(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "appVersionHash": + // 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 "appVersionHash": out.Values[i] = ec._Statistics_appVersionHash(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "appVersion": - out.Values[i] = ec._Statistics_appVersion(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "chainVersion": - out.Values[i] = ec._Statistics_chainVersion(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "blockDuration": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125533,30 +133824,56 @@ func (ec *executionContext) _Statistics(ctx context.Context, sel ast.SelectionSe }() res = ec._Statistics_blockDuration(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "chainId": + // 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 "chainId": out.Values[i] = ec._Statistics_chainId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -125564,8 +133881,9 @@ var stopOrderImplementors = []string{"StopOrder"} func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet, obj *v1.StopOrderEvent) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, stopOrderImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -125573,7 +133891,7 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet case "id": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125581,19 +133899,35 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet }() res = ec._StopOrder_id(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "ocoLinkId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125603,14 +133937,30 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "expiresAt": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125620,14 +133970,30 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "expiryStrategy": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125637,14 +134003,30 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "triggerDirection": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125652,19 +134034,35 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet }() res = ec._StopOrder_triggerDirection(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "status": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125672,19 +134070,35 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet }() res = ec._StopOrder_status(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "createdAt": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125692,19 +134106,35 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet }() res = ec._StopOrder_createdAt(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "updatedAt": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125714,14 +134144,30 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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) (res graphql.Marshaler) { + 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)) @@ -125729,19 +134175,35 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet }() res = ec._StopOrder_partyId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "marketId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125749,19 +134211,35 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet }() res = ec._StopOrder_marketId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "trigger": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125769,26 +134247,40 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet }() res = ec._StopOrder_trigger(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "submission": + // 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 "submission": out.Values[i] = ec._StopOrder_submission(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "order": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125798,14 +134290,30 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "rejectionReason": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125815,14 +134323,30 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "sizeOverrideSetting": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125830,19 +134354,35 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet }() res = ec._StopOrder_sizeOverrideSetting(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "sizeOverrideValue": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -125852,18 +134392,46 @@ func (ec *executionContext) _StopOrder(ctx context.Context, sel ast.SelectionSet return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -125871,28 +134439,37 @@ var stopOrderConnectionImplementors = []string{"StopOrderConnection"} func (ec *executionContext) _StopOrderConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.StopOrderConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, stopOrderConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("StopOrderConnection") case "edges": - out.Values[i] = ec._StopOrderConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._StopOrderConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -125900,28 +134477,37 @@ var stopOrderEdgeImplementors = []string{"StopOrderEdge"} func (ec *executionContext) _StopOrderEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.StopOrderEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, stopOrderEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("StopOrderEdge") case "node": - out.Values[i] = ec._StopOrderEdge_node(ctx, field, obj) - case "cursor": - out.Values[i] = ec._StopOrderEdge_cursor(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -125929,27 +134515,38 @@ var stopOrderPriceImplementors = []string{"StopOrderPrice", "StopOrderTrigger"} func (ec *executionContext) _StopOrderPrice(ctx context.Context, sel ast.SelectionSet, obj *StopOrderPrice) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, stopOrderPriceImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("StopOrderPrice") case "price": - out.Values[i] = ec._StopOrderPrice_price(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -125957,27 +134554,38 @@ var stopOrderTrailingPercentOffsetImplementors = []string{"StopOrderTrailingPerc func (ec *executionContext) _StopOrderTrailingPercentOffset(ctx context.Context, sel ast.SelectionSet, obj *StopOrderTrailingPercentOffset) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, stopOrderTrailingPercentOffsetImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("StopOrderTrailingPercentOffset") case "trailingPercentOffset": - out.Values[i] = ec._StopOrderTrailingPercentOffset_trailingPercentOffset(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126031,34 +134639,43 @@ var successorConfigurationImplementors = []string{"SuccessorConfiguration"} func (ec *executionContext) _SuccessorConfiguration(ctx context.Context, sel ast.SelectionSet, obj *vega.SuccessorConfiguration) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, successorConfigurationImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("SuccessorConfiguration") case "parentMarketId": - out.Values[i] = ec._SuccessorConfiguration_parentMarketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "insurancePoolFraction": - out.Values[i] = ec._SuccessorConfiguration_insurancePoolFraction(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126066,31 +134683,40 @@ var successorMarketImplementors = []string{"SuccessorMarket"} func (ec *executionContext) _SuccessorMarket(ctx context.Context, sel ast.SelectionSet, obj *v2.SuccessorMarket) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, successorMarketImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("SuccessorMarket") case "market": - out.Values[i] = ec._SuccessorMarket_market(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "proposals": - out.Values[i] = ec._SuccessorMarket_proposals(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126098,34 +134724,43 @@ var successorMarketConnectionImplementors = []string{"SuccessorMarketConnection" func (ec *executionContext) _SuccessorMarketConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.SuccessorMarketConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, successorMarketConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("SuccessorMarketConnection") case "edges": - out.Values[i] = ec._SuccessorMarketConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._SuccessorMarketConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126133,34 +134768,43 @@ var successorMarketEdgeImplementors = []string{"SuccessorMarketEdge"} func (ec *executionContext) _SuccessorMarketEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.SuccessorMarketEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, successorMarketEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("SuccessorMarketEdge") case "node": - out.Values[i] = ec._SuccessorMarketEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._SuccessorMarketEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126168,34 +134812,43 @@ var targetStakeParametersImplementors = []string{"TargetStakeParameters"} func (ec *executionContext) _TargetStakeParameters(ctx context.Context, sel ast.SelectionSet, obj *TargetStakeParameters) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, targetStakeParametersImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TargetStakeParameters") case "timeWindow": - out.Values[i] = ec._TargetStakeParameters_timeWindow(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "scalingFactor": - out.Values[i] = ec._TargetStakeParameters_scalingFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126203,51 +134856,42 @@ var teamImplementors = []string{"Team"} func (ec *executionContext) _Team(ctx context.Context, sel ast.SelectionSet, obj *v2.Team) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Team") case "teamId": - out.Values[i] = ec._Team_teamId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "referrer": - out.Values[i] = ec._Team_referrer(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "name": - out.Values[i] = ec._Team_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "teamUrl": - out.Values[i] = ec._Team_teamUrl(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "avatarUrl": - out.Values[i] = ec._Team_avatarUrl(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "totalMembers": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -126255,26 +134899,40 @@ func (ec *executionContext) _Team(ctx context.Context, sel ast.SelectionSet, obj }() res = ec._Team_totalMembers(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "createdAt": + // 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 "createdAt": out.Values[i] = ec._Team_createdAt(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "createdAtEpoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -126282,37 +134940,61 @@ func (ec *executionContext) _Team(ctx context.Context, sel ast.SelectionSet, obj }() res = ec._Team_createdAtEpoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "closed": + // 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 "closed": out.Values[i] = ec._Team_closed(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "allowList": - out.Values[i] = ec._Team_allowList(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126320,34 +135002,43 @@ var teamConnectionImplementors = []string{"TeamConnection"} func (ec *executionContext) _TeamConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamConnection") case "edges": - out.Values[i] = ec._TeamConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._TeamConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126355,34 +135046,43 @@ var teamEdgeImplementors = []string{"TeamEdge"} func (ec *executionContext) _TeamEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamEdge") case "node": - out.Values[i] = ec._TeamEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._TeamEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126390,76 +135090,73 @@ var teamGameEntityImplementors = []string{"TeamGameEntity", "GameEntity"} func (ec *executionContext) _TeamGameEntity(ctx context.Context, sel ast.SelectionSet, obj *TeamGameEntity) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamGameEntityImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamGameEntity") case "team": - out.Values[i] = ec._TeamGameEntity_team(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "rank": - out.Values[i] = ec._TeamGameEntity_rank(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "volume": - out.Values[i] = ec._TeamGameEntity_volume(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "rewardMetric": - out.Values[i] = ec._TeamGameEntity_rewardMetric(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "rewardEarned": - out.Values[i] = ec._TeamGameEntity_rewardEarned(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalRewardsEarned": - out.Values[i] = ec._TeamGameEntity_totalRewardsEarned(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "rewardEarnedQuantum": - out.Values[i] = ec._TeamGameEntity_rewardEarnedQuantum(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "totalRewardsEarnedQuantum": - out.Values[i] = ec._TeamGameEntity_totalRewardsEarnedQuantum(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126467,51 +135164,42 @@ var teamMemberStatisticsImplementors = []string{"TeamMemberStatistics"} func (ec *executionContext) _TeamMemberStatistics(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamMemberStatistics) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamMemberStatisticsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamMemberStatistics") case "partyId": - out.Values[i] = ec._TeamMemberStatistics_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "totalQuantumVolume": - out.Values[i] = ec._TeamMemberStatistics_totalQuantumVolume(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "quantumVolumes": - out.Values[i] = ec._TeamMemberStatistics_quantumVolumes(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "totalQuantumRewards": - out.Values[i] = ec._TeamMemberStatistics_totalQuantumRewards(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "quantumRewards": - out.Values[i] = ec._TeamMemberStatistics_quantumRewards(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "totalGamesPlayed": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -126519,30 +135207,56 @@ func (ec *executionContext) _TeamMemberStatistics(ctx context.Context, sel ast.S }() res = ec._TeamMemberStatistics_totalGamesPlayed(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "gamesPlayed": - out.Values[i] = ec._TeamMemberStatistics_gamesPlayed(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126550,34 +135264,43 @@ var teamMemberStatisticsEdgeImplementors = []string{"TeamMemberStatisticsEdge"} func (ec *executionContext) _TeamMemberStatisticsEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamMemberStatisticsEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamMemberStatisticsEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamMemberStatisticsEdge") case "node": - out.Values[i] = ec._TeamMemberStatisticsEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._TeamMemberStatisticsEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126585,34 +135308,43 @@ var teamMembersStatisticsConnectionImplementors = []string{"TeamMembersStatistic func (ec *executionContext) _TeamMembersStatisticsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamMembersStatisticsConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamMembersStatisticsConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamMembersStatisticsConnection") case "edges": - out.Values[i] = ec._TeamMembersStatisticsConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._TeamMembersStatisticsConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126620,34 +135352,43 @@ var teamParticipationImplementors = []string{"TeamParticipation"} func (ec *executionContext) _TeamParticipation(ctx context.Context, sel ast.SelectionSet, obj *TeamParticipation) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamParticipationImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamParticipation") case "teamId": - out.Values[i] = ec._TeamParticipation_teamId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "membersParticipating": - out.Values[i] = ec._TeamParticipation_membersParticipating(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126655,37 +135396,32 @@ var teamRefereeImplementors = []string{"TeamReferee"} func (ec *executionContext) _TeamReferee(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamReferee) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamRefereeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamReferee") case "teamId": - out.Values[i] = ec._TeamReferee_teamId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "referee": - out.Values[i] = ec._TeamReferee_referee(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "joinedAt": - out.Values[i] = ec._TeamReferee_joinedAt(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "joinedAtEpoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -126693,23 +135429,51 @@ func (ec *executionContext) _TeamReferee(ctx context.Context, sel ast.SelectionS }() res = ec._TeamReferee_joinedAtEpoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -126717,34 +135481,43 @@ var teamRefereeConnectionImplementors = []string{"TeamRefereeConnection"} func (ec *executionContext) _TeamRefereeConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamRefereeConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamRefereeConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamRefereeConnection") case "edges": - out.Values[i] = ec._TeamRefereeConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._TeamRefereeConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126752,34 +135525,43 @@ var teamRefereeEdgeImplementors = []string{"TeamRefereeEdge"} func (ec *executionContext) _TeamRefereeEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamRefereeEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamRefereeEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamRefereeEdge") case "node": - out.Values[i] = ec._TeamRefereeEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._TeamRefereeEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126787,30 +135569,27 @@ var teamRefereeHistoryImplementors = []string{"TeamRefereeHistory"} func (ec *executionContext) _TeamRefereeHistory(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamRefereeHistory) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamRefereeHistoryImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamRefereeHistory") case "teamId": - out.Values[i] = ec._TeamRefereeHistory_teamId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "joinedAt": - out.Values[i] = ec._TeamRefereeHistory_joinedAt(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "joinedAtEpoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -126818,23 +135597,51 @@ func (ec *executionContext) _TeamRefereeHistory(ctx context.Context, sel ast.Sel }() res = ec._TeamRefereeHistory_joinedAtEpoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -126842,34 +135649,43 @@ var teamRefereeHistoryConnectionImplementors = []string{"TeamRefereeHistoryConne func (ec *executionContext) _TeamRefereeHistoryConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamRefereeHistoryConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamRefereeHistoryConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamRefereeHistoryConnection") case "edges": - out.Values[i] = ec._TeamRefereeHistoryConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._TeamRefereeHistoryConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126877,34 +135693,43 @@ var teamRefereeHistoryEdgeImplementors = []string{"TeamRefereeHistoryEdge"} func (ec *executionContext) _TeamRefereeHistoryEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamRefereeHistoryEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamRefereeHistoryEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamRefereeHistoryEdge") case "node": - out.Values[i] = ec._TeamRefereeHistoryEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._TeamRefereeHistoryEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126912,51 +135737,42 @@ var teamStatisticsImplementors = []string{"TeamStatistics"} func (ec *executionContext) _TeamStatistics(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamStatistics) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamStatisticsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamStatistics") case "teamId": - out.Values[i] = ec._TeamStatistics_teamId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "totalQuantumVolume": - out.Values[i] = ec._TeamStatistics_totalQuantumVolume(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "quantumVolumes": - out.Values[i] = ec._TeamStatistics_quantumVolumes(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "totalQuantumRewards": - out.Values[i] = ec._TeamStatistics_totalQuantumRewards(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "quantumRewards": - out.Values[i] = ec._TeamStatistics_quantumRewards(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "totalGamesPlayed": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -126964,30 +135780,56 @@ func (ec *executionContext) _TeamStatistics(ctx context.Context, sel ast.Selecti }() res = ec._TeamStatistics_totalGamesPlayed(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "gamesPlayed": + // 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 "gamesPlayed": out.Values[i] = ec._TeamStatistics_gamesPlayed(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -126995,34 +135837,43 @@ var teamStatisticsEdgeImplementors = []string{"TeamStatisticsEdge"} func (ec *executionContext) _TeamStatisticsEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamStatisticsEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamStatisticsEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamStatisticsEdge") case "node": - out.Values[i] = ec._TeamStatisticsEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._TeamStatisticsEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -127030,34 +135881,43 @@ var teamsStatisticsConnectionImplementors = []string{"TeamsStatisticsConnection" func (ec *executionContext) _TeamsStatisticsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.TeamsStatisticsConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, teamsStatisticsConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TeamsStatisticsConnection") case "edges": - out.Values[i] = ec._TeamsStatisticsConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._TeamsStatisticsConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -127065,27 +135925,38 @@ var timeUpdateImplementors = []string{"TimeUpdate", "Event"} func (ec *executionContext) _TimeUpdate(ctx context.Context, sel ast.SelectionSet, obj *TimeUpdate) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, timeUpdateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TimeUpdate") case "timestamp": - out.Values[i] = ec._TimeUpdate_timestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -127093,37 +135964,32 @@ var timeWeightedNotionalPositionImplementors = []string{"TimeWeightedNotionalPos func (ec *executionContext) _TimeWeightedNotionalPosition(ctx context.Context, sel ast.SelectionSet, obj *v2.TimeWeightedNotionalPosition) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, timeWeightedNotionalPositionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TimeWeightedNotionalPosition") case "assetId": - out.Values[i] = ec._TimeWeightedNotionalPosition_assetId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "partyId": - out.Values[i] = ec._TimeWeightedNotionalPosition_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "gameId": - out.Values[i] = ec._TimeWeightedNotionalPosition_gameId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "epoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127131,37 +135997,61 @@ func (ec *executionContext) _TimeWeightedNotionalPosition(ctx context.Context, s }() res = ec._TimeWeightedNotionalPosition_epoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "timeWeightedNotionalPosition": + // 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 "timeWeightedNotionalPosition": out.Values[i] = ec._TimeWeightedNotionalPosition_timeWeightedNotionalPosition(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "lastUpdated": - out.Values[i] = ec._TimeWeightedNotionalPosition_lastUpdated(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -127169,27 +136059,38 @@ var totalTransferFeeDiscountImplementors = []string{"TotalTransferFeeDiscount"} func (ec *executionContext) _TotalTransferFeeDiscount(ctx context.Context, sel ast.SelectionSet, obj *v2.GetTotalTransferFeeDiscountResponse) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, totalTransferFeeDiscountImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TotalTransferFeeDiscount") case "totalDiscount": - out.Values[i] = ec._TotalTransferFeeDiscount_totalDiscount(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -127197,23 +136098,22 @@ var tradableInstrumentImplementors = []string{"TradableInstrument"} func (ec *executionContext) _TradableInstrument(ctx context.Context, sel ast.SelectionSet, obj *vega.TradableInstrument) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, tradableInstrumentImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TradableInstrument") case "instrument": - out.Values[i] = ec._TradableInstrument_instrument(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "riskModel": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127221,27 +136121,53 @@ func (ec *executionContext) _TradableInstrument(ctx context.Context, sel ast.Sel }() res = ec._TradableInstrument_riskModel(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "marginCalculator": + // 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 "marginCalculator": out.Values[i] = ec._TradableInstrument_marginCalculator(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -127249,23 +136175,22 @@ var tradeImplementors = []string{"Trade"} func (ec *executionContext) _Trade(ctx context.Context, sel ast.SelectionSet, obj *vega.Trade) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, tradeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Trade") case "id": - out.Values[i] = ec._Trade_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "market": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127273,33 +136198,45 @@ func (ec *executionContext) _Trade(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Trade_market(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "buyOrder": + // 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 "buyOrder": out.Values[i] = ec._Trade_buyOrder(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "sellOrder": - out.Values[i] = ec._Trade_sellOrder(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "buyer": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127307,19 +136244,35 @@ func (ec *executionContext) _Trade(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Trade_buyer(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "seller": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127327,33 +136280,45 @@ func (ec *executionContext) _Trade(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Trade_seller(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "aggressor": + // 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 "aggressor": out.Values[i] = ec._Trade_aggressor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "price": - out.Values[i] = ec._Trade_price(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "size": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127361,19 +136326,35 @@ func (ec *executionContext) _Trade(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Trade_size(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "createdAt": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127381,26 +136362,40 @@ func (ec *executionContext) _Trade(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Trade_createdAt(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "type": + // 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 "type": out.Values[i] = ec._Trade_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "buyerFee": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127408,19 +136403,35 @@ func (ec *executionContext) _Trade(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Trade_buyerFee(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "sellerFee": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127428,19 +136439,35 @@ func (ec *executionContext) _Trade(ctx context.Context, sel ast.SelectionSet, ob }() res = ec._Trade_sellerFee(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "buyerAuctionBatch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127450,14 +136477,30 @@ func (ec *executionContext) _Trade(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "sellerAuctionBatch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127467,18 +136510,46 @@ func (ec *executionContext) _Trade(ctx context.Context, sel ast.SelectionSet, ob return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -127486,34 +136557,43 @@ var tradeConnectionImplementors = []string{"TradeConnection"} func (ec *executionContext) _TradeConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.TradeConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, tradeConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TradeConnection") case "edges": - out.Values[i] = ec._TradeConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._TradeConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -127521,34 +136601,43 @@ var tradeEdgeImplementors = []string{"TradeEdge"} func (ec *executionContext) _TradeEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.TradeEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, tradeEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TradeEdge") case "node": - out.Values[i] = ec._TradeEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._TradeEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -127556,65 +136645,60 @@ var tradeFeeImplementors = []string{"TradeFee"} func (ec *executionContext) _TradeFee(ctx context.Context, sel ast.SelectionSet, obj *TradeFee) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, tradeFeeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TradeFee") case "makerFee": - out.Values[i] = ec._TradeFee_makerFee(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "infrastructureFee": - out.Values[i] = ec._TradeFee_infrastructureFee(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "liquidityFee": - out.Values[i] = ec._TradeFee_liquidityFee(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "makerFeeReferralDiscount": - out.Values[i] = ec._TradeFee_makerFeeReferralDiscount(ctx, field, obj) - case "makerFeeVolumeDiscount": - out.Values[i] = ec._TradeFee_makerFeeVolumeDiscount(ctx, field, obj) - case "infrastructureFeeReferralDiscount": - out.Values[i] = ec._TradeFee_infrastructureFeeReferralDiscount(ctx, field, obj) - case "infrastructureFeeVolumeDiscount": - out.Values[i] = ec._TradeFee_infrastructureFeeVolumeDiscount(ctx, field, obj) - case "liquidityFeeReferralDiscount": - out.Values[i] = ec._TradeFee_liquidityFeeReferralDiscount(ctx, field, obj) - case "liquidityFeeVolumeDiscount": - out.Values[i] = ec._TradeFee_liquidityFeeVolumeDiscount(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -127622,34 +136706,43 @@ var tradeSettlementImplementors = []string{"TradeSettlement"} func (ec *executionContext) _TradeSettlement(ctx context.Context, sel ast.SelectionSet, obj *TradeSettlement) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, tradeSettlementImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TradeSettlement") case "size": - out.Values[i] = ec._TradeSettlement_size(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "price": - out.Values[i] = ec._TradeSettlement_price(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -127657,44 +136750,37 @@ var tradeUpdateImplementors = []string{"TradeUpdate"} func (ec *executionContext) _TradeUpdate(ctx context.Context, sel ast.SelectionSet, obj *vega.Trade) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, tradeUpdateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TradeUpdate") case "id": - out.Values[i] = ec._TradeUpdate_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "marketId": - out.Values[i] = ec._TradeUpdate_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "buyOrder": - out.Values[i] = ec._TradeUpdate_buyOrder(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "sellOrder": - out.Values[i] = ec._TradeUpdate_sellOrder(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "buyerId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127702,19 +136788,35 @@ func (ec *executionContext) _TradeUpdate(ctx context.Context, sel ast.SelectionS }() res = ec._TradeUpdate_buyerId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "sellerId": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127722,33 +136824,45 @@ func (ec *executionContext) _TradeUpdate(ctx context.Context, sel ast.SelectionS }() res = ec._TradeUpdate_sellerId(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "aggressor": + // 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 "aggressor": out.Values[i] = ec._TradeUpdate_aggressor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "price": - out.Values[i] = ec._TradeUpdate_price(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "size": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127756,19 +136870,35 @@ func (ec *executionContext) _TradeUpdate(ctx context.Context, sel ast.SelectionS }() res = ec._TradeUpdate_size(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "createdAt": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127776,26 +136906,40 @@ func (ec *executionContext) _TradeUpdate(ctx context.Context, sel ast.SelectionS }() res = ec._TradeUpdate_createdAt(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "type": + // 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 "type": out.Values[i] = ec._TradeUpdate_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "buyerFee": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127803,19 +136947,35 @@ func (ec *executionContext) _TradeUpdate(ctx context.Context, sel ast.SelectionS }() res = ec._TradeUpdate_buyerFee(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "sellerFee": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127823,19 +136983,35 @@ func (ec *executionContext) _TradeUpdate(ctx context.Context, sel ast.SelectionS }() res = ec._TradeUpdate_sellerFee(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "buyerAuctionBatch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127845,14 +137021,30 @@ func (ec *executionContext) _TradeUpdate(ctx context.Context, sel ast.SelectionS return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "sellerAuctionBatch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127862,18 +137054,46 @@ func (ec *executionContext) _TradeUpdate(ctx context.Context, sel ast.SelectionS return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -127881,37 +137101,32 @@ var transactionResultImplementors = []string{"TransactionResult", "Event"} func (ec *executionContext) _TransactionResult(ctx context.Context, sel ast.SelectionSet, obj *v1.TransactionResult) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, transactionResultImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TransactionResult") case "partyId": - out.Values[i] = ec._TransactionResult_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "hash": - out.Values[i] = ec._TransactionResult_hash(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "status": - out.Values[i] = ec._TransactionResult_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "error": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -127921,18 +137136,46 @@ func (ec *executionContext) _TransactionResult(ctx context.Context, sel ast.Sele return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -127940,27 +137183,38 @@ var transactionSubmittedImplementors = []string{"TransactionSubmitted"} func (ec *executionContext) _TransactionSubmitted(ctx context.Context, sel ast.SelectionSet, obj *TransactionSubmitted) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, transactionSubmittedImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TransactionSubmitted") case "success": - out.Values[i] = ec._TransactionSubmitted_success(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -127968,51 +137222,42 @@ var transferImplementors = []string{"Transfer"} func (ec *executionContext) _Transfer(ctx context.Context, sel ast.SelectionSet, obj *v1.Transfer) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, transferImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Transfer") case "id": - out.Values[i] = ec._Transfer_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "from": - out.Values[i] = ec._Transfer_from(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "fromAccountType": - out.Values[i] = ec._Transfer_fromAccountType(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "to": - out.Values[i] = ec._Transfer_to(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "toAccountType": - out.Values[i] = ec._Transfer_toAccountType(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "asset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128022,39 +137267,47 @@ func (ec *executionContext) _Transfer(ctx context.Context, sel ast.SelectionSet, return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "amount": + // 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._Transfer_amount(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "reference": - out.Values[i] = ec._Transfer_reference(ctx, field, obj) - case "status": - out.Values[i] = ec._Transfer_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "timestamp": - out.Values[i] = ec._Transfer_timestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "kind": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128062,31 +137315,55 @@ func (ec *executionContext) _Transfer(ctx context.Context, sel ast.SelectionSet, }() res = ec._Transfer_kind(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "reason": + // 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 "reason": out.Values[i] = ec._Transfer_reason(ctx, field, obj) - case "gameId": - out.Values[i] = ec._Transfer_gameId(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128094,34 +137371,43 @@ var transferBalanceImplementors = []string{"TransferBalance"} func (ec *executionContext) _TransferBalance(ctx context.Context, sel ast.SelectionSet, obj *TransferBalance) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, transferBalanceImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TransferBalance") case "account": - out.Values[i] = ec._TransferBalance_account(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "balance": - out.Values[i] = ec._TransferBalance_balance(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128129,31 +137415,40 @@ var transferConnectionImplementors = []string{"TransferConnection"} func (ec *executionContext) _TransferConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.TransferConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, transferConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TransferConnection") case "edges": - out.Values[i] = ec._TransferConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._TransferConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128161,34 +137456,43 @@ var transferEdgeImplementors = []string{"TransferEdge"} func (ec *executionContext) _TransferEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.TransferEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, transferEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TransferEdge") case "node": - out.Values[i] = ec._TransferEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._TransferEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128196,41 +137500,48 @@ var transferFeeImplementors = []string{"TransferFee"} func (ec *executionContext) _TransferFee(ctx context.Context, sel ast.SelectionSet, obj *TransferFee) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, transferFeeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TransferFee") case "transferId": - out.Values[i] = ec._TransferFee_transferId(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "amount": - out.Values[i] = ec._TransferFee_amount(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "epoch": - out.Values[i] = ec._TransferFee_epoch(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128238,23 +137549,22 @@ var transferNodeImplementors = []string{"TransferNode"} func (ec *executionContext) _TransferNode(ctx context.Context, sel ast.SelectionSet, obj *v2.TransferNode) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, transferNodeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TransferNode") case "transfer": - out.Values[i] = ec._TransferNode_transfer(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "fees": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128264,18 +137574,46 @@ func (ec *executionContext) _TransferNode(ctx context.Context, sel ast.Selection return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -128283,28 +137621,37 @@ var transferResponseImplementors = []string{"TransferResponse"} func (ec *executionContext) _TransferResponse(ctx context.Context, sel ast.SelectionSet, obj *TransferResponse) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, transferResponseImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TransferResponse") case "transfers": - out.Values[i] = ec._TransferResponse_transfers(ctx, field, obj) - case "balances": - out.Values[i] = ec._TransferResponse_balances(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128312,24 +137659,35 @@ var transferResponsesImplementors = []string{"TransferResponses"} func (ec *executionContext) _TransferResponses(ctx context.Context, sel ast.SelectionSet, obj *TransferResponses) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, transferResponsesImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("TransferResponses") case "responses": - out.Values[i] = ec._TransferResponses_responses(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128337,8 +137695,9 @@ var updateAssetImplementors = []string{"UpdateAsset", "ProposalChange"} func (ec *executionContext) _UpdateAsset(ctx context.Context, sel ast.SelectionSet, obj *vega.UpdateAsset) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updateAssetImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -128346,7 +137705,7 @@ func (ec *executionContext) _UpdateAsset(ctx context.Context, sel ast.SelectionS case "quantum": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128354,19 +137713,35 @@ func (ec *executionContext) _UpdateAsset(ctx context.Context, sel ast.SelectionS }() res = ec._UpdateAsset_quantum(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "source": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128374,30 +137749,56 @@ func (ec *executionContext) _UpdateAsset(ctx context.Context, sel ast.SelectionS }() res = ec._UpdateAsset_source(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "assetId": + // 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 "assetId": out.Values[i] = ec._UpdateAsset_assetId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128405,34 +137806,43 @@ var updateERC20Implementors = []string{"UpdateERC20", "UpdateAssetSource"} func (ec *executionContext) _UpdateERC20(ctx context.Context, sel ast.SelectionSet, obj *UpdateErc20) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updateERC20Implementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("UpdateERC20") case "lifetimeLimit": - out.Values[i] = ec._UpdateERC20_lifetimeLimit(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "withdrawThreshold": - out.Values[i] = ec._UpdateERC20_withdrawThreshold(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128440,48 +137850,53 @@ var updateFutureProductImplementors = []string{"UpdateFutureProduct", "UpdatePro func (ec *executionContext) _UpdateFutureProduct(ctx context.Context, sel ast.SelectionSet, obj *vega.UpdateFutureProduct) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updateFutureProductImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("UpdateFutureProduct") case "quoteName": - out.Values[i] = ec._UpdateFutureProduct_quoteName(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "dataSourceSpecForSettlementData": - out.Values[i] = ec._UpdateFutureProduct_dataSourceSpecForSettlementData(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "dataSourceSpecForTradingTermination": - out.Values[i] = ec._UpdateFutureProduct_dataSourceSpecForTradingTermination(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "dataSourceSpecBinding": - out.Values[i] = ec._UpdateFutureProduct_dataSourceSpecBinding(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128489,41 +137904,48 @@ var updateInstrumentConfigurationImplementors = []string{"UpdateInstrumentConfig func (ec *executionContext) _UpdateInstrumentConfiguration(ctx context.Context, sel ast.SelectionSet, obj *UpdateInstrumentConfiguration) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updateInstrumentConfigurationImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("UpdateInstrumentConfiguration") case "code": - out.Values[i] = ec._UpdateInstrumentConfiguration_code(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "name": - out.Values[i] = ec._UpdateInstrumentConfiguration_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "product": - out.Values[i] = ec._UpdateInstrumentConfiguration_product(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128531,23 +137953,22 @@ var updateMarketImplementors = []string{"UpdateMarket", "ProposalChange"} func (ec *executionContext) _UpdateMarket(ctx context.Context, sel ast.SelectionSet, obj *vega.UpdateMarket) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updateMarketImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("UpdateMarket") case "marketId": - out.Values[i] = ec._UpdateMarket_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "updateMarketConfiguration": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128555,23 +137976,51 @@ func (ec *executionContext) _UpdateMarket(ctx context.Context, sel ast.Selection }() res = ec._UpdateMarket_updateMarketConfiguration(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -128579,8 +138028,9 @@ var updateMarketConfigurationImplementors = []string{"UpdateMarketConfiguration" func (ec *executionContext) _UpdateMarketConfiguration(ctx context.Context, sel ast.SelectionSet, obj *vega.UpdateMarketConfiguration) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updateMarketConfigurationImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -128588,7 +138038,7 @@ func (ec *executionContext) _UpdateMarketConfiguration(ctx context.Context, sel case "instrument": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128596,23 +138046,37 @@ func (ec *executionContext) _UpdateMarketConfiguration(ctx context.Context, sel }() res = ec._UpdateMarketConfiguration_instrument(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "metadata": + // 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 "metadata": out.Values[i] = ec._UpdateMarketConfiguration_metadata(ctx, field, obj) - case "priceMonitoringParameters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128620,19 +138084,35 @@ func (ec *executionContext) _UpdateMarketConfiguration(ctx context.Context, sel }() res = ec._UpdateMarketConfiguration_priceMonitoringParameters(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "liquidityMonitoringParameters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128640,19 +138120,35 @@ func (ec *executionContext) _UpdateMarketConfiguration(ctx context.Context, sel }() res = ec._UpdateMarketConfiguration_liquidityMonitoringParameters(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "riskParameters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128660,60 +138156,74 @@ func (ec *executionContext) _UpdateMarketConfiguration(ctx context.Context, sel }() res = ec._UpdateMarketConfiguration_riskParameters(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "linearSlippageFactor": + // 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._UpdateMarketConfiguration_linearSlippageFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "quadraticSlippageFactor": - out.Values[i] = ec._UpdateMarketConfiguration_quadraticSlippageFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "liquiditySLAParameters": - out.Values[i] = ec._UpdateMarketConfiguration_liquiditySLAParameters(ctx, field, obj) - case "liquidityFeeSettings": - out.Values[i] = ec._UpdateMarketConfiguration_liquidityFeeSettings(ctx, field, obj) - case "liquidationStrategy": - out.Values[i] = ec._UpdateMarketConfiguration_liquidationStrategy(ctx, field, obj) - case "markPriceConfiguration": - out.Values[i] = ec._UpdateMarketConfiguration_markPriceConfiguration(ctx, field, obj) - case "tickSize": - out.Values[i] = ec._UpdateMarketConfiguration_tickSize(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128721,24 +138231,35 @@ var updateMarketLogNormalRiskModelImplementors = []string{"UpdateMarketLogNormal func (ec *executionContext) _UpdateMarketLogNormalRiskModel(ctx context.Context, sel ast.SelectionSet, obj *vega.UpdateMarketConfiguration_LogNormal) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updateMarketLogNormalRiskModelImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("UpdateMarketLogNormalRiskModel") case "logNormal": - out.Values[i] = ec._UpdateMarketLogNormalRiskModel_logNormal(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128746,24 +138267,35 @@ var updateMarketSimpleRiskModelImplementors = []string{"UpdateMarketSimpleRiskMo func (ec *executionContext) _UpdateMarketSimpleRiskModel(ctx context.Context, sel ast.SelectionSet, obj *vega.UpdateMarketConfiguration_Simple) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updateMarketSimpleRiskModelImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("UpdateMarketSimpleRiskModel") case "simple": - out.Values[i] = ec._UpdateMarketSimpleRiskModel_simple(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128771,8 +138303,9 @@ var updateMarketStateImplementors = []string{"UpdateMarketState", "ProposalChang func (ec *executionContext) _UpdateMarketState(ctx context.Context, sel ast.SelectionSet, obj *vega.UpdateMarketState) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updateMarketStateImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -128780,7 +138313,7 @@ func (ec *executionContext) _UpdateMarketState(ctx context.Context, sel ast.Sele case "market": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128788,19 +138321,35 @@ func (ec *executionContext) _UpdateMarketState(ctx context.Context, sel ast.Sele }() res = ec._UpdateMarketState_market(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "updateType": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128808,19 +138357,35 @@ func (ec *executionContext) _UpdateMarketState(ctx context.Context, sel ast.Sele }() res = ec._UpdateMarketState_updateType(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "price": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128830,18 +138395,46 @@ func (ec *executionContext) _UpdateMarketState(ctx context.Context, sel ast.Sele return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -128849,8 +138442,9 @@ var updateNetworkParameterImplementors = []string{"UpdateNetworkParameter", "Pro func (ec *executionContext) _UpdateNetworkParameter(ctx context.Context, sel ast.SelectionSet, obj *vega.UpdateNetworkParameter) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updateNetworkParameterImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -128858,7 +138452,7 @@ func (ec *executionContext) _UpdateNetworkParameter(ctx context.Context, sel ast case "networkParameter": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128866,23 +138460,51 @@ func (ec *executionContext) _UpdateNetworkParameter(ctx context.Context, sel ast }() res = ec._UpdateNetworkParameter_networkParameter(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -128890,88 +138512,79 @@ var updatePerpetualProductImplementors = []string{"UpdatePerpetualProduct", "Upd func (ec *executionContext) _UpdatePerpetualProduct(ctx context.Context, sel ast.SelectionSet, obj *vega.UpdatePerpetualProduct) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updatePerpetualProductImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("UpdatePerpetualProduct") case "quoteName": - out.Values[i] = ec._UpdatePerpetualProduct_quoteName(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "marginFundingFactor": - out.Values[i] = ec._UpdatePerpetualProduct_marginFundingFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "interestRate": - out.Values[i] = ec._UpdatePerpetualProduct_interestRate(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "clampLowerBound": - out.Values[i] = ec._UpdatePerpetualProduct_clampLowerBound(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "clampUpperBound": - out.Values[i] = ec._UpdatePerpetualProduct_clampUpperBound(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "dataSourceSpecForSettlementSchedule": - out.Values[i] = ec._UpdatePerpetualProduct_dataSourceSpecForSettlementSchedule(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "dataSourceSpecForSettlementData": - out.Values[i] = ec._UpdatePerpetualProduct_dataSourceSpecForSettlementData(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "dataSourceSpecBinding": - out.Values[i] = ec._UpdatePerpetualProduct_dataSourceSpecBinding(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "fundingRateScalingFactor": - out.Values[i] = ec._UpdatePerpetualProduct_fundingRateScalingFactor(ctx, field, obj) - case "fundingRateLowerBound": - out.Values[i] = ec._UpdatePerpetualProduct_fundingRateLowerBound(ctx, field, obj) - case "fundingRateUpperBound": - out.Values[i] = ec._UpdatePerpetualProduct_fundingRateUpperBound(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -128979,8 +138592,9 @@ var updateReferralProgramImplementors = []string{"UpdateReferralProgram", "Propo func (ec *executionContext) _UpdateReferralProgram(ctx context.Context, sel ast.SelectionSet, obj *vega.UpdateReferralProgram) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updateReferralProgramImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -128988,7 +138602,7 @@ func (ec *executionContext) _UpdateReferralProgram(ctx context.Context, sel ast. case "benefitTiers": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -128996,19 +138610,35 @@ func (ec *executionContext) _UpdateReferralProgram(ctx context.Context, sel ast. }() res = ec._UpdateReferralProgram_benefitTiers(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "endOfProgramTimestamp": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129016,19 +138646,35 @@ func (ec *executionContext) _UpdateReferralProgram(ctx context.Context, sel ast. }() res = ec._UpdateReferralProgram_endOfProgramTimestamp(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "windowLength": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129036,19 +138682,35 @@ func (ec *executionContext) _UpdateReferralProgram(ctx context.Context, sel ast. }() res = ec._UpdateReferralProgram_windowLength(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "stakingTiers": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129056,23 +138718,95 @@ func (ec *executionContext) _UpdateReferralProgram(ctx context.Context, sel ast. }() res = ec._UpdateReferralProgram_stakingTiers(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 updateSpotInstrumentConfigurationImplementors = []string{"UpdateSpotInstrumentConfiguration"} + +func (ec *executionContext) _UpdateSpotInstrumentConfiguration(ctx context.Context, sel ast.SelectionSet, obj *UpdateSpotInstrumentConfiguration) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, updateSpotInstrumentConfigurationImplementors) + + 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("UpdateSpotInstrumentConfiguration") + case "code": + out.Values[i] = ec._UpdateSpotInstrumentConfiguration_code(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "name": + out.Values[i] = ec._UpdateSpotInstrumentConfiguration_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -129080,23 +138814,22 @@ var updateSpotMarketImplementors = []string{"UpdateSpotMarket", "ProposalChange" func (ec *executionContext) _UpdateSpotMarket(ctx context.Context, sel ast.SelectionSet, obj *vega.UpdateSpotMarket) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updateSpotMarketImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("UpdateSpotMarket") case "marketId": - out.Values[i] = ec._UpdateSpotMarket_marketId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "updateSpotMarketConfiguration": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129104,23 +138837,51 @@ func (ec *executionContext) _UpdateSpotMarket(ctx context.Context, sel ast.Selec }() res = ec._UpdateSpotMarket_updateSpotMarketConfiguration(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -129128,23 +138889,58 @@ var updateSpotMarketConfigurationImplementors = []string{"UpdateSpotMarketConfig func (ec *executionContext) _UpdateSpotMarketConfiguration(ctx context.Context, sel ast.SelectionSet, obj *vega.UpdateSpotMarketConfiguration) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updateSpotMarketConfigurationImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("UpdateSpotMarketConfiguration") - case "metadata": + case "instrument": + field := field - out.Values[i] = ec._UpdateSpotMarketConfiguration_metadata(ctx, field, obj) + 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_instrument(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 "metadata": + out.Values[i] = ec._UpdateSpotMarketConfiguration_metadata(ctx, field, obj) if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "priceMonitoringParameters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129152,19 +138948,35 @@ func (ec *executionContext) _UpdateSpotMarketConfiguration(ctx context.Context, }() res = ec._UpdateSpotMarketConfiguration_priceMonitoringParameters(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "targetStakeParameters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129172,19 +138984,35 @@ func (ec *executionContext) _UpdateSpotMarketConfiguration(ctx context.Context, }() res = ec._UpdateSpotMarketConfiguration_targetStakeParameters(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "riskParameters": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129192,19 +139020,35 @@ func (ec *executionContext) _UpdateSpotMarketConfiguration(ctx context.Context, }() res = ec._UpdateSpotMarketConfiguration_riskParameters(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "liquiditySLAParams": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129212,34 +139056,58 @@ func (ec *executionContext) _UpdateSpotMarketConfiguration(ctx context.Context, }() res = ec._UpdateSpotMarketConfiguration_liquiditySLAParams(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "liquidityFeeSettings": + // 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": out.Values[i] = ec._UpdateSpotMarketConfiguration_liquidityFeeSettings(ctx, field, obj) - case "tickSize": - out.Values[i] = ec._UpdateSpotMarketConfiguration_tickSize(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -129247,8 +139115,9 @@ var updateVolumeDiscountProgramImplementors = []string{"UpdateVolumeDiscountProg func (ec *executionContext) _UpdateVolumeDiscountProgram(ctx context.Context, sel ast.SelectionSet, obj *vega.UpdateVolumeDiscountProgram) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, updateVolumeDiscountProgramImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -129256,7 +139125,7 @@ func (ec *executionContext) _UpdateVolumeDiscountProgram(ctx context.Context, se case "benefitTiers": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129264,19 +139133,35 @@ func (ec *executionContext) _UpdateVolumeDiscountProgram(ctx context.Context, se }() res = ec._UpdateVolumeDiscountProgram_benefitTiers(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "endOfProgramTimestamp": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129284,19 +139169,35 @@ func (ec *executionContext) _UpdateVolumeDiscountProgram(ctx context.Context, se }() res = ec._UpdateVolumeDiscountProgram_endOfProgramTimestamp(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "windowLength": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129304,23 +139205,51 @@ func (ec *executionContext) _UpdateVolumeDiscountProgram(ctx context.Context, se }() res = ec._UpdateVolumeDiscountProgram_windowLength(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -129328,34 +139257,43 @@ var volumeBenefitTierImplementors = []string{"VolumeBenefitTier"} func (ec *executionContext) _VolumeBenefitTier(ctx context.Context, sel ast.SelectionSet, obj *vega.VolumeBenefitTier) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, volumeBenefitTierImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("VolumeBenefitTier") case "minimumRunningNotionalTakerVolume": - out.Values[i] = ec._VolumeBenefitTier_minimumRunningNotionalTakerVolume(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "volumeDiscountFactor": - out.Values[i] = ec._VolumeBenefitTier_volumeDiscountFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -129363,23 +139301,22 @@ var volumeDiscountProgramImplementors = []string{"VolumeDiscountProgram"} func (ec *executionContext) _VolumeDiscountProgram(ctx context.Context, sel ast.SelectionSet, obj *v2.VolumeDiscountProgram) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, volumeDiscountProgramImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("VolumeDiscountProgram") case "id": - out.Values[i] = ec._VolumeDiscountProgram_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "version": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129387,33 +139324,45 @@ func (ec *executionContext) _VolumeDiscountProgram(ctx context.Context, sel ast. }() res = ec._VolumeDiscountProgram_version(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "benefitTiers": + // 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 "benefitTiers": out.Values[i] = ec._VolumeDiscountProgram_benefitTiers(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "endOfProgramTimestamp": - out.Values[i] = ec._VolumeDiscountProgram_endOfProgramTimestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "windowLength": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129421,27 +139370,53 @@ func (ec *executionContext) _VolumeDiscountProgram(ctx context.Context, sel ast. }() res = ec._VolumeDiscountProgram_windowLength(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "endedAt": + // 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 "endedAt": out.Values[i] = ec._VolumeDiscountProgram_endedAt(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -129449,8 +139424,9 @@ var volumeDiscountStatsImplementors = []string{"VolumeDiscountStats"} func (ec *executionContext) _VolumeDiscountStats(ctx context.Context, sel ast.SelectionSet, obj *v2.VolumeDiscountStats) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, volumeDiscountStatsImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": @@ -129458,7 +139434,7 @@ func (ec *executionContext) _VolumeDiscountStats(ctx context.Context, sel ast.Se case "atEpoch": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129466,44 +139442,66 @@ func (ec *executionContext) _VolumeDiscountStats(ctx context.Context, sel ast.Se }() res = ec._VolumeDiscountStats_atEpoch(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "partyId": + // 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": out.Values[i] = ec._VolumeDiscountStats_partyId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "discountFactor": - out.Values[i] = ec._VolumeDiscountStats_discountFactor(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "runningVolume": - out.Values[i] = ec._VolumeDiscountStats_runningVolume(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -129511,34 +139509,43 @@ var volumeDiscountStatsConnectionImplementors = []string{"VolumeDiscountStatsCon func (ec *executionContext) _VolumeDiscountStatsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.VolumeDiscountStatsConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, volumeDiscountStatsConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("VolumeDiscountStatsConnection") case "edges": - out.Values[i] = ec._VolumeDiscountStatsConnection_edges(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "pageInfo": - out.Values[i] = ec._VolumeDiscountStatsConnection_pageInfo(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -129546,34 +139553,43 @@ var volumeDiscountStatsEdgeImplementors = []string{"VolumeDiscountStatsEdge"} func (ec *executionContext) _VolumeDiscountStatsEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.VolumeDiscountStatsEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, volumeDiscountStatsEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("VolumeDiscountStatsEdge") case "node": - out.Values[i] = ec._VolumeDiscountStatsEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._VolumeDiscountStatsEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -129581,23 +139597,22 @@ var voteImplementors = []string{"Vote"} func (ec *executionContext) _Vote(ctx context.Context, sel ast.SelectionSet, obj *vega.Vote) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, voteImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Vote") case "value": - out.Values[i] = ec._Vote_value(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129605,19 +139620,35 @@ func (ec *executionContext) _Vote(ctx context.Context, sel ast.SelectionSet, obj }() res = ec._Vote_party(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "datetime": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129625,26 +139656,40 @@ func (ec *executionContext) _Vote(ctx context.Context, sel ast.SelectionSet, obj }() res = ec._Vote_datetime(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "proposalId": - out.Values[i] = ec._Vote_proposalId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "governanceTokenBalance": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129652,19 +139697,35 @@ func (ec *executionContext) _Vote(ctx context.Context, sel ast.SelectionSet, obj }() res = ec._Vote_governanceTokenBalance(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "governanceTokenWeight": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129672,19 +139733,35 @@ func (ec *executionContext) _Vote(ctx context.Context, sel ast.SelectionSet, obj }() res = ec._Vote_governanceTokenWeight(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "equityLikeShareWeight": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129692,19 +139769,35 @@ func (ec *executionContext) _Vote(ctx context.Context, sel ast.SelectionSet, obj }() res = ec._Vote_equityLikeShareWeight(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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 "equityLikeSharePerMarket": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129714,18 +139807,46 @@ func (ec *executionContext) _Vote(ctx context.Context, sel ast.SelectionSet, obj return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) + // 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() - if invalids > 0 { + 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 } @@ -129733,28 +139854,37 @@ var voteConnectionImplementors = []string{"VoteConnection"} func (ec *executionContext) _VoteConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.VoteConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, voteConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("VoteConnection") case "edges": - out.Values[i] = ec._VoteConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._VoteConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -129762,31 +139892,40 @@ var voteEdgeImplementors = []string{"VoteEdge"} func (ec *executionContext) _VoteEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.VoteEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, voteEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("VoteEdge") case "node": - out.Values[i] = ec._VoteEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._VoteEdge_cursor(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -129794,23 +139933,22 @@ var withdrawalImplementors = []string{"Withdrawal", "Event"} func (ec *executionContext) _Withdrawal(ctx context.Context, sel ast.SelectionSet, obj *vega.Withdrawal) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, withdrawalImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Withdrawal") case "id": - out.Values[i] = ec._Withdrawal_id(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "party": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129818,26 +139956,40 @@ func (ec *executionContext) _Withdrawal(ctx context.Context, sel ast.SelectionSe }() res = ec._Withdrawal_party(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) - }) - case "amount": + // 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._Withdrawal_amount(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "asset": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129845,44 +139997,52 @@ func (ec *executionContext) _Withdrawal(ctx context.Context, sel ast.SelectionSe }() res = ec._Withdrawal_asset(ctx, field, obj) if res == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&fs.Invalids, 1) } return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "status": - out.Values[i] = ec._Withdrawal_status(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "ref": - out.Values[i] = ec._Withdrawal_ref(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "createdTimestamp": - out.Values[i] = ec._Withdrawal_createdTimestamp(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&invalids, 1) + atomic.AddUint32(&out.Invalids, 1) } case "withdrawnTimestamp": - out.Values[i] = ec._Withdrawal_withdrawnTimestamp(ctx, field, obj) - case "txHash": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129892,14 +140052,30 @@ func (ec *executionContext) _Withdrawal(ctx context.Context, sel ast.SelectionSe return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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 "details": field := field - innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + 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)) @@ -129909,18 +140085,46 @@ func (ec *executionContext) _Withdrawal(ctx context.Context, sel ast.SelectionSe return res } - out.Concurrently(i, func() graphql.Marshaler { - return innerFunc(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) + }) + + // 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() - if invalids > 0 { + 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 } @@ -129928,34 +140132,43 @@ var withdrawalEdgeImplementors = []string{"WithdrawalEdge"} func (ec *executionContext) _WithdrawalEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.WithdrawalEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, withdrawalEdgeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("WithdrawalEdge") case "node": - out.Values[i] = ec._WithdrawalEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "cursor": - out.Values[i] = ec._WithdrawalEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -129963,28 +140176,37 @@ var withdrawalsConnectionImplementors = []string{"WithdrawalsConnection"} func (ec *executionContext) _WithdrawalsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.WithdrawalsConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, withdrawalsConnectionImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("WithdrawalsConnection") case "edges": - out.Values[i] = ec._WithdrawalsConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._WithdrawalsConnection_pageInfo(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -129992,52 +140214,55 @@ var __DirectiveImplementors = []string{"__Directive"} func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, __DirectiveImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("__Directive") case "name": - out.Values[i] = ec.___Directive_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "description": - out.Values[i] = ec.___Directive_description(ctx, field, obj) - case "locations": - out.Values[i] = ec.___Directive_locations(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "args": - out.Values[i] = ec.___Directive_args(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "isRepeatable": - out.Values[i] = ec.___Directive_isRepeatable(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -130045,42 +140270,47 @@ var __EnumValueImplementors = []string{"__EnumValue"} func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, __EnumValueImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("__EnumValue") case "name": - out.Values[i] = ec.___EnumValue_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "description": - out.Values[i] = ec.___EnumValue_description(ctx, field, obj) - case "isDeprecated": - out.Values[i] = ec.___EnumValue_isDeprecated(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "deprecationReason": - out.Values[i] = ec.___EnumValue_deprecationReason(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -130088,56 +140318,57 @@ var __FieldImplementors = []string{"__Field"} func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, __FieldImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("__Field") case "name": - out.Values[i] = ec.___Field_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "description": - out.Values[i] = ec.___Field_description(ctx, field, obj) - case "args": - out.Values[i] = ec.___Field_args(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "type": - out.Values[i] = ec.___Field_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "isDeprecated": - out.Values[i] = ec.___Field_isDeprecated(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "deprecationReason": - out.Values[i] = ec.___Field_deprecationReason(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -130145,42 +140376,47 @@ var __InputValueImplementors = []string{"__InputValue"} func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, __InputValueImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("__InputValue") case "name": - out.Values[i] = ec.___InputValue_name(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "description": - out.Values[i] = ec.___InputValue_description(ctx, field, obj) - case "type": - out.Values[i] = ec.___InputValue_type(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "defaultValue": - out.Values[i] = ec.___InputValue_defaultValue(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -130188,53 +140424,54 @@ var __SchemaImplementors = []string{"__Schema"} func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, __SchemaImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("__Schema") case "description": - out.Values[i] = ec.___Schema_description(ctx, field, obj) - case "types": - out.Values[i] = ec.___Schema_types(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "queryType": - out.Values[i] = ec.___Schema_queryType(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "mutationType": - out.Values[i] = ec.___Schema_mutationType(ctx, field, obj) - case "subscriptionType": - out.Values[i] = ec.___Schema_subscriptionType(ctx, field, obj) - case "directives": - out.Values[i] = ec.___Schema_directives(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -130242,63 +140479,56 @@ var __TypeImplementors = []string{"__Type"} func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { fields := graphql.CollectFields(ec.OperationContext, sel, __TypeImplementors) + out := graphql.NewFieldSet(fields) - var invalids uint32 + deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("__Type") case "kind": - out.Values[i] = ec.___Type_kind(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ + out.Invalids++ } case "name": - out.Values[i] = ec.___Type_name(ctx, field, obj) - case "description": - out.Values[i] = ec.___Type_description(ctx, field, obj) - case "fields": - out.Values[i] = ec.___Type_fields(ctx, field, obj) - case "interfaces": - out.Values[i] = ec.___Type_interfaces(ctx, field, obj) - case "possibleTypes": - out.Values[i] = ec.___Type_possibleTypes(ctx, field, obj) - case "enumValues": - out.Values[i] = ec.___Type_enumValues(ctx, field, obj) - case "inputFields": - out.Values[i] = ec.___Type_inputFields(ctx, field, obj) - case "ofType": - out.Values[i] = ec.___Type_ofType(ctx, field, obj) - case "specifiedByURL": - out.Values[i] = ec.___Type_specifiedByURL(ctx, field, obj) - default: panic("unknown field " + strconv.Quote(field.Name)) } } - out.Dispatch() - if invalids > 0 { + 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 } @@ -135178,6 +145408,20 @@ func (ec *executionContext) marshalNUpdateProductConfiguration2codeᚗvegaprotoc return ec._UpdateProductConfiguration(ctx, sel, v) } +func (ec *executionContext) marshalNUpdateSpotInstrumentConfiguration2codeᚗvegaprotocolᚗioᚋvegaᚋdatanodeᚋgatewayᚋgraphqlᚐUpdateSpotInstrumentConfiguration(ctx context.Context, sel ast.SelectionSet, v UpdateSpotInstrumentConfiguration) graphql.Marshaler { + return ec._UpdateSpotInstrumentConfiguration(ctx, sel, &v) +} + +func (ec *executionContext) marshalNUpdateSpotInstrumentConfiguration2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋdatanodeᚋgatewayᚋgraphqlᚐUpdateSpotInstrumentConfiguration(ctx context.Context, sel ast.SelectionSet, v *UpdateSpotInstrumentConfiguration) 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._UpdateSpotInstrumentConfiguration(ctx, sel, v) +} + func (ec *executionContext) marshalNUpdateSpotMarketConfiguration2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐUpdateSpotMarketConfiguration(ctx context.Context, sel ast.SelectionSet, v vega.UpdateSpotMarketConfiguration) graphql.Marshaler { return ec._UpdateSpotMarketConfiguration(ctx, sel, &v) } diff --git a/datanode/gateway/graphql/marshallers/marshallers.go b/datanode/gateway/graphql/marshallers/marshallers.go index ed7cf05ae8..38f7b022b6 100644 --- a/datanode/gateway/graphql/marshallers/marshallers.go +++ b/datanode/gateway/graphql/marshallers/marshallers.go @@ -420,7 +420,17 @@ func MarshalStopOrderRejectionReason(s vega.StopOrder_RejectionReason) graphql.M } func UnmarshalStopOrderRejectionReason(v interface{}) (vega.StopOrder_RejectionReason, error) { - return vega.StopOrder_REJECTION_REASON_UNSPECIFIED, ErrUnimplemented + s, ok := v.(string) + if !ok { + return vega.StopOrder_REJECTION_REASON_UNSPECIFIED, fmt.Errorf("expected stop order rejection reason to be a string") + } + + t, ok := vega.StopOrder_RejectionReason_value[s] + if !ok { + return vega.StopOrder_REJECTION_REASON_UNSPECIFIED, fmt.Errorf("failed to convert StopOrderRejectionReason from GraphQL to Proto: %v", s) + } + + return vega.StopOrder_RejectionReason(t), nil } func MarshalOrderType(s vega.Order_Type) graphql.Marshaler { diff --git a/datanode/gateway/graphql/models.go b/datanode/gateway/graphql/models.go index 7aea806391..3335b8c345 100644 --- a/datanode/gateway/graphql/models.go +++ b/datanode/gateway/graphql/models.go @@ -142,7 +142,7 @@ type AuctionDuration struct { type BatchProposal struct { // Proposal ID that is provided by Vega once proposal reaches the network - ID *string `json:"id"` + ID *string `json:"id,omitempty"` // A UUID reference to aid tracking proposals on Vega Reference string `json:"reference"` // Party that prepared the proposal @@ -152,25 +152,25 @@ type BatchProposal struct { // RFC3339Nano time and date when the proposal reached the network Datetime int64 `json:"datetime"` // Terms of all the proposals in the batch - BatchTerms *vega.BatchProposalTerms `json:"batchTerms"` + BatchTerms *vega.BatchProposalTerms `json:"batchTerms,omitempty"` // Rationale behind the proposal Rationale *vega.ProposalRationale `json:"rationale"` // Votes cast for this proposal Votes *ProposalVotes `json:"votes"` // Reason the proposal was rejected - RejectionReason *vega.ProposalError `json:"rejectionReason"` + RejectionReason *vega.ProposalError `json:"rejectionReason,omitempty"` // Details of the rejection reason - ErrorDetails *string `json:"errorDetails"` + ErrorDetails *string `json:"errorDetails,omitempty"` // Required majority for this proposal to succeed RequiredMajority string `json:"requiredMajority"` // Required participation for this proposal to succeed RequiredParticipation string `json:"requiredParticipation"` // Equity-like share required for a market amendment proposal to be enacted, represented as a fraction that can be converted to a percentage. If not met, the proposal will not be enacted - RequiredLpMajority *string `json:"requiredLpMajority"` + RequiredLpMajority *string `json:"requiredLpMajority,omitempty"` // The market share of LPs' equity-like share that must take part in a market amendment vote for the proposal to pass. This means the votes of LPs that have submitted more liquidity to that market, or have been LPs from the start carry more weight. If it requires 50% of a market's equity-like share for a majority, and the full batch of proposals receives all YES votes but only LPs with 49% of the equity-like share voted, the proposal will not pass - RequiredLpParticipation *string `json:"requiredLpParticipation"` + RequiredLpParticipation *string `json:"requiredLpParticipation,omitempty"` // Proposals that are part of the batch - SubProposals []*vega.Proposal `json:"subProposals"` + SubProposals []*vega.Proposal `json:"subProposals,omitempty"` } func (BatchProposal) IsProposalNode() {} @@ -199,7 +199,7 @@ type Condition struct { // The type of comparison to make on the value. Operator v1.Condition_Operator `json:"operator"` // The value to compare against. - Value *string `json:"value"` + Value *string `json:"value,omitempty"` } // A mode where Vega tries to execute orders as soon as they are received @@ -211,13 +211,13 @@ type ContinuousTrading struct { // A data source contains the data sent by a data source type Data struct { // signers is the list of public keys/ETH addresses that signed the data - Signers []*Signer `json:"signers"` + Signers []*Signer `json:"signers,omitempty"` // properties contains all the properties sent by a data source - Data []*v1.Property `json:"data"` - MetaData []*v1.Property `json:"metaData"` + Data []*v1.Property `json:"data,omitempty"` + MetaData []*v1.Property `json:"metaData,omitempty"` // List of all the data specs that matched this source data. // When the array is empty, it means no data spec matched this source data. - MatchedSpecIds []string `json:"matchedSpecIds"` + MatchedSpecIds []string `json:"matchedSpecIds,omitempty"` // RFC3339Nano formatted date and time for when the data was broadcast to the markets // with a matching data spec. // It has no value when the source data does not match any data spec. @@ -232,7 +232,7 @@ type DataSourceSpec struct { // RFC3339Nano creation date time CreatedAt int64 `json:"createdAt"` // RFC3339Nano last updated timestamp - UpdatedAt *int64 `json:"updatedAt"` + UpdatedAt *int64 `json:"updatedAt,omitempty"` Data *vega.DataSourceDefinition `json:"data"` // Status describes the status of the data source spec Status DataSourceSpecStatus `json:"status"` @@ -257,6 +257,8 @@ type Erc20 struct { // There is no limit on the size of a withdrawal // Note: this is a temporary measure that can be changed by governance WithdrawThreshold string `json:"withdrawThreshold"` + // The chain ID the asset originates from. + ChainID string `json:"chainId"` } func (Erc20) IsAssetSource() {} @@ -268,8 +270,8 @@ type ERC20MultiSigSignerAddedBundleEdge struct { // Response for the signature bundle to add a particular validator to the signer list of the multisig contract type ERC20MultiSigSignerAddedConnection struct { - Edges []*ERC20MultiSigSignerAddedBundleEdge `json:"edges"` - PageInfo *v2.PageInfo `json:"pageInfo"` + Edges []*ERC20MultiSigSignerAddedBundleEdge `json:"edges,omitempty"` + PageInfo *v2.PageInfo `json:"pageInfo,omitempty"` } type ERC20MultiSigSignerRemovedBundleEdge struct { @@ -280,9 +282,9 @@ type ERC20MultiSigSignerRemovedBundleEdge struct { // Response for the signature bundle to remove a particular validator from the signer list of the multisig contract type ERC20MultiSigSignerRemovedConnection struct { // The list of signer bundles for that validator - Edges []*ERC20MultiSigSignerRemovedBundleEdge `json:"edges"` + Edges []*ERC20MultiSigSignerRemovedBundleEdge `json:"edges,omitempty"` // The pagination information - PageInfo *v2.PageInfo `json:"pageInfo"` + PageInfo *v2.PageInfo `json:"pageInfo,omitempty"` } // Response for the signature bundle to update the token limits (maxLifetimeDeposit and withdrawThreshold) for a given ERC20 token (already allowlisted) in the collateral bridge @@ -303,20 +305,20 @@ type ERC20SetAssetLimitsBundle struct { } type ETHAddress struct { - Address *string `json:"address"` + Address *string `json:"address,omitempty"` } func (ETHAddress) IsSignerKind() {} // Summary of a node's rewards for a given epoch type EpochParticipation struct { - Epoch *vega.Epoch `json:"epoch"` + Epoch *vega.Epoch `json:"epoch,omitempty"` // RFC3339 timestamp - Offline *int64 `json:"offline"` + Offline *int64 `json:"offline,omitempty"` // RFC3339 timestamp - Online *int64 `json:"online"` + Online *int64 `json:"online,omitempty"` // Total amount rewarded for participation in the given epoch - TotalRewards *float64 `json:"totalRewards"` + TotalRewards *float64 `json:"totalRewards,omitempty"` } // Response for the signature bundle to allowlist an ERC20 token in the collateral bridge @@ -334,7 +336,7 @@ type Erc20ListAssetBundle struct { // All the data related to the approval of a withdrawal from the network type Erc20WithdrawalApproval struct { - // The source asset in the ethereum network + // The source asset on the bridged EVM chain AssetSource string `json:"assetSource"` // The amount to be withdrawn Amount string `json:"amount"` @@ -347,6 +349,8 @@ type Erc20WithdrawalApproval struct { TargetAddress string `json:"targetAddress"` // RFC3339Nano timestamp at which the withdrawal was created Creation string `json:"creation"` + // The chain ID of the bridged EVM chain + SourceChainID string `json:"sourceChainId"` } // Specific details for an erc20 withdrawal @@ -366,13 +370,13 @@ type EthCallTrigger struct { // one-off or repeating. type EthTimeTrigger struct { // Trigger when the Ethereum time is greater or equal to this time, in Unix seconds. - Initial *int64 `json:"initial"` + Initial *int64 `json:"initial,omitempty"` // Repeat the call every n seconds after the initial call. If no time for // initial call was specified, begin repeating immediately. - Every *int `json:"every"` + Every *int `json:"every,omitempty"` // If repeating, stop once Ethereum time is greater than this time, in Unix // seconds. If not set, then repeat indefinitely. - Until *int64 `json:"until"` + Until *int64 `json:"until,omitempty"` } func (EthTimeTrigger) IsTriggerKind() {} @@ -412,7 +416,7 @@ type Filter struct { Key *PropertyKey `json:"key"` // The conditions that should be matched by the data to be // considered of interest. - Conditions []*Condition `json:"conditions"` + Conditions []*Condition `json:"conditions,omitempty"` } // Individual party participating in a game and their metrics @@ -470,7 +474,7 @@ type LiquidityProviderSLA struct { // Indicates the bond penalty amount applied in the previous epoch. LastEpochBondPenalty string `json:"lastEpochBondPenalty"` // Determines how the fee penalties from past epochs affect future fee revenue. - HysteresisPeriodFeePenalties []string `json:"hysteresisPeriodFeePenalties"` + HysteresisPeriodFeePenalties []string `json:"hysteresisPeriodFeePenalties,omitempty"` // Represents the total amount of funds LP must supply. The amount to be supplied is in the market’s settlement currency, spread on both buy and sell sides of the order book within a defined range. RequiredLiquidity string `json:"requiredLiquidity"` // Notional volume of orders within the range provided on the buy side of the book. @@ -491,9 +495,9 @@ type LossSocialization struct { // The liquidity commitments for this market type MarketDataCommitments struct { // A set of liquidity sell orders to meet the liquidity provision obligation. - Sells []*vega.LiquidityOrderReference `json:"sells"` + Sells []*vega.LiquidityOrderReference `json:"sells,omitempty"` // A set of liquidity buy orders to meet the liquidity provision obligation. - Buys []*vega.LiquidityOrderReference `json:"buys"` + Buys []*vega.LiquidityOrderReference `json:"buys,omitempty"` } type MarketDepthTrade struct { @@ -526,11 +530,11 @@ type NodeSet struct { // Number of nodes in the node set that had a performance score of 0 at the end of the last epoch Inactive int `json:"inactive"` // IDs of the nodes that were promoted into this node set at the start of the epoch - Promoted []string `json:"promoted"` + Promoted []string `json:"promoted,omitempty"` // IDs of the nodes that were demoted into this node set at the start of the epoch - Demoted []string `json:"demoted"` + Demoted []string `json:"demoted,omitempty"` // Total number of nodes allowed in the node set - Maximum *int `json:"maximum"` + Maximum *int `json:"maximum,omitempty"` } // Normaliser to convert the data returned from the contract method @@ -565,7 +569,7 @@ type ObservableLiquidityProviderSLA struct { // Indicates the bond penalty amount applied in the previous epoch. LastEpochBondPenalty string `json:"lastEpochBondPenalty"` // Determines how the fee penalties from past epochs affect future fee revenue. - HysteresisPeriodFeePenalties []string `json:"hysteresisPeriodFeePenalties"` + HysteresisPeriodFeePenalties []string `json:"hysteresisPeriodFeePenalties,omitempty"` // Represents the total amount of funds LP must supply. The amount to be supplied is in the market’s settlement currency, spread on both buy and sell sides of the order book within a defined range. RequiredLiquidity string `json:"requiredLiquidity"` // Notional volume of orders within the range provided on the buy side of the book. @@ -575,19 +579,19 @@ type ObservableLiquidityProviderSLA struct { } type OrderByMarketAndPartyIdsFilter struct { - Order *v2.OrderFilter `json:"order"` - MarketIds []string `json:"marketIds"` - PartyIds []string `json:"partyIds"` + Order *v2.OrderFilter `json:"order,omitempty"` + MarketIds []string `json:"marketIds,omitempty"` + PartyIds []string `json:"partyIds,omitempty"` } type OrderByMarketIdsFilter struct { - Order *v2.OrderFilter `json:"order"` - MarketIds []string `json:"marketIds"` + Order *v2.OrderFilter `json:"order,omitempty"` + MarketIds []string `json:"marketIds,omitempty"` } type OrderByPartyIdsFilter struct { - Order *v2.OrderFilter `json:"order"` - PartyIds []string `json:"partyIds"` + Order *v2.OrderFilter `json:"order,omitempty"` + PartyIds []string `json:"partyIds,omitempty"` } // An estimate of the fee to be paid by the order @@ -607,7 +611,7 @@ type PositionEstimate struct { // Estimated margin account balance increase CollateralIncreaseEstimate *v2.CollateralIncreaseEstimate `json:"collateralIncreaseEstimate"` // Liquidation price range estimate for the specified position. Only populated if available collateral was specified in the request - Liquidation *v2.LiquidationEstimate `json:"liquidation"` + Liquidation *v2.LiquidationEstimate `json:"liquidation,omitempty"` } type PositionResolution struct { @@ -636,13 +640,13 @@ type PriceMonitoringBounds struct { // PriceMonitoringParameters holds a list of triggers type PriceMonitoringParameters struct { // The list of triggers for this price monitoring - Triggers []*PriceMonitoringTrigger `json:"triggers"` + Triggers []*PriceMonitoringTrigger `json:"triggers,omitempty"` } // Configuration of a market price monitoring auctions triggers type PriceMonitoringSettings struct { // Specified a set of PriceMonitoringParameters to be use for price monitoring purposes - Parameters *PriceMonitoringParameters `json:"parameters"` + Parameters *PriceMonitoringParameters `json:"parameters,omitempty"` } // PriceMonitoringTrigger holds together price projection horizon τ, probability level p, and auction extension duration @@ -660,12 +664,12 @@ type PriceMonitoringTrigger struct { // PropertyKey describes the property key contained in a source data. type PropertyKey struct { // The name of the property. - Name *string `json:"name"` + Name *string `json:"name,omitempty"` // The type of the property. Type v1.PropertyKey_Type `json:"type"` // An optional decimal place to be applied on the provided value. // Valid only for PropertyType of type DECIMAL, INTEGER. - NumberDecimalPlaces *int `json:"numberDecimalPlaces"` + NumberDecimalPlaces *int `json:"numberDecimalPlaces,omitempty"` } type ProposalVote struct { @@ -678,9 +682,9 @@ type ProposalVote struct { // Connection type for retrieving cursor-based paginated proposal vote information type ProposalVoteConnection struct { // The proposal votes in this connection - Edges []*ProposalVoteEdge `json:"edges"` + Edges []*ProposalVoteEdge `json:"edges,omitempty"` // The pagination information - PageInfo *v2.PageInfo `json:"pageInfo"` + PageInfo *v2.PageInfo `json:"pageInfo,omitempty"` } // Edge type containing the proposal vote and cursor information returned by a ProposalVoteConnection @@ -688,12 +692,12 @@ type ProposalVoteEdge struct { // The proposal vote Node *ProposalVote `json:"node"` // The cursor for this proposal vote - Cursor *string `json:"cursor"` + Cursor *string `json:"cursor,omitempty"` } type ProposalVoteSide struct { // All votes cast for this side - Votes []*vega.Vote `json:"votes"` + Votes []*vega.Vote `json:"votes,omitempty"` // Total number of votes cast for this side TotalNumber string `json:"totalNumber"` // Total weight of governance token from the votes cast for this side @@ -717,15 +721,19 @@ type ProtocolUpgradeStatus struct { } type PubKey struct { - Key *string `json:"key"` + Key *string `json:"key,omitempty"` } func (PubKey) IsSignerKind() {} +// Queries allow a caller to read data and filter data via GraphQL. +type Query struct { +} + // Connection type for retrieving cursor-based paginated reward summary information type RewardSummaryConnection struct { // List of reward summaries available for the connection - Edges []*RewardSummaryEdge `json:"edges"` + Edges []*RewardSummaryEdge `json:"edges,omitempty"` // Page information for the connection PageInfo *v2.PageInfo `json:"pageInfo"` } @@ -757,7 +765,7 @@ type SettlePosition struct { // The settle price Price string `json:"price"` // The trades that were settled to close the overall position - TradeSettlements []*TradeSettlement `json:"tradeSettlements"` + TradeSettlements []*TradeSettlement `json:"tradeSettlements,omitempty"` } // Signer is the authorized signature used for the data. @@ -795,6 +803,10 @@ type StopOrderTrailingPercentOffset struct { func (StopOrderTrailingPercentOffset) IsStopOrderTrigger() {} +// Subscriptions allow a caller to receive new information as it is available from the Vega network. +type Subscription struct { +} + // TargetStakeParameters contains parameters used in target stake calculation type TargetStakeParameters struct { // Specifies length of time window expressed in seconds for target stake calculation @@ -849,17 +861,17 @@ type TradeFee struct { // The fee paid to the liquidity providers that committed liquidity to the market LiquidityFee string `json:"liquidityFee"` // Referral discount on maker fees for the trade - MakerFeeReferralDiscount *string `json:"makerFeeReferralDiscount"` + MakerFeeReferralDiscount *string `json:"makerFeeReferralDiscount,omitempty"` // Volume discount on maker fees for the trade - MakerFeeVolumeDiscount *string `json:"makerFeeVolumeDiscount"` + MakerFeeVolumeDiscount *string `json:"makerFeeVolumeDiscount,omitempty"` // Referral discount on infrastructure fees for the trade - InfrastructureFeeReferralDiscount *string `json:"infrastructureFeeReferralDiscount"` + InfrastructureFeeReferralDiscount *string `json:"infrastructureFeeReferralDiscount,omitempty"` // Volume discount on infrastructure fees for the trade - InfrastructureFeeVolumeDiscount *string `json:"infrastructureFeeVolumeDiscount"` + InfrastructureFeeVolumeDiscount *string `json:"infrastructureFeeVolumeDiscount,omitempty"` // Referral discount on liquidity fees for the trade - LiquidityFeeReferralDiscount *string `json:"liquidityFeeReferralDiscount"` + LiquidityFeeReferralDiscount *string `json:"liquidityFeeReferralDiscount,omitempty"` // Volume discount on liquidity fees for the trade - LiquidityFeeVolumeDiscount *string `json:"liquidityFeeVolumeDiscount"` + LiquidityFeeVolumeDiscount *string `json:"liquidityFeeVolumeDiscount,omitempty"` } type TradeSettlement struct { @@ -871,15 +883,15 @@ type TradeSettlement struct { // Filter to apply to the trade connection query type TradesFilter struct { - PartyIds []string `json:"partyIds"` - MarketIds []string `json:"marketIds"` - OrderIds []string `json:"orderIds"` + PartyIds []string `json:"partyIds,omitempty"` + MarketIds []string `json:"marketIds,omitempty"` + OrderIds []string `json:"orderIds,omitempty"` } // Filter to apply to the trade subscription request type TradesSubscriptionFilter struct { - PartyIds []string `json:"partyIds"` - MarketIds []string `json:"marketIds"` + PartyIds []string `json:"partyIds,omitempty"` + MarketIds []string `json:"marketIds,omitempty"` } type TransactionSubmitted struct { @@ -905,14 +917,14 @@ type TransferFee struct { type TransferResponse struct { // The ledger entries and balances resulting from a transfer request - Transfers []*vega.LedgerEntry `json:"transfers"` + Transfers []*vega.LedgerEntry `json:"transfers,omitempty"` // The balances of accounts involved in the transfer - Balances []*TransferBalance `json:"balances"` + Balances []*TransferBalance `json:"balances,omitempty"` } type TransferResponses struct { // A group of transfer responses - events from core - Responses []*TransferResponse `json:"responses"` + Responses []*TransferResponse `json:"responses,omitempty"` } // An asset originated from an Ethereum ERC20 Token @@ -934,6 +946,13 @@ type UpdateInstrumentConfiguration struct { Product UpdateProductConfiguration `json:"product"` } +type UpdateSpotInstrumentConfiguration struct { + // Instrument code, human-readable shortcode used to describe the instrument. + Code string `json:"code"` + // Instrument name + Name string `json:"name"` +} + // Event types type BusEventType string diff --git a/datanode/gateway/graphql/oracles_resolver_test.go b/datanode/gateway/graphql/oracles_resolver_test.go index 8337ffcdee..d4b8d5bf7f 100644 --- a/datanode/gateway/graphql/oracles_resolver_test.go +++ b/datanode/gateway/graphql/oracles_resolver_test.go @@ -78,7 +78,7 @@ func Test_oracleSpecResolver_DataSourceSpec(t *testing.T) { }, }, }, - wantJsn: `{"spec":{"id":"","createdAt":0,"updatedAt":null,"data":{"SourceType":{"External":{"SourceType":{"Oracle":{"signers":[{"Signer":{"PubKey":{"key":"key"}}},{"Signer":{"EthAddress":{"address":"address"}}}]}}}}},"status":"STATUS_ACTIVE"}}`, + wantJsn: `{"spec":{"id":"","createdAt":0,"data":{"SourceType":{"External":{"SourceType":{"Oracle":{"signers":[{"Signer":{"PubKey":{"key":"key"}}},{"Signer":{"EthAddress":{"address":"address"}}}]}}}}},"status":"STATUS_ACTIVE"}}`, wantErr: assert.NoError, }, { @@ -108,7 +108,7 @@ func Test_oracleSpecResolver_DataSourceSpec(t *testing.T) { }, }, }, - wantJsn: `{"spec":{"id":"","createdAt":0,"updatedAt":null,"data":{"SourceType":{"Internal":{"SourceType":{"Time":{"conditions":[{"operator":12,"value":"blah"}]}}}}},"status":"STATUS_ACTIVE"}}`, + wantJsn: `{"spec":{"id":"","createdAt":0,"data":{"SourceType":{"Internal":{"SourceType":{"Time":{"conditions":[{"operator":12,"value":"blah"}]}}}}},"status":"STATUS_ACTIVE"}}`, wantErr: assert.NoError, }, { @@ -152,7 +152,7 @@ func Test_oracleSpecResolver_DataSourceSpec(t *testing.T) { }, }, }, - wantJsn: `{"spec":{"id":"","createdAt":0,"updatedAt":null,"data":{"SourceType":{"External":{"SourceType":{"EthOracle":{"address":"test-address","method":"stake","trigger":{"Trigger":{"TimeTrigger":{"initial":11651379494838206464}}},"filters":[{"key":{"name":"property-name","type":4}}]}}}}},"status":"STATUS_ACTIVE"}}`, + wantJsn: `{"spec":{"id":"","createdAt":0,"data":{"SourceType":{"External":{"SourceType":{"EthOracle":{"address":"test-address","method":"stake","trigger":{"Trigger":{"TimeTrigger":{"initial":11651379494838206464}}},"filters":[{"key":{"name":"property-name","type":4}}]}}}}},"status":"STATUS_ACTIVE"}}`, wantErr: assert.NoError, }, } @@ -164,7 +164,7 @@ func Test_oracleSpecResolver_DataSourceSpec(t *testing.T) { } gotJsn, _ := json.Marshal(got) - assert.JSONEqf(t, tt.wantJsn, string(gotJsn), "mismatch:\n\twant: %s \n\tgot: %s", tt.wantJsn, string(gotJsn)) + assert.JSONEqf(t, tt.wantJsn, string(gotJsn), "mismatch(%v):\n\twant: %s \n\tgot: %s", tt.name, tt.wantJsn, string(gotJsn)) }) } } diff --git a/datanode/gateway/graphql/proposal_terms_resolver.go b/datanode/gateway/graphql/proposal_terms_resolver.go index 1f107aaf81..fac4cfe6d4 100644 --- a/datanode/gateway/graphql/proposal_terms_resolver.go +++ b/datanode/gateway/graphql/proposal_terms_resolver.go @@ -47,6 +47,16 @@ func (r *batchProposalTermsChangeResolver) EnactmentDatetime(ctx context.Context return dt, nil } +func (r *batchProposalTermsChangeResolver) ValidationDatetime(ctx context.Context, obj *vega.BatchProposalTermsChange) (*int64, error) { + var dt *int64 + if obj.ValidationTimestamp != 0 { + // this is a unix timestamp (specified by users) + // needs to convert to time then UnixNano for the Timestamp resolver to work + dt = ptr.From(time.Unix(obj.ValidationTimestamp, 0).UnixNano()) + } + return dt, nil +} + func (r *batchProposalTermsChangeResolver) Change(ctx context.Context, obj *vega.BatchProposalTermsChange) (ProposalChange, error) { switch obj.Change.(type) { case *types.BatchProposalTermsChange_UpdateMarket: @@ -57,6 +67,8 @@ func (r *batchProposalTermsChangeResolver) Change(ctx context.Context, obj *vega return obj.GetNewMarket(), nil case *types.BatchProposalTermsChange_NewFreeform: return obj.GetNewFreeform(), nil + case *types.BatchProposalTermsChange_NewAsset: + return obj.GetNewAsset(), nil case *types.BatchProposalTermsChange_UpdateAsset: return obj.GetUpdateAsset(), nil case *types.BatchProposalTermsChange_CancelTransfer: diff --git a/datanode/gateway/graphql/resolvers.go b/datanode/gateway/graphql/resolvers.go index 3bdcfbcb38..3cca2cdee9 100644 --- a/datanode/gateway/graphql/resolvers.go +++ b/datanode/gateway/graphql/resolvers.go @@ -1094,13 +1094,14 @@ func (r *myQueryResolver) Erc20SetAssetLimitsBundle(ctx context.Context, proposa }, nil } -func (r *myQueryResolver) Erc20MultiSigSignerAddedBundles(ctx context.Context, nodeID string, submitter, epochSeq *string, pagination *v2.Pagination) (*ERC20MultiSigSignerAddedConnection, error) { +func (r *myQueryResolver) Erc20MultiSigSignerAddedBundles(ctx context.Context, nodeID string, submitter, epochSeq, chainID *string, pagination *v2.Pagination) (*ERC20MultiSigSignerAddedConnection, error) { res, err := r.tradingDataClientV2.ListERC20MultiSigSignerAddedBundles( ctx, &v2.ListERC20MultiSigSignerAddedBundlesRequest{ NodeId: nodeID, Submitter: ptr.UnBox(submitter), EpochSeq: ptr.UnBox(epochSeq), Pagination: pagination, + ChainId: chainID, }) if err != nil { return nil, err @@ -1121,13 +1122,14 @@ func (r *myQueryResolver) Erc20MultiSigSignerAddedBundles(ctx context.Context, n }, nil } -func (r *myQueryResolver) Erc20MultiSigSignerRemovedBundles(ctx context.Context, nodeID string, submitter, epochSeq *string, pagination *v2.Pagination) (*ERC20MultiSigSignerRemovedConnection, error) { +func (r *myQueryResolver) Erc20MultiSigSignerRemovedBundles(ctx context.Context, nodeID string, submitter, epochSeq, chainID *string, pagination *v2.Pagination) (*ERC20MultiSigSignerRemovedConnection, error) { res, err := r.tradingDataClientV2.ListERC20MultiSigSignerRemovedBundles( ctx, &v2.ListERC20MultiSigSignerRemovedBundlesRequest{ NodeId: nodeID, Submitter: ptr.UnBox(submitter), EpochSeq: ptr.UnBox(epochSeq), Pagination: pagination, + ChainId: chainID, }) if err != nil { return nil, err diff --git a/datanode/gateway/graphql/resolvers_test.go b/datanode/gateway/graphql/resolvers_test.go index ec9e001315..08f8752c04 100644 --- a/datanode/gateway/graphql/resolvers_test.go +++ b/datanode/gateway/graphql/resolvers_test.go @@ -196,7 +196,6 @@ func getTestSpotMarket() *protoTypes.Market { Spot: &protoTypes.Spot{ BaseAsset: "Ethereum", QuoteAsset: "USD", - Name: "ETH/USD", }, } @@ -462,7 +461,6 @@ func getNewSpotMarketProposal() *protoTypes.Proposal { Spot: &protoTypes.SpotProduct{ BaseAsset: "USD", QuoteAsset: "ETH", - Name: "ETH/USD", }, }, }, diff --git a/datanode/gateway/graphql/schema.graphql b/datanode/gateway/graphql/schema.graphql index a5abe24706..a15e7ebe0b 100644 --- a/datanode/gateway/graphql/schema.graphql +++ b/datanode/gateway/graphql/schema.graphql @@ -135,9 +135,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( @@ -650,6 +650,8 @@ type Query { submitter: String "The epoch that generated the bundle i.e the epoch in which the node was promoted to tendermint validator" epochSeq: String + "Filter signature bundles to those related to the contract on the given chain ID" + chainID: String "Pagination" pagination: Pagination ): ERC20MultiSigSignerAddedConnection! @@ -662,6 +664,8 @@ type Query { submitter: String "The epoch that generated the bundle i.e the epoch in which the node was demoted from a tendermint validator" epochSeq: String + "Filter signature bundles to those related to the contract on the given chain ID" + chainID: String "Pagination" pagination: Pagination ): ERC20MultiSigSignerRemovedConnection! @@ -697,7 +701,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( @@ -780,9 +784,9 @@ type Query { partyId: ID! "Optional asset ID to filter for. If omitted, statistics for each asset are returned." assetId: ID - "Optional epoch to filter from (included). If omitted, `toEpoch` must not be set. If both omitted, the most recent epoch's data is returned." + "Optional epoch to filter from (included). If omitted, its value defaults to `toEpoch` minus 29." fromEpoch: Int - "Optional epoch to filter to (included). If omitted, the range goes from `fromEpoch` to the most recent epoch." + "Optional epoch to filter to (included). If omitted, the range goes from `fromEpoch` to `fromEpoch` plus 29. If both `fromEpoch` and `toEpoch` are omitted, `toEpoch` defaults to the last epoch." toEpoch: Int ): [FeesStatsForParty] @@ -1354,7 +1358,7 @@ type Transfer { } union TransferKind = - OneOffTransfer + OneOffTransfer | RecurringTransfer | OneOffGovernanceTransfer | RecurringGovernanceTransfer @@ -1411,6 +1415,8 @@ enum DispatchMetric { DISPATCH_METRIC_RETURN_VOLATILITY "Dispatch metric that uses the validator ranking of the validator as metric" DISPATCH_METRIC_VALIDATOR_RANKING + "Dispatch metric that uses the realised return of the party in the market" + DISPATCH_METRIC_REALISED_RETURN } enum EntityScope { @@ -1479,6 +1485,9 @@ type DispatchStrategy { "Optional multiplier on taker fees used to cap the rewards a party may receive in an epoch" capRewardFeeMultiple: String + + "Interval for the distribution of the transfer" + transferInterval: Int } type RankTable { @@ -1852,6 +1861,8 @@ type ERC20 { Note: this is a temporary measure that can be changed by governance """ withdrawThreshold: String! + "The chain ID the asset originates from." + chainId: String! } "An asset originated from an Ethereum ERC20 Token" @@ -2080,8 +2091,6 @@ type Spot { baseAsset: Asset! "Underlying quote asset for the spot product" quoteAsset: Asset! - "Name of the instrument" - name: String! } "Perpetual future product" @@ -2494,7 +2503,7 @@ type Market { """ The number of decimal places that an integer must be shifted by in order to get a correct - number denominated in the currency of the market. (uint64) + number denominated in the currency of the market. On spot markets, also called price decimal places. (uint64) Examples: Currency Balance decimalPlaces Real Balance @@ -2514,7 +2523,8 @@ type Market { The number of decimal places that an integer must be shifted in order to get a correct size (uint64). i.e. 0 means there are no fractional orders for the market, and order sizes are always whole sizes. 2 means sizes given as 10^2 * desired size, e.g. a desired size of 1.23 is represented as 123 in this market. - This sets how big the smallest order / position on the market can be. + This sets how big the smallest order / position on the market can be. On spot markets, used for order size + and also known as size decimal places. """ positionDecimalPlaces: Int! @@ -2564,9 +2574,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( @@ -2608,7 +2618,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! @@ -2621,7 +2631,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, @@ -2780,7 +2790,7 @@ type Candle { "Volume price (uint64)" volume: String! - "Total notional value of trades (uint64)" + "Total notional value of trades. This value is determined by multiplying price, using market decimal places, by size, using position decimal places. The number of decimal places needed to convert this value to a decimal is market decimal places plus position decimal places. (uint64)" notional: String! } @@ -2805,9 +2815,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( @@ -2823,7 +2833,7 @@ type Party { "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( @@ -2888,7 +2898,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( @@ -3233,9 +3243,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 @@ -3291,10 +3301,14 @@ 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" + 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 "Stop order cannot have matching OCO expiry times" REJECTION_REASON_STOP_ORDER_CANNOT_MATCH_OCO_EXPIRY_TIMES + "Stop orders on spot markets cannot have a position size override" + REJECTION_REASON_STOP_ORDER_SIZE_OVERRIDE_UNSUPPORTED_FOR_SPOT } "Stop order size override settings" @@ -3690,7 +3704,7 @@ type AccountUpdate { "All the data related to the approval of a withdrawal from the network" type Erc20WithdrawalApproval { - "The source asset in the ethereum network" + "The source asset on the bridged EVM chain" assetSource: String! "The amount to be withdrawn" amount: String! @@ -3705,6 +3719,8 @@ type Erc20WithdrawalApproval { targetAddress: String! "RFC3339Nano timestamp at which the withdrawal was created" creation: String! + "The chain ID of the bridged EVM chain" + sourceChainId: String! } "Response for the signature bundle to add a particular validator to the signer list of the multisig contract" @@ -3731,6 +3747,8 @@ type ERC20MultiSigSignerAddedBundle { signatures: String! "The epoch in which the validator was added" epochSeq: String! + "The ID of the EVM chain this signature bundle is valid for" + chainID: String! } "Response for the signature bundle to remove a particular validator from the signer list of the multisig contract" @@ -3759,6 +3777,8 @@ type ERC20MultiSigSignerRemovedBundle { signatures: String! "The epoch in which the validator was removed" epochSeq: String! + "The chain ID of the EVM blockchain this signature bundle is valid for" + chainID: String! } "Response for the signature bundle to allowlist an ERC20 token in the collateral bridge" @@ -4031,6 +4051,8 @@ enum ProposalRejectionReason { PROPOSAL_ERROR_MAJORITY_THRESHOLD_NOT_REACHED "Proposal declined because the participation threshold was not reached" PROPOSAL_ERROR_PARTICIPATION_THRESHOLD_NOT_REACHED + "Proposal declined because one of the sub proposals was rejected" + PROPOSAL_ERROR_PROPOSAL_IN_BATCH_REJECTED "Asset details are invalid" PROPOSAL_ERROR_INVALID_ASSET_DETAILS "Too many price monitoring triggers specified in market" @@ -4069,6 +4091,24 @@ enum ProposalRejectionReason { PROPOSAL_ERROR_INVALID_SLA_PARAMS "Perpetual market proposal contained invalid product definition" PROPOSAL_ERROR_INVALID_PERPETUAL_PRODUCT + "Spot market proposal contains too many size decimal places" + PROPOSAL_ERROR_INVALID_SIZE_DECIMAL_PLACES + "LP price range must be larger than 0" + PROPOSAL_ERROR_LP_PRICE_RANGE_NONPOSITIVE + "LP price range must not be larger than 100" + PROPOSAL_ERROR_LP_PRICE_RANGE_TOO_LARGE + "Linear slippage factor is out of range, either negative or too large" + PROPOSAL_ERROR_LINEAR_SLIPPAGE_FACTOR_OUT_OF_RANGE + "Quadratic slippage factor is out of range, either negative or too large" + PROPOSAL_ERROR_QUADRATIC_SLIPPAGE_FACTOR_OUT_OF_RANGE + "Referral program proposal is invalid" + PROPOSAL_ERROR_INVALID_REFERRAL_PROGRAM + "Volume discount program proposal is invalid" + PROPOSAL_ERROR_INVALID_VOLUME_DISCOUNT_PROGRAM + "One or more proposals in a batch has been rejected" + PROPOSAL_ERROR_PROPOSAL_IN_BATCH_REJECTED + "One or more proposals in a batch has been declined" + PROPOSAL_ERROR_PROPOSAL_IN_BATCH_DECLINED } "Why the order was rejected by the core node" @@ -4392,6 +4432,8 @@ enum AccountType { ACCOUNT_TYPE_PENDING_FEE_REFERRAL_REWARD "Per asset market account for party in isolated margin mode" ACCOUNT_TYPE_ORDER_MARGIN + "Realised return reward account is per asset per reward scheme" + ACCOUNT_TYPE_REWARD_REALISED_RETURN } "Types that describe why a transfer has been made" @@ -4505,8 +4547,6 @@ type SpotProduct { baseAsset: Asset! "Underlying quote asset for the spot product" quoteAsset: Asset! - "Name of the instrument" - name: String! } type PerpetualProduct { @@ -4654,7 +4694,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" @@ -4719,7 +4759,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" @@ -4773,7 +4813,7 @@ type UpdatePerpetualProduct { } union UpdateMarketRiskParameters = - UpdateMarketSimpleRiskModel + UpdateMarketSimpleRiskModel | UpdateMarketLogNormalRiskModel type UpdateMarketSimpleRiskModel { @@ -4854,7 +4894,7 @@ type NewTransfer { } union GovernanceTransferKind = - OneOffGovernanceTransfer + OneOffGovernanceTransfer | RecurringGovernanceTransfer "Allows for cancellation of an existing governance transfer" @@ -4942,7 +4982,7 @@ type NewSpotMarket { "New spot market instrument configuration" instrument: InstrumentConfiguration! "Decimal places used for the new market, sets the smallest price increment on the book" - decimal_places: Int! + priceDecimalPlaces: Int! "Optional spot market metadata tags" metadata: [String!]! "Price monitoring parameters" @@ -4952,7 +4992,7 @@ type NewSpotMarket { "New spot market risk model parameters" riskParameters: RiskModel "Decimal places for order sizes, sets what size the smallest order / position on the spot market can be" - positionDecimalPlaces: Int! + sizeDecimalPlaces: Int! "Specifies the liquidity provision SLA parameters" liquiditySLAParams: LiquiditySLAParameters! "Specifies how the liquidity fee for the market will be calculated" @@ -4969,7 +5009,16 @@ type UpdateSpotMarket { updateSpotMarketConfiguration: UpdateSpotMarketConfiguration! } +type UpdateSpotInstrumentConfiguration { + "Instrument code, human-readable shortcode used to describe the instrument." + code: String! + "Instrument name" + name: String! +} + type UpdateSpotMarketConfiguration { + "Updated spot market instrument configuration." + instrument: UpdateSpotInstrumentConfiguration! "Optional spot market metadata tags" metadata: [String!]! "Price monitoring parameters" @@ -5008,6 +5057,8 @@ type LiquidationStrategy { fullDisposalSize: Int! "Specifies the maximum size by which the network can reduce its position as a fraction of the volume on the book." maxFractionConsumed: String! + "Specifies the slippage relative to the mid prige within which the network will place orders to dispose of its position." + disposalSlippageRange: String! } "Representation of a network parameter" @@ -5019,7 +5070,7 @@ type NetworkParameter { } union ProposalChange = - NewMarket + NewMarket | UpdateMarket | UpdateNetworkParameter | NewAsset @@ -5078,6 +5129,10 @@ type BatchProposalTermsChange { Constrained by "minEnactInSeconds" and "maxEnactInSeconds" network parameters. """ enactmentDatetime: Timestamp + """ + RFC3339Nano time and date allocated to the validator to validate the proposal. + """ + validationDatetime: Timestamp "Actual change being introduced by the proposal - action the proposal triggers if passed and enacted." change: ProposalChange! @@ -6502,7 +6557,7 @@ type DataSourceSpecConfigurationTimeTrigger { } union InternalDataSourceKind = - DataSourceSpecConfigurationTime + DataSourceSpecConfigurationTime | DataSourceSpecConfigurationTimeTrigger """ @@ -6524,7 +6579,7 @@ type DataSourceDefinitionExternal { } union DataSourceKind = - DataSourceDefinitionInternal + DataSourceDefinitionInternal | DataSourceDefinitionExternal """ diff --git a/datanode/gateway/graphql/server.go b/datanode/gateway/graphql/server.go index 9ad2b4cf4f..9d46ccdc34 100644 --- a/datanode/gateway/graphql/server.go +++ b/datanode/gateway/graphql/server.go @@ -72,13 +72,22 @@ func New( serverAddr := fmt.Sprintf("%v:%v", config.Node.IP, config.Node.Port) - tdconn, err := grpc.Dial(serverAddr, grpc.WithInsecure(), ratelimit.WithSecret()) + tdconn, err := grpc.Dial( + serverAddr, + grpc.WithInsecure(), + ratelimit.WithSecret(), + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(config.Node.MaxMsgSize)), + ) if err != nil { return nil, err } tradingDataClientV2 := v2.NewTradingDataServiceClient(&clientConn{tdconn}) - tconn, err := grpc.Dial(serverAddr, grpc.WithInsecure()) + tconn, err := grpc.Dial( + serverAddr, + grpc.WithInsecure(), + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(config.MaxMsgSize)), + ) if err != nil { return nil, err } diff --git a/datanode/gateway/graphql/spot_resolver.go b/datanode/gateway/graphql/spot_resolver.go index 3caabbbe03..33f033fea8 100644 --- a/datanode/gateway/graphql/spot_resolver.go +++ b/datanode/gateway/graphql/spot_resolver.go @@ -40,7 +40,7 @@ func (r spotProductResolver) BaseAsset(ctx context.Context, obj *vega.SpotProduc } func (r spotProductResolver) QuoteAsset(ctx context.Context, obj *vega.SpotProduct) (*vega.Asset, error) { - return r.r.getAssetByID(ctx, obj.BaseAsset) + return r.r.getAssetByID(ctx, obj.QuoteAsset) } type updateSpotMarketResolver VegaResolverRoot @@ -51,6 +51,14 @@ func (r updateSpotMarketResolver) UpdateSpotMarketConfiguration(ctx context.Cont type updateSpotMarketConfigurationResolver VegaResolverRoot +// Instrument implements UpdateSpotMarketConfigurationResolver. +func (r *updateSpotMarketConfigurationResolver) Instrument(ctx context.Context, obj *types.UpdateSpotMarketConfiguration) (*UpdateSpotInstrumentConfiguration, error) { + return &UpdateSpotInstrumentConfiguration{ + Name: obj.Instrument.Name, + Code: obj.Instrument.Code, + }, nil +} + func (r updateSpotMarketConfigurationResolver) PriceMonitoringParameters(ctx context.Context, obj *vega.UpdateSpotMarketConfiguration) (*PriceMonitoringParameters, error) { return PriceMonitoringParametersFromProto(obj.PriceMonitoringParameters) } @@ -65,9 +73,9 @@ func (r updateSpotMarketConfigurationResolver) TargetStakeParameters(ctx context func (r updateSpotMarketConfigurationResolver) RiskParameters(ctx context.Context, obj *vega.UpdateSpotMarketConfiguration) (RiskModel, error) { switch model := obj.RiskParameters.(type) { case *vega.UpdateSpotMarketConfiguration_Simple: - return model, nil + return model.Simple, nil case *vega.UpdateSpotMarketConfiguration_LogNormal: - return model, nil + return model.LogNormal, nil default: return nil, errors.New("unknown risk model") } @@ -87,8 +95,8 @@ func (r newSpotMarketResolver) Instrument(ctx context.Context, obj *vega.NewSpot return obj.Changes.Instrument, nil } -func (r newSpotMarketResolver) DecimalPlaces(ctx context.Context, obj *vega.NewSpotMarket) (int, error) { - return int(obj.Changes.DecimalPlaces), nil +func (r newSpotMarketResolver) PriceDecimalPlaces(ctx context.Context, obj *vega.NewSpotMarket) (int, error) { + return int(obj.Changes.PriceDecimalPlaces), nil } func (r newSpotMarketResolver) Metadata(ctx context.Context, obj *vega.NewSpotMarket) ([]string, error) { @@ -109,16 +117,16 @@ func (r newSpotMarketResolver) TargetStakeParameters(ctx context.Context, obj *v func (r newSpotMarketResolver) RiskParameters(ctx context.Context, obj *vega.NewSpotMarket) (RiskModel, error) { switch model := obj.Changes.RiskParameters.(type) { case *vega.NewSpotMarketConfiguration_Simple: - return model, nil + return model.Simple, nil case *vega.NewSpotMarketConfiguration_LogNormal: - return model, nil + return model.LogNormal, nil default: return nil, errors.New("unknown risk model") } } -func (r newSpotMarketResolver) PositionDecimalPlaces(ctx context.Context, obj *vega.NewSpotMarket) (int, error) { - return int(obj.Changes.PositionDecimalPlaces), nil +func (r newSpotMarketResolver) SizeDecimalPlaces(ctx context.Context, obj *vega.NewSpotMarket) (int, error) { + return int(obj.Changes.SizeDecimalPlaces), nil } func (r newSpotMarketResolver) LiquiditySLAParams(ctx context.Context, obj *vega.NewSpotMarket) (*vega.LiquiditySLAParameters, error) { diff --git a/datanode/gateway/rest/server.go b/datanode/gateway/rest/server.go index bbaedfbf9b..15e972cb8d 100644 --- a/datanode/gateway/rest/server.go +++ b/datanode/gateway/rest/server.go @@ -134,9 +134,7 @@ func (s *ProxyServer) Start(ctx context.Context) (http.Handler, error) { opts := []grpc.DialOption{ grpc.WithInsecure(), - // 20MB, this is in bytes - // not the greatest solution, it x5 the default value. - grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(1024 * 1024 * 20)), + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(s.Config.Node.MaxMsgSize)), } marshalW := func(h http.Handler) http.Handler { diff --git a/datanode/networkhistory/initialise.go b/datanode/networkhistory/initialise.go index 23e0bb4ead..e82dcd6951 100644 --- a/datanode/networkhistory/initialise.go +++ b/datanode/networkhistory/initialise.go @@ -305,7 +305,7 @@ func GetMostRecentHistorySegmentFromPeersAddresses(ctx context.Context, peerAddr } func GetMostRecentHistorySegmentFromPeer(ctx context.Context, ip string, datanodeGrpcAPIPort int) (*v2.GetMostRecentNetworkHistorySegmentResponse, error) { - client, conn, err := GetDatanodeClientFromIPAndPort(ip, datanodeGrpcAPIPort) + client, conn, err := GetDatanodeClientFromIPAndPort(ip, datanodeGrpcAPIPort, 20*1024*1024) // @TODO hard-coded 20MB value, same as default config, pass this in correctly if err != nil { return nil, fmt.Errorf("failed to get datanode client:%w", err) } @@ -350,9 +350,13 @@ func SelectMostRecentHistorySegmentResponse(peerToResponse map[string]*v2.GetMos return nil } -func GetDatanodeClientFromIPAndPort(ip string, port int) (v2.TradingDataServiceClient, *grpc.ClientConn, error) { +func GetDatanodeClientFromIPAndPort(ip string, port, maxMsgSize int) (v2.TradingDataServiceClient, *grpc.ClientConn, error) { address := net.JoinHostPort(ip, strconv.Itoa(port)) - tdconn, err := grpc.Dial(address, grpc.WithInsecure()) + tdconn, err := grpc.Dial( + address, + grpc.WithInsecure(), + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(maxMsgSize)), + ) if err != nil { return nil, nil, err } diff --git a/datanode/networkhistory/service_test.go b/datanode/networkhistory/service_test.go index 63357bb03a..66ce17cad3 100644 --- a/datanode/networkhistory/service_test.go +++ b/datanode/networkhistory/service_test.go @@ -379,12 +379,12 @@ func TestMain(t *testing.M) { log.Infof("%s", goldenSourceHistorySegment[4000].HistorySegmentID) log.Infof("%s", goldenSourceHistorySegment[5000].HistorySegmentID) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[1000].HistorySegmentID, "QmVWnyMKCqUgbEKgqu8A2TrbF4ZHcpZwA7md3drJnytM7w", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2000].HistorySegmentID, "QmZ1ermXvdg5Q46AUsjFbcRyua2CRyCAvzSnUDoTJS1ocy", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2500].HistorySegmentID, "QmXRbe6e3aSAoaHbmq6r2rT652JVi6iVatraRCx5YC3rHK", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[3000].HistorySegmentID, "QmUGEnbnaG6teZ34ZS7pLiz6kiEFioL8TCLu65nPVnWUis", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[4000].HistorySegmentID, "QmNbpm2UxCpPhoq5k9PdWhfWRPjFBu2dc2cDvTtJAG3fwY", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[5000].HistorySegmentID, "QmSRoiei5VNMPtzjGL4QwT8uShFCAwFDL8BaaFjc6Kcgqc", snapshots) + 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) }, postgresRuntimePath, sqlFs) if exitCode != 0 { diff --git a/datanode/service/market.go b/datanode/service/market.go index 56586c7434..1623704316 100644 --- a/datanode/service/market.go +++ b/datanode/service/market.go @@ -32,15 +32,17 @@ type MarketStore interface { } type Markets struct { - store MarketStore - cacheLock sync.RWMutex - sf map[entities.MarketID]num.Decimal + store MarketStore + cacheLock sync.RWMutex + sf map[entities.MarketID]num.Decimal + isSpotCache map[entities.MarketID]bool } func NewMarkets(store MarketStore) *Markets { return &Markets{ - store: store, - sf: map[entities.MarketID]num.Decimal{}, + store: store, + sf: map[entities.MarketID]num.Decimal{}, + isSpotCache: map[entities.MarketID]bool{}, } } @@ -56,9 +58,11 @@ func (m *Markets) Upsert(ctx context.Context, market *entities.Market) error { if market.State == entities.MarketStateSettled || market.State == entities.MarketStateRejected { // a settled or rejected market can be safely removed from this map. delete(m.sf, market.ID) + delete(m.isSpotCache, market.ID) } else { // just in case this gets updated, or the market is new. m.sf[market.ID] = num.DecimalFromFloat(10).Pow(num.DecimalFromInt64(int64(market.PositionDecimalPlaces))) + m.isSpotCache[market.ID] = market.TradableInstrument.Instrument.GetSpot() != nil } m.cacheLock.Unlock() return nil @@ -88,6 +92,20 @@ func (m *Markets) GetMarketScalingFactor(ctx context.Context, marketID string) ( return pf, true } +func (m *Markets) IsSpotMarket(ctx context.Context, marketID string) bool { + m.cacheLock.Lock() + defer m.cacheLock.Unlock() + if is, ok := m.isSpotCache[entities.MarketID(marketID)]; ok { + return is + } + + market, err := m.store.GetByID(ctx, marketID) + if err != nil { + return false + } + return market.TradableInstrument.Instrument.GetSpot() != nil +} + func (m *Markets) GetAllPaged(ctx context.Context, marketID string, pagination entities.CursorPagination, includeSettled bool) ([]entities.Market, entities.PageInfo, error) { return m.store.GetAllPaged(ctx, marketID, pagination, includeSettled) } diff --git a/datanode/sqlstore/accounts.go b/datanode/sqlstore/accounts.go index fbffc4fefc..a11ca52ed9 100644 --- a/datanode/sqlstore/accounts.go +++ b/datanode/sqlstore/accounts.go @@ -56,7 +56,7 @@ func (as *Accounts) Add(ctx context.Context, a *entities.Account) error { `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`, - deterministicIDFromAccount(a), + DeterministicIDFromAccount(a), a.PartyID, a.AssetID, a.MarketID, @@ -123,7 +123,7 @@ func (as *Accounts) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([] // If an account already exists, fetch that one. // In either case, update the entities.Account object passed with an ID from the database. func (as *Accounts) Obtain(ctx context.Context, a *entities.Account) error { - accountID := deterministicIDFromAccount(a) + accountID := DeterministicIDFromAccount(a) if account, ok := as.getAccountFromCache(accountID); ok { a.ID = account.ID a.VegaTime = account.VegaTime @@ -186,7 +186,7 @@ func (as *Accounts) getAccountFromCache(id entities.AccountID) (entities.Account return entities.Account{}, false } -func deterministicIDFromAccount(a *entities.Account) entities.AccountID { +func DeterministicIDFromAccount(a *entities.Account) entities.AccountID { idAsBytes := sha256.Sum256([]byte(a.AssetID.String() + a.PartyID.String() + a.MarketID.String() + a.Type.String())) accountID := hex.EncodeToString(idAsBytes[:]) return entities.AccountID(accountID) diff --git a/datanode/sqlstore/assets.go b/datanode/sqlstore/assets.go index d5e59083c9..b57e62613f 100644 --- a/datanode/sqlstore/assets.go +++ b/datanode/sqlstore/assets.go @@ -48,8 +48,8 @@ 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, - `INSERT INTO assets(id, name, symbol, decimals, quantum, source, erc20_contract, lifetime_limit, withdraw_threshold, tx_hash, vega_time, status) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) + `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 name = EXCLUDED.name, symbol = EXCLUDED.symbol, @@ -61,7 +61,8 @@ func (as *Assets) Add(ctx context.Context, a entities.Asset) error { withdraw_threshold = EXCLUDED.withdraw_threshold, tx_hash = EXCLUDED.tx_hash, vega_time = EXCLUDED.vega_time, - status = EXCLUDED.status + status = EXCLUDED.status, + chain_id = EXCLUDED.chain_id ;`, a.ID, a.Name, @@ -75,6 +76,7 @@ func (as *Assets) Add(ctx context.Context, a entities.Asset) error { a.TxHash, a.VegaTime, a.Status, + a.ChainID, ) if err != nil { return err @@ -153,6 +155,6 @@ func (as *Assets) GetAllWithCursorPagination(ctx context.Context, pagination ent return assets, pageInfo, nil } -func getAssetQuery(ctx context.Context) string { +func getAssetQuery(_ context.Context) string { return `SELECT * FROM assets_current` } diff --git a/datanode/sqlstore/assets_test.go b/datanode/sqlstore/assets_test.go index fdf64371a0..dd6f71123c 100644 --- a/datanode/sqlstore/assets_test.go +++ b/datanode/sqlstore/assets_test.go @@ -22,6 +22,7 @@ import ( "code.vegaprotocol.io/vega/datanode/entities" "code.vegaprotocol.io/vega/datanode/sqlstore" + vegapb "code.vegaprotocol.io/vega/protos/vega" "github.com/shopspring/decimal" "github.com/stretchr/testify/assert" @@ -31,6 +32,16 @@ import ( var testAssetCount int func addTestAsset(t *testing.T, ctx context.Context, as *sqlstore.Assets, block entities.Block, idPrefix ...string) entities.Asset { + t.Helper() + asset := getTestAsst(t, block, idPrefix...) + + // Add it to the database + err := as.Add(ctx, asset) + require.NoError(t, err) + return asset +} + +func getTestAsst(t *testing.T, block entities.Block, idPrefix ...string) entities.Asset { t.Helper() // Make an asset testAssetCount++ @@ -41,12 +52,13 @@ func addTestAsset(t *testing.T, ctx context.Context, as *sqlstore.Assets, block assetID = fmt.Sprintf("%s%02d", idPrefix[0], testAssetCount) } - asset := entities.Asset{ + return entities.Asset{ ID: entities.AssetID(assetID), Name: fmt.Sprint("my test asset", testAssetCount), Symbol: fmt.Sprint("TEST", testAssetCount), Decimals: 5, Quantum: quantum, + ChainID: "1789", ERC20Contract: "0xdeadbeef", VegaTime: block.VegaTime, LifetimeLimit: decimal.New(42, 0), @@ -54,11 +66,6 @@ func addTestAsset(t *testing.T, ctx context.Context, as *sqlstore.Assets, block Status: entities.AssetStatusEnabled, TxHash: generateTxHash(), } - - // Add it to the database - err := as.Add(ctx, asset) - require.NoError(t, err) - return asset } func assetsEqual(t *testing.T, expected, actual entities.Asset) { @@ -71,6 +78,7 @@ func assetsEqual(t *testing.T, expected, actual entities.Asset) { assert.Equal(t, expected.Quantum, actual.Quantum) assert.Equal(t, expected.ERC20Contract, actual.ERC20Contract) assert.Equal(t, expected.VegaTime, actual.VegaTime) + assert.Equal(t, expected.ChainID, actual.ChainID) assert.True(t, expected.LifetimeLimit.Equal(actual.LifetimeLimit)) assert.True(t, expected.WithdrawThreshold.Equal(actual.WithdrawThreshold)) } @@ -398,3 +406,30 @@ func testAssetPaginationLastAndBeforeNewestFirst(t *testing.T) { EndCursor: assets[6].Cursor().Encode(), }, pageInfo) } + +func TestAssets_AssetStatusEnum(t *testing.T) { + ctx := tempTransaction(t) + + bs := sqlstore.NewBlocks(connectionSource) + var assetStatus vegapb.Asset_Status + + states := getEnums(t, assetStatus) + assert.Len(t, states, 5) + + for e, state := range states { + t.Run(state, func(tt *testing.T) { + block := addTestBlock(t, ctx, bs) + + as := sqlstore.NewAssets(connectionSource) + + asset := getTestAsst(t, block) + asset.Status = entities.AssetStatus(e) + err := as.Add(ctx, asset) + require.NoError(tt, err, "failed to add asset with state %s", state) + + fetchedAsset, err := as.GetByID(ctx, asset.ID.String()) + assert.NoError(tt, err) + assert.Equal(tt, entities.AssetStatus(e), fetchedAsset.Status) + }) + } +} diff --git a/datanode/sqlstore/candles_test.go b/datanode/sqlstore/candles_test.go index aea21a6d72..37b129146f 100644 --- a/datanode/sqlstore/candles_test.go +++ b/datanode/sqlstore/candles_test.go @@ -95,7 +95,6 @@ func TestCandlesPagination(t *testing.T) { candles, _, err = candleStore.GetCandleDataForTimeSpan(ctx, candleID, nil, nil, pagination) - if err != nil { t.Fatalf("failed to get candles with pagination:%s", err) } diff --git a/datanode/sqlstore/cursor.go b/datanode/sqlstore/cursor.go index 9b7733354f..cb802f8982 100644 --- a/datanode/sqlstore/cursor.go +++ b/datanode/sqlstore/cursor.go @@ -88,6 +88,21 @@ func (t *TableOrdering) Reversed() TableOrdering { return reversed } +// SetPrefixAll sets a prefix for all columns in the table ordering slice. +func (t *TableOrdering) SetPrefixAll(pf string) { + if len(*t) == 0 { + return + } + // need to cast to underlying slice type to be able to re-assign elements. + ts := []ColumnOrdering(*t) + for i, col := range *t { + col.Prefix = pf + ts[i] = col + } + // cast is needed here, if not the unit test fails. + *t = TableOrdering(ts) +} + // CursorPredicate generates an SQL predicate which excludes all rows before the supplied cursor, // with regards to the supplied table ordering. The values used for comparison are added to // the args list and bind variables used in the query fragment. diff --git a/datanode/sqlstore/cursor_test.go b/datanode/sqlstore/cursor_test.go index a81206e527..20f5a664a2 100644 --- a/datanode/sqlstore/cursor_test.go +++ b/datanode/sqlstore/cursor_test.go @@ -16,6 +16,7 @@ package sqlstore_test import ( + "fmt" "testing" "time" @@ -75,6 +76,73 @@ func TestCursorPredicate(t *testing.T) { } } +func TestTableOrderingPrefix(t *testing.T) { + prefix := "prefix_str" + prefixSuffixed := fmt.Sprintf("%s.", prefix) + testCases := []struct { + name string + ordering sqlstore.TableOrdering + orderPrefixed string + orderNoPrefix string + }{ + { + name: "single ascending", // ascending, single column + ordering: sqlstore.TableOrdering{ + sqlstore.NewColumnOrdering("vega_time", sqlstore.ASC), + }, + orderPrefixed: fmt.Sprintf("ORDER BY %s.vega_time ASC", prefix), + orderNoPrefix: "ORDER BY vega_time ASC", + }, + { + name: "single descending", // descending, single column + ordering: sqlstore.TableOrdering{ + sqlstore.NewColumnOrdering("vega_time", sqlstore.DESC), + }, + orderPrefixed: fmt.Sprintf("ORDER BY %s.vega_time DESC", prefix), + orderNoPrefix: "ORDER BY vega_time DESC", + }, + { + name: "multiple ascending", // ascending, multiple columns + ordering: sqlstore.TableOrdering{ + sqlstore.NewColumnOrdering("vega_time", sqlstore.ASC), + sqlstore.NewColumnOrdering("tx_hash", sqlstore.ASC), + }, + orderPrefixed: fmt.Sprintf("ORDER BY %s.vega_time ASC,%s.tx_hash ASC", prefix, prefix), + orderNoPrefix: "ORDER BY vega_time ASC,tx_hash ASC", + }, + { + name: "multiple descending", // descending, multiple columns + ordering: sqlstore.TableOrdering{ + sqlstore.NewColumnOrdering("vega_time", sqlstore.DESC), + sqlstore.NewColumnOrdering("tx_hash", sqlstore.DESC), + }, + orderPrefixed: fmt.Sprintf("ORDER BY %s.vega_time DESC,%s.tx_hash DESC", prefix, prefix), + orderNoPrefix: "ORDER BY vega_time DESC,tx_hash DESC", + }, + { + name: "multiple mixed", // multiple columns, one descending, one ascending + ordering: sqlstore.TableOrdering{ + sqlstore.NewColumnOrdering("vega_time", sqlstore.DESC), + sqlstore.NewColumnOrdering("tx_hash", sqlstore.ASC), + }, + orderPrefixed: fmt.Sprintf("ORDER BY %s.vega_time DESC,%s.tx_hash ASC", prefix, prefix), + orderNoPrefix: "ORDER BY vega_time DESC,tx_hash ASC", + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(tt *testing.T) { + require.Equal(t, tc.orderNoPrefix, tc.ordering.OrderByClause()) + tc.ordering.SetPrefixAll(prefix) + require.Equal(t, tc.orderPrefixed, tc.ordering.OrderByClause()) + tc.ordering.SetPrefixAll("") + require.Equal(t, tc.orderNoPrefix, tc.ordering.OrderByClause()) + // make sure that a prefix with the "." suffix included does not duplicate the "." + tc.ordering.SetPrefixAll(prefixSuffixed) + require.Equal(t, tc.orderPrefixed, tc.ordering.OrderByClause()) + }) + } +} + func TestCursor_Where(t *testing.T) { type args struct { Cmp string diff --git a/datanode/sqlstore/deposits_test.go b/datanode/sqlstore/deposits_test.go index d209d62619..4e99fb2dee 100644 --- a/datanode/sqlstore/deposits_test.go +++ b/datanode/sqlstore/deposits_test.go @@ -918,3 +918,30 @@ func testDepositsPaginationBetweenDatesLastBeforeNewestFirst(t *testing.T) { EndCursor: want[2].Cursor().Encode(), }, pageInfo) } + +func TestDeposits_DepositStatusEnum(t *testing.T) { + var depositStatus vega.Deposit_Status + + states := getEnums(t, depositStatus) + assert.Len(t, states, 5) + for e, state := range states { + t.Run(state, func(t *testing.T) { + ctx := tempTransaction(t) + bs, ds, _ := setupDepositStoreTests(t) + block := addTestBlock(t, ctx, bs) + amount := int64(1000) + + depositProto := getTestDeposit(fmt.Sprintf("deadbeef%02d", e), testID, testID, + strconv.FormatInt(amount, 10), GenerateID(), block.VegaTime.UnixNano()) + depositProto.Status = vega.Deposit_Status(e) + + deposit, err := entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime) + require.NoError(t, err, "Converting deposit proto to database entity") + require.NoError(t, ds.Upsert(ctx, deposit)) + + got, err := ds.GetByID(ctx, depositProto.Id) + require.NoError(t, err) + assert.Equal(t, deposit.Status, got.Status) + }) + } +} diff --git a/datanode/sqlstore/erc20_multisig_added_test.go b/datanode/sqlstore/erc20_multisig_added_test.go index 80131b910e..41afba8c70 100644 --- a/datanode/sqlstore/erc20_multisig_added_test.go +++ b/datanode/sqlstore/erc20_multisig_added_test.go @@ -96,18 +96,21 @@ func testGetWithFilters(t *testing.T) { err = ms.Add(ctx, getTestSignerEvent(t, vgcrypto.RandomHash(), vID2, generateEthereumAddress(), "12", true)) require.NoError(t, err) - res, _, err := ms.GetAddedEvents(ctx, vID1, "", nil, entities.CursorPagination{}) + res, _, err := ms.GetAddedEvents(ctx, vID1, "", nil, nil, entities.CursorPagination{}) require.NoError(t, err) require.Len(t, res, 2) assert.Equal(t, vID1, res[0].ValidatorID.String()) assert.Equal(t, vID1, res[1].ValidatorID.String()) + assert.Equal(t, "1450", res[0].ChainID) + assert.Equal(t, "1450", res[1].ChainID) epoch := int64(12) - res, _, err = ms.GetAddedEvents(ctx, vID1, "", &epoch, entities.CursorPagination{}) + res, _, err = ms.GetAddedEvents(ctx, vID1, "", &epoch, nil, entities.CursorPagination{}) require.NoError(t, err) require.Len(t, res, 1) assert.Equal(t, vID1, res[0].ValidatorID.String()) assert.Equal(t, int64(12), res[0].EpochID) + assert.Equal(t, "1450", res[0].ChainID) } func testGetWithAddAndRemoveEvents(t *testing.T) { @@ -136,17 +139,19 @@ func testGetWithAddAndRemoveEvents(t *testing.T) { err = ms.Add(ctx, getTestSignerEvent(t, vgcrypto.RandomHash(), vID2, generateEthereumAddress(), "12", true)) require.NoError(t, err) - res, _, err := ms.GetAddedEvents(ctx, vID1, "", nil, entities.CursorPagination{}) + res, _, err := ms.GetAddedEvents(ctx, vID1, "", nil, nil, entities.CursorPagination{}) require.NoError(t, err) require.Len(t, res, 1) assert.Equal(t, vID1, res[0].ValidatorID.String()) + assert.Equal(t, "1450", res[0].ChainID) - res, _, err = ms.GetRemovedEvents(ctx, vID1, submitter, nil, entities.CursorPagination{}) + res, _, err = ms.GetRemovedEvents(ctx, vID1, submitter, nil, nil, entities.CursorPagination{}) require.NoError(t, err) require.Len(t, res, 1) assert.Equal(t, vID1, res[0].ValidatorID.String()) + assert.Equal(t, "1450", res[0].ChainID) - res, _, err = ms.GetRemovedEvents(ctx, vID1, wrongSubmitter, nil, entities.CursorPagination{}) + res, _, err = ms.GetRemovedEvents(ctx, vID1, wrongSubmitter, nil, nil, entities.CursorPagination{}) require.NoError(t, err) require.Len(t, res, 0) } @@ -201,6 +206,7 @@ func getTestSignerEvent(t *testing.T, signatureID string, validatorID string, su Nonce: "nonce", EpochSeq: epochSeq, Timestamp: time.Unix(10000000, 13000).UnixNano(), + ChainId: "1450", }, generateTxHash(), ) @@ -219,6 +225,7 @@ func getTestSignerEvent(t *testing.T, signatureID string, validatorID string, su Nonce: "nonce", EpochSeq: epochSeq, Timestamp: time.Unix(10000000, 13000).UnixNano(), + ChainId: "1450", }, generateTxHash(), ) @@ -264,7 +271,7 @@ func testERC20MultiSigAddedEventPaginationNoPagination(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, pagination) + got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, nil, pagination) require.NoError(t, err) want := events[:10] assert.Equal(t, want, got) @@ -285,7 +292,7 @@ func testERC20MultiSigAddedEventPaginationFirst(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, pagination) + got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, nil, pagination) require.NoError(t, err) want := events[:3] assert.Equal(t, want, got) @@ -306,7 +313,7 @@ func testERC20MultiSigAddedEventPaginationLast(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, pagination) + got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, nil, pagination) require.NoError(t, err) want := events[7:10] assert.Equal(t, want, got) @@ -328,7 +335,7 @@ func testERC20MultiSigAddedEventPaginationFirstAfter(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, pagination) + got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, nil, pagination) require.NoError(t, err) want := events[3:6] assert.Equal(t, want, got) @@ -350,7 +357,7 @@ func testERC20MultiSigAddedEventPaginationLastBefore(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, pagination) + got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, nil, pagination) require.NoError(t, err) want := events[4:7] assert.Equal(t, want, got) @@ -370,7 +377,7 @@ func testERC20MultiSigAddedEventPaginationNoPaginationNewestFirst(t *testing.T) require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, pagination) + got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, nil, pagination) require.NoError(t, err) want := entities.ReverseSlice(events[:10]) assert.Equal(t, want, got) @@ -391,7 +398,7 @@ func testERC20MultiSigAddedEventPaginationFirstNewestFirst(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, pagination) + got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, nil, pagination) require.NoError(t, err) want := entities.ReverseSlice(events[:10])[:3] assert.Equal(t, want, got) @@ -412,7 +419,7 @@ func testERC20MultiSigAddedEventPaginationLastNewestFirst(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, pagination) + got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, nil, pagination) require.NoError(t, err) want := entities.ReverseSlice(events[:10])[7:] assert.Equal(t, want, got) @@ -434,7 +441,7 @@ func testERC20MultiSigAddedEventPaginationFirstAfterNewestFirst(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, pagination) + got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, nil, pagination) require.NoError(t, err) want := entities.ReverseSlice(events[:10])[3:6] assert.Equal(t, want, got) @@ -456,7 +463,7 @@ func testERC20MultiSigAddedEventPaginationLastBeforeNewestFirst(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, pagination) + got, pageInfo, err := es.GetAddedEvents(ctx, validator, "", nil, nil, pagination) require.NoError(t, err) want := entities.ReverseSlice(events[:10])[4:7] assert.Equal(t, want, got) @@ -476,7 +483,7 @@ func testERC20MultiSigRemovedEventPaginationNoPagination(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, pagination) + got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, nil, pagination) require.NoError(t, err) want := events[10:] assert.Equal(t, want, got) @@ -497,7 +504,7 @@ func testERC20MultiSigRemovedEventPaginationFirst(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, pagination) + got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, nil, pagination) require.NoError(t, err) want := events[10:13] assert.Equal(t, want, got) @@ -518,7 +525,7 @@ func testERC20MultiSigRemovedEventPaginationLast(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, pagination) + got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, nil, pagination) require.NoError(t, err) want := events[17:] assert.Equal(t, want, got) @@ -540,7 +547,7 @@ func testERC20MultiSigRemovedEventPaginationFirstAfter(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, pagination) + got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, nil, pagination) require.NoError(t, err) want := events[13:16] assert.Equal(t, want, got) @@ -562,7 +569,7 @@ func testERC20MultiSigRemovedEventPaginationLastBefore(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, pagination) + got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, nil, pagination) require.NoError(t, err) want := events[14:17] assert.Equal(t, want, got) @@ -582,7 +589,7 @@ func testERC20MultiSigRemovedEventPaginationNoPaginationNewestFirst(t *testing.T require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, pagination) + got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, nil, pagination) require.NoError(t, err) want := entities.ReverseSlice(events[10:]) assert.Equal(t, want, got) @@ -603,7 +610,7 @@ func testERC20MultiSigRemovedEventPaginationFirstNewestFirst(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, pagination) + got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, nil, pagination) require.NoError(t, err) want := entities.ReverseSlice(events[10:])[:3] assert.Equal(t, want, got) @@ -624,7 +631,7 @@ func testERC20MultiSigRemovedEventPaginationLastNewestFirst(t *testing.T) { require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, pagination) + got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, nil, pagination) require.NoError(t, err) want := entities.ReverseSlice(events[10:])[7:] assert.Equal(t, want, got) @@ -646,7 +653,7 @@ func testERC20MultiSigRemovedEventPaginationFirstAfterNewestFirst(t *testing.T) require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, pagination) + got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, nil, pagination) require.NoError(t, err) want := entities.ReverseSlice(events[10:])[3:6] assert.Equal(t, want, got) @@ -668,7 +675,7 @@ func testERC20MultiSigRemovedEventPaginationLastBeforeNewestFirst(t *testing.T) require.NoError(t, err) validator := "fc677151d0c93726" - got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, pagination) + got, pageInfo, err := es.GetRemovedEvents(ctx, validator, submitter, nil, nil, pagination) require.NoError(t, err) want := entities.ReverseSlice(events[10:])[4:7] assert.Equal(t, want, got) diff --git a/datanode/sqlstore/erc20_multisig_event.go b/datanode/sqlstore/erc20_multisig_event.go index 363f8edb87..2404578655 100644 --- a/datanode/sqlstore/erc20_multisig_event.go +++ b/datanode/sqlstore/erc20_multisig_event.go @@ -44,8 +44,8 @@ func NewERC20MultiSigSignerEvent(connectionSource *ConnectionSource) *ERC20Multi func (m *ERC20MultiSigSignerEvent) Add(ctx context.Context, e *entities.ERC20MultiSigSignerEvent) error { defer metrics.StartSQLQuery("ERC20MultiSigSignerEvent", "Add")() - query := `INSERT INTO erc20_multisig_signer_events (id, validator_id, signer_change, submitter, nonce, event, tx_hash, vega_time, epoch_id) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) + query := `INSERT INTO erc20_multisig_signer_events (id, validator_id, signer_change, submitter, nonce, event, tx_hash, vega_time, epoch_id, chain_id) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) ON CONFLICT (id) DO NOTHING` if _, err := m.Connection.Exec(ctx, query, @@ -58,6 +58,7 @@ func (m *ERC20MultiSigSignerEvent) Add(ctx context.Context, e *entities.ERC20Mul e.TxHash, e.VegaTime, e.EpochID, + e.ChainID, ); err != nil { err = fmt.Errorf("could not insert multisig-signer-events into database: %w", err) return err @@ -66,7 +67,7 @@ func (m *ERC20MultiSigSignerEvent) Add(ctx context.Context, e *entities.ERC20Mul return nil } -func (m *ERC20MultiSigSignerEvent) GetAddedEvents(ctx context.Context, validatorID string, submitter string, epochID *int64, pagination entities.CursorPagination) ( +func (m *ERC20MultiSigSignerEvent) GetAddedEvents(ctx context.Context, validatorID string, submitter string, epochID *int64, chainID *string, pagination entities.CursorPagination) ( []entities.ERC20MultiSigSignerEvent, entities.PageInfo, error, ) { var pageInfo entities.PageInfo @@ -87,6 +88,10 @@ func (m *ERC20MultiSigSignerEvent) GetAddedEvents(ctx context.Context, validator conditions = append(conditions, fmt.Sprintf("epoch_id=%s", nextBindVar(&args, *epochID))) } + if chainID != nil { + conditions = append(conditions, fmt.Sprintf("chain_id=%s", nextBindVar(&args, *chainID))) + } + conditions = append(conditions, fmt.Sprintf("event=%s", nextBindVar(&args, entities.ERC20MultiSigSignerEventTypeAdded))) query := `SELECT * FROM erc20_multisig_signer_events` @@ -118,12 +123,13 @@ func (m *ERC20MultiSigSignerEvent) GetAddedEvents(ctx context.Context, validator TxHash: e.TxHash, EpochID: e.EpochID, Event: e.Event, + ChainID: e.ChainID, } } return events, pageInfo, nil } -func (m *ERC20MultiSigSignerEvent) GetRemovedEvents(ctx context.Context, validatorID string, submitter string, epochID *int64, pagination entities.CursorPagination) ([]entities.ERC20MultiSigSignerEvent, entities.PageInfo, error) { +func (m *ERC20MultiSigSignerEvent) GetRemovedEvents(ctx context.Context, validatorID string, submitter string, epochID *int64, chainID *string, pagination entities.CursorPagination) ([]entities.ERC20MultiSigSignerEvent, entities.PageInfo, error) { var pageInfo entities.PageInfo var err error out := []entities.ERC20MultiSigSignerRemovedEvent{} @@ -142,6 +148,10 @@ func (m *ERC20MultiSigSignerEvent) GetRemovedEvents(ctx context.Context, validat conditions = append(conditions, fmt.Sprintf("epoch_id=%s", nextBindVar(&args, *epochID))) } + if chainID != nil { + conditions = append(conditions, fmt.Sprintf("chain_id=%s", nextBindVar(&args, *chainID))) + } + conditions = append(conditions, fmt.Sprintf("event=%s", nextBindVar(&args, entities.ERC20MultiSigSignerEventTypeRemoved))) query := `SELECT * FROM erc20_multisig_signer_events` @@ -173,6 +183,7 @@ func (m *ERC20MultiSigSignerEvent) GetRemovedEvents(ctx context.Context, validat VegaTime: e.VegaTime, EpochID: e.EpochID, Event: e.Event, + ChainID: e.ChainID, } } return events, pageInfo, nil diff --git a/datanode/sqlstore/funding_payments_test.go b/datanode/sqlstore/funding_payments_test.go index d662d874b1..0bfc5a3be0 100644 --- a/datanode/sqlstore/funding_payments_test.go +++ b/datanode/sqlstore/funding_payments_test.go @@ -46,8 +46,7 @@ func TestFundingPayments(t *testing.T) { fundingPayments := []*entities.FundingPayment{ { - PartyID: entities.PartyID("09d82547b823da327af14727d02936db75c33cffe8e09341a9fc729fe53865e0"), - + PartyID: entities.PartyID("09d82547b823da327af14727d02936db75c33cffe8e09341a9fc729fe53865e0"), MarketID: entities.MarketID("46d66ea0a00609615e04aaf6b41e5e9f552650535ed85059444d68bb6456852a"), FundingPeriodSeq: 1, Amount: num.MustDecimalFromString("-100"), @@ -55,8 +54,7 @@ func TestFundingPayments(t *testing.T) { TxHash: "09d82547b823da327af14727d02936db75c33cffe8e09341a9fc729fe53865e0", }, { - PartyID: entities.PartyID("947a700141e3d175304ee176d0beecf9ee9f462e09330e33c386952caf21f679"), - + PartyID: entities.PartyID("947a700141e3d175304ee176d0beecf9ee9f462e09330e33c386952caf21f679"), MarketID: entities.MarketID("46d66ea0a00609615e04aaf6b41e5e9f552650535ed85059444d68bb6456852a"), FundingPeriodSeq: 1, Amount: num.MustDecimalFromString("100"), @@ -64,8 +62,7 @@ func TestFundingPayments(t *testing.T) { TxHash: "f1e520d7612de709503d493a3335a4aa8e8b3125b5d5661b7bed7f509b67bf53", }, { - PartyID: entities.PartyID("09d82547b823da327af14727d02936db75c33cffe8e09341a9fc729fe53865e0"), - + PartyID: entities.PartyID("09d82547b823da327af14727d02936db75c33cffe8e09341a9fc729fe53865e0"), MarketID: entities.MarketID("46d66ea0a00609615e04aaf6b41e5e9f552650535ed85059444d68bb6456852a"), FundingPeriodSeq: 2, Amount: num.MustDecimalFromString("42"), @@ -73,8 +70,7 @@ func TestFundingPayments(t *testing.T) { TxHash: "09d82547b823da327af14727d02936db75c33cffe8e09341a9fc729fe53865e0", }, { - PartyID: entities.PartyID("947a700141e3d175304ee176d0beecf9ee9f462e09330e33c386952caf21f679"), - + PartyID: entities.PartyID("947a700141e3d175304ee176d0beecf9ee9f462e09330e33c386952caf21f679"), MarketID: entities.MarketID("46d66ea0a00609615e04aaf6b41e5e9f552650535ed85059444d68bb6456852a"), FundingPeriodSeq: 2, Amount: num.MustDecimalFromString("-42"), @@ -82,8 +78,7 @@ func TestFundingPayments(t *testing.T) { TxHash: "f1e520d7612de709503d493a3335a4aa8e8b3125b5d5661b7bed7f509b67bf53", }, { - PartyID: entities.PartyID("09d82547b823da327af14727d02936db75c33cffe8e09341a9fc729fe53865e0"), - + PartyID: entities.PartyID("09d82547b823da327af14727d02936db75c33cffe8e09341a9fc729fe53865e0"), MarketID: entities.MarketID("46d66ea0a00609615e04aaf6b41e5e9f552650535ed85059444d68bb6456852a"), FundingPeriodSeq: 3, Amount: num.MustDecimalFromString("25"), @@ -91,8 +86,7 @@ func TestFundingPayments(t *testing.T) { TxHash: "09d82547b823da327af14727d02936db75c33cffe8e09341a9fc729fe53865e0", }, { - PartyID: entities.PartyID("947a700141e3d175304ee176d0beecf9ee9f462e09330e33c386952caf21f679"), - + PartyID: entities.PartyID("947a700141e3d175304ee176d0beecf9ee9f462e09330e33c386952caf21f679"), MarketID: entities.MarketID("46d66ea0a00609615e04aaf6b41e5e9f552650535ed85059444d68bb6456852a"), FundingPeriodSeq: 3, Amount: num.MustDecimalFromString("-25"), @@ -100,8 +94,7 @@ func TestFundingPayments(t *testing.T) { TxHash: "f1e520d7612de709503d493a3335a4aa8e8b3125b5d5661b7bed7f509b67bf53", }, { - PartyID: entities.PartyID("09d82547b823da327af14727d02936db75c33cffe8e09341a9fc729fe53865e0"), - + PartyID: entities.PartyID("09d82547b823da327af14727d02936db75c33cffe8e09341a9fc729fe53865e0"), MarketID: entities.MarketID("f1e520d7612de709503d493a3335a4aa8e8b3125b5d5661b7bed7f509b67bf53"), FundingPeriodSeq: 1, Amount: num.MustDecimalFromString("2400"), diff --git a/datanode/sqlstore/funding_period_test.go b/datanode/sqlstore/funding_period_test.go index e95e6e7f05..45d55ba892 100644 --- a/datanode/sqlstore/funding_period_test.go +++ b/datanode/sqlstore/funding_period_test.go @@ -26,6 +26,7 @@ import ( "code.vegaprotocol.io/vega/datanode/sqlstore/helpers" "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/libs/ptr" + eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" "github.com/georgysavva/scany/pgxscan" "github.com/stretchr/testify/assert" @@ -776,3 +777,33 @@ func testListDataPointsPagination(t *testing.T, ctx context.Context, stores *fun nil, nil, pagination, want, wantPageInfo) }) } + +func TestFundingPeriodDataPointSource(t *testing.T) { + var fundingPeriodDataPointSource eventspb.FundingPeriodDataPoint_Source + sources := getEnums(t, fundingPeriodDataPointSource) + assert.Equal(t, 3, len(sources)) + for s, source := range sources { + t.Run(source, func(t *testing.T) { + ctx := tempTransaction(t) + + stores := setupFundingPeriodTests(ctx, t) + dp := entities.FundingPeriodDataPoint{ + MarketID: stores.markets[0].ID, + FundingPeriodSeq: 1, + DataPointType: entities.FundingPeriodDataPointSource(s), + Price: num.DecimalFromFloat(1.0), + Twap: num.DecimalFromFloat(1.0), + Timestamp: stores.blocks[2].VegaTime, + VegaTime: stores.blocks[2].VegaTime, + TxHash: generateTxHash(), + } + require.NoError(t, stores.fp.AddDataPoint(ctx, &dp)) + got := entities.FundingPeriodDataPoint{} + require.NoError(t, pgxscan.Get(ctx, stores.fp.Connection, &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), + ) + assert.Equal(t, dp, got) + }) + } +} diff --git a/datanode/sqlstore/ledger.go b/datanode/sqlstore/ledger.go index 4ec77882b3..6dfe83ef8f 100644 --- a/datanode/sqlstore/ledger.go +++ b/datanode/sqlstore/ledger.go @@ -198,7 +198,10 @@ func (ls *Ledger) Query( WHERE %s`, strings.Join(whereClauses, " AND "), ) - query, args, err := PaginateQuery[entities.AggregatedLedgerEntriesCursor](query, args, aggregateLedgerEntriesOrdering, pagination) + // set prefix to ensure ordering on ledger times, assign to local variable to make it safe for concurrent use + ord := aggregateLedgerEntriesOrdering + ord.SetPrefixAll("ledger") + query, args, err := PaginateQuery[entities.AggregatedLedgerEntriesCursor](query, args, ord, pagination) if err != nil { return nil, pageInfo, err } diff --git a/datanode/sqlstore/liquidity_provision_test.go b/datanode/sqlstore/liquidity_provision_test.go index f66d1474b9..df955e7c4e 100644 --- a/datanode/sqlstore/liquidity_provision_test.go +++ b/datanode/sqlstore/liquidity_provision_test.go @@ -1173,3 +1173,32 @@ func addLiquidityProvisionsMultiProvider(ctx context.Context, t *testing.T, bs * return activeProviders } + +func TestLiquidityProvision_Status(t *testing.T) { + var liquidityProvisionStatus vega.LiquidityProvision_Status + + states := getEnums(t, liquidityProvisionStatus) + assert.Len(t, states, 7) + for s, state := range states { + t.Run(state, func(t *testing.T) { + ctx := tempTransaction(t) + bs, lpStore, _ := setupLPTests(t) + block := addTestBlock(t, ctx, bs) + lpProto := getTestLiquidityProvision(false) + lp := lpProto[0] + lp.Status = vega.LiquidityProvision_Status(s) + + txHash := generateTxHash() + + want, err := entities.LiquidityProvisionFromProto(lp, txHash, block.VegaTime) + require.NoError(t, err) + assert.NoError(t, lpStore.Upsert(ctx, want)) + require.NoError(t, lpStore.Flush(ctx)) + + got, err := lpStore.GetByTxHash(ctx, txHash) + require.NoError(t, err) + require.Len(t, got, 1) + assert.Equal(t, want, got[0]) + }) + } +} diff --git a/datanode/sqlstore/margin_level_test.go b/datanode/sqlstore/margin_level_test.go index 0ad8a73691..66c196e789 100644 --- a/datanode/sqlstore/margin_level_test.go +++ b/datanode/sqlstore/margin_level_test.go @@ -1299,3 +1299,33 @@ func testGetMarginLevelsByIDPaginationWithMarketLastAndBeforeCursorNewestFirst(t EndCursor: entities.NewCursor(wantEndCursor.String()).Encode(), }, pageInfo) } + +func TestMarginLevels_MarginMode(t *testing.T) { + var marginMode vega.MarginMode + modes := getEnums(t, marginMode) + assert.Len(t, modes, 3) + + for m, mode := range modes { + t.Run(mode, func(t *testing.T) { + ctx := tempTransaction(t) + + blockSource, ml, accountStore, _ := setupMarginLevelTests(t, ctx) + block := blockSource.getNextBlock(t, ctx) + + marginLevelProto := getMarginLevelProto() + marginLevelProto.MarginMode = vega.MarginMode(m) + want, err := entities.MarginLevelsFromProto(ctx, marginLevelProto, accountStore, generateTxHash(), block.VegaTime) + require.NoError(t, err, "Converting margin levels proto to database entity") + + require.NoError(t, ml.Add(want)) + + _, err = ml.Flush(ctx) + require.NoError(t, err) + + got, err := ml.GetByTxHash(ctx, want.TxHash) + require.NoError(t, err) + assert.Len(t, got, 1) + assert.Equal(t, want, got[0]) + }) + } +} diff --git a/datanode/sqlstore/market_data_test.go b/datanode/sqlstore/market_data_test.go index 4864b32eb3..06f1c273af 100644 --- a/datanode/sqlstore/market_data_test.go +++ b/datanode/sqlstore/market_data_test.go @@ -34,6 +34,7 @@ import ( "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/libs/ptr" "code.vegaprotocol.io/vega/protos/vega" + vegapb "code.vegaprotocol.io/vega/protos/vega" "github.com/shopspring/decimal" "github.com/stretchr/testify/assert" @@ -80,6 +81,85 @@ func Test_MarketData(t *testing.T) { t.Run("GetHistoricMarketData should return all market data for a given market with date greater than or equal to the given date", getForMarketFromDate) t.Run("GetHistoricMarketData should return all market data for a given market with date less than or equal to the given date", getForMarketToDate) t.Run("GetHistoricMarketData should return all market data when no start or end is provided", TestGetAllMarketData) + t.Run("Add should work for all valid enumerations values of auction trigger", shouldWorkForAllValuesOfAuctionTrigger) + t.Run("Add should work for all valid enumerations values of composite price type", shouldWorkForAllValuesOfCompositePriceType) +} + +func shouldWorkForAllValuesOfCompositePriceType(t *testing.T) { + var priceType vegapb.CompositePriceType + enums := getEnums(t, priceType) + assert.Len(t, enums, 4) + + for e, pt := range enums { + t.Run(pt, func(t *testing.T) { + ctx := tempTransaction(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) + require.NoError(t, err) + + mdProto := got.ToProto() + + assert.Equal(t, vegapb.CompositePriceType(e), mdProto.MarkPriceType) + }) + } +} + +func addMarketData(t *testing.T, ctx context.Context, trigger, priceType string) { + t.Helper() + bs := sqlstore.NewBlocks(connectionSource) + block := addTestBlock(t, ctx, bs) + + md := sqlstore.NewMarketData(connectionSource) + err := md.Add(&entities.MarketData{ + Market: entities.MarketID("deadbeef"), + MarketTradingMode: "TRADING_MODE_MONITORING_AUCTION", + MarketState: "STATE_ACTIVE", + AuctionTrigger: trigger, + ExtensionTrigger: trigger, + MarkPriceType: priceType, + PriceMonitoringBounds: []*vega.PriceMonitoringBounds{ + { + MinValidPrice: "1", + MaxValidPrice: "2", + Trigger: &vega.PriceMonitoringTrigger{ + Horizon: 100, + Probability: "0.5", + AuctionExtension: 200, + }, + ReferencePrice: "3", + }, + }, + VegaTime: block.VegaTime, + }) + require.NoError(t, err) + + _, err = md.Flush(ctx) + require.NoError(t, err) +} + +func shouldWorkForAllValuesOfAuctionTrigger(t *testing.T) { + var auctionTrigger vegapb.AuctionTrigger + enums := getEnums(t, auctionTrigger) + assert.Len(t, enums, 8) + + for e, trigger := range enums { + t.Run(trigger, func(t *testing.T) { + ctx := tempTransaction(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) + require.NoError(t, err) + + mdProto := got.ToProto() + + assert.Equal(t, vegapb.AuctionTrigger(e), mdProto.Trigger) + }) + } } func shouldInsertAValidMarketDataRecord(t *testing.T) { diff --git a/datanode/sqlstore/markets_test.go b/datanode/sqlstore/markets_test.go index 552a198a55..a014e7cf23 100644 --- a/datanode/sqlstore/markets_test.go +++ b/datanode/sqlstore/markets_test.go @@ -394,7 +394,6 @@ func getTestSpotMarket() *vega.Market { Spot: &vega.Spot{ BaseAsset: "Ethereum", QuoteAsset: "USD", - Name: "ETH/USD", }, } @@ -552,10 +551,11 @@ func getTestMarket() *vega.Market { func getTestFutureMarketWithLiquidationStrategy(termInt bool) *vega.Market { mkt := getTestFutureMarket(termInt) mkt.LiquidationStrategy = &vega.LiquidationStrategy{ - DisposalTimeStep: 10, - DisposalFraction: "0.1", - FullDisposalSize: 20, - MaxFractionConsumed: "0.01", + DisposalTimeStep: 10, + DisposalFraction: "0.1", + FullDisposalSize: 20, + MaxFractionConsumed: "0.01", + DisposalSlippageRange: "0.1", } return mkt } @@ -1519,10 +1519,11 @@ func setupSuccessorMarkets(t *testing.T, ctx context.Context) (*sqlstore.Markets ts := sqlstore.NewParties(connectionSource) emptyLS := &vega.LiquidationStrategy{ - DisposalTimeStep: 0, - DisposalFraction: "0", - FullDisposalSize: 0, - MaxFractionConsumed: "0", + DisposalTimeStep: 0, + DisposalFraction: "0", + FullDisposalSize: 0, + MaxFractionConsumed: "0", + DisposalSlippageRange: "0", } liquidationStrat := entities.LiquidationStrategyFromProto(emptyLS) parentMarket := entities.Market{ @@ -1780,3 +1781,58 @@ func setupSuccessorMarkets(t *testing.T, ctx context.Context) (*sqlstore.Markets return md, entries, props } + +func TestMarketsEnums(t *testing.T) { + t.Run("All proto market states should be supported", testMarketState) + t.Run("All proto market trading modes should be supported", testMarketTradingMode) +} + +func testMarketState(t *testing.T) { + var marketState vega.Market_State + states := getEnums(t, marketState) + assert.Len(t, states, 11) + for s, state := range states { + t.Run(state, func(t *testing.T) { + bs, md := setupMarketsTest(t) + + ctx := tempTransaction(t) + + block := addTestBlock(t, ctx, bs) + + marketProto := getTestFutureMarket(true) + marketProto.State = vega.Market_State(s) + + market, err := entities.NewMarketFromProto(marketProto, generateTxHash(), block.VegaTime) + require.NoError(t, err, "Converting market proto to database entity") + require.NoError(t, md.Upsert(ctx, market)) + got, err := md.GetByID(ctx, market.ID.String()) + require.NoError(t, err) + assert.Equal(t, market.State, got.State) + }) + } +} + +func testMarketTradingMode(t *testing.T) { + var marketTradingMode vega.Market_TradingMode + modes := getEnums(t, marketTradingMode) + assert.Len(t, modes, 7) + for m, mode := range modes { + t.Run(mode, func(t *testing.T) { + bs, md := setupMarketsTest(t) + + ctx := tempTransaction(t) + + block := addTestBlock(t, ctx, bs) + + marketProto := getTestFutureMarket(true) + marketProto.TradingMode = vega.Market_TradingMode(m) + + market, err := entities.NewMarketFromProto(marketProto, generateTxHash(), block.VegaTime) + require.NoError(t, err, "Converting market proto to database entity") + require.NoError(t, md.Upsert(ctx, market)) + got, err := md.GetByID(ctx, market.ID.String()) + require.NoError(t, err) + assert.Equal(t, market.TradingMode, got.TradingMode) + }) + } +} diff --git a/datanode/sqlstore/migrations/0079_stop_orders_linked_to_order_or_position.sql b/datanode/sqlstore/migrations/0079_stop_orders_linked_to_order_or_position.sql index 5131ce64e1..15e8a9dd11 100644 --- a/datanode/sqlstore/migrations/0079_stop_orders_linked_to_order_or_position.sql +++ b/datanode/sqlstore/migrations/0079_stop_orders_linked_to_order_or_position.sql @@ -4,8 +4,4 @@ alter table stop_orders add column if not exists size_override_setting int not null default 0, add column if not exists size_override_value varchar null; --- +goose Down -alter table stop_orders - drop column if exists size_override_setting, - drop column if exists size_override_value; diff --git a/datanode/sqlstore/migrations/0098_fix_team_stats.sql b/datanode/sqlstore/migrations/0098_fix_team_stats.sql new file mode 100644 index 0000000000..63d5b0cfeb --- /dev/null +++ b/datanode/sqlstore/migrations/0098_fix_team_stats.sql @@ -0,0 +1,137 @@ +-- +goose Up + +DROP TRIGGER IF EXISTS update_teams_stats ON rewards; + +-- +goose StatementBegin +CREATE OR REPLACE FUNCTION update_teams_stats() + RETURNS + TRIGGER + LANGUAGE plpgsql +AS +$$ +DECLARE + party_team_id BYTEA; + additional_game_id JSONB; + team_dispatch_strategy JSONB; +BEGIN + -- Exclude any reward that is not associated to a game, as we only account for + -- game rewards in teams. + IF new.game_id IS NULL THEN + RETURN NULL; + END IF; + + -- Get the dispatch strategy for the game + SELECT dispatch_strategy + INTO team_dispatch_strategy + FROM (SELECT DISTINCT + ON (game_id) game_id, + dispatch_strategy + FROM transfers + WHERE transfer_type = 'Recurring' + ORDER BY game_id, vega_time DESC) AS dispatch_strategies + WHERE game_id = NEW.game_id; + + -- Exclude non team rewards. + IF team_dispatch_strategy IS NULL THEN + RETURN NULL; + ELSIF (team_dispatch_strategy ->> 'entity_scope' != '2') THEN + RETURN NULL; + END IF; + + WITH current_team_members AS (SELECT DISTINCT ON (party_id) * + FROM team_members + ORDER BY party_id, + joined_at_epoch DESC) + SELECT team_id + INTO party_team_id + FROM current_team_members + WHERE party_id = new.party_id; + + -- If the party does not belong to a team, no reporting needs to be done. + IF party_team_id IS NULL THEN + RETURN NULL; + END IF; + + additional_game_id = JSONB_BUILD_OBJECT(new.game_id, TRUE); + + INSERT INTO teams_stats (team_id, party_id, at_epoch, total_quantum_volume, total_quantum_reward, games_played) + VALUES (party_team_id, new.party_id, new.epoch_id, 0, new.quantum_amount, additional_game_id) + ON CONFLICT (team_id, party_id, at_epoch) DO UPDATE + SET total_quantum_reward = teams_stats.total_quantum_reward + new.quantum_amount, + games_played = teams_stats.games_played || additional_game_id; + RETURN NULL; +END; +$$; +-- +goose StatementEnd + +CREATE TRIGGER update_teams_stats + AFTER INSERT + ON rewards + FOR EACH ROW +EXECUTE FUNCTION update_teams_stats(); + +-- +goose Down + +DROP TRIGGER IF EXISTS update_teams_stats ON rewards; + +-- +goose StatementBegin +CREATE OR REPLACE FUNCTION update_teams_stats() + RETURNS + TRIGGER + LANGUAGE plpgsql +AS +$$ +DECLARE + party_team_id BYTEA; + additional_game_id JSONB; + team_dispatch_strategy JSONB; +BEGIN + -- Exclude any reward that is not associated to a game, as we only account for + -- game rewards in teams. + IF new.game_id IS NULL THEN + RETURN NULL; + END IF; + + -- Get the dispatch strategy for the game + SELECT dispatch_strategy + INTO team_dispatch_strategy + FROM (SELECT DISTINCT + ON (game_id) game_id, + dispatch_strategy + FROM transfers + WHERE transfer_type = 'Recurring' + ORDER BY game_id, vega_time DESC) AS dispatch_strategies + WHERE game_id = NEW.game_id; + + IF team_dispatch_strategy IS NULL THEN + RETURN NULL; + ELSIF (team_dispatch_strategy ->> 'entity_scope' != '2') THEN + RETURN NULL; + END IF; + + WITH current_team_members AS (SELECT DISTINCT + ON (party_id) * + FROM team_members + ORDER BY party_id, + joined_at_epoch DESC) + SELECT team_id + INTO party_team_id + FROM current_team_members + WHERE party_id = new.party_id; + + -- If the party does not belong to a team, no reporting needs to be done. + IF party_team_id IS NULL THEN + RETURN NULL; + END IF; + + additional_game_id = JSONB_BUILD_OBJECT(new.game_id, TRUE); + + INSERT INTO teams_stats (team_id, party_id, at_epoch, total_quantum_volume, total_quantum_reward, games_played) + VALUES (party_team_id, new.party_id, new.epoch_id, 0, new.quantum_amount, additional_game_id) + ON CONFLICT (team_id, party_id, at_epoch) DO UPDATE + SET total_quantum_reward = teams_stats.total_quantum_reward + new.quantum_amount, + games_played = teams_stats.games_played || additional_game_id; + RETURN NULL; +END; +$$; +-- +goose StatementEnd diff --git a/datanode/sqlstore/migrations/0099_add_stop_order_rejection_reason.sql b/datanode/sqlstore/migrations/0099_add_stop_order_rejection_reason.sql new file mode 100644 index 0000000000..0fb40ab8d8 --- /dev/null +++ b/datanode/sqlstore/migrations/0099_add_stop_order_rejection_reason.sql @@ -0,0 +1,7 @@ +-- +goose Up + +ALTER TYPE stop_order_rejection_reason ADD VALUE IF NOT EXISTS 'REJECTION_REASON_STOP_ORDER_LINKED_PERCENTAGE_INVALID' AFTER 'REJECTION_REASON_STOP_ORDER_NOT_CLOSING_THE_POSITION'; + +-- +goose Down + +-- Do nothing, if it already exists it won't matter and won't be recreated by the up migration. diff --git a/datanode/sqlstore/migrations/0100_update_proposal_error.sql b/datanode/sqlstore/migrations/0100_update_proposal_error.sql new file mode 100644 index 0000000000..04345b0611 --- /dev/null +++ b/datanode/sqlstore/migrations/0100_update_proposal_error.sql @@ -0,0 +1,6 @@ +-- +goose Up + +ALTER TYPE proposal_error ADD VALUE IF NOT EXISTS 'PROPOSAL_ERROR_INVALID_POSITION_DECIMAL_PLACES'; + +-- +goose Down + diff --git a/datanode/sqlstore/migrations/0101_secondary_bridge.sql b/datanode/sqlstore/migrations/0101_secondary_bridge.sql new file mode 100644 index 0000000000..e5b60c27ba --- /dev/null +++ b/datanode/sqlstore/migrations/0101_secondary_bridge.sql @@ -0,0 +1,54 @@ +-- +goose Up + +DROP VIEW IF EXISTS assets_current; + +ALTER TABLE assets + ADD COLUMN IF NOT EXISTS chain_id VARCHAR NOT NULL default ''; + +ALTER TABLE erc20_multisig_signer_events + ADD COLUMN IF NOT EXISTS chain_id VARCHAR NOT NULL default ''; + +CREATE VIEW assets_current AS +( +SELECT DISTINCT ON (id) * +FROM assets +ORDER BY id, vega_time DESC + ); + +-- +goose StatementBegin +DO +$$ + DECLARE + primary_chain_id VARCHAR; + BEGIN + -- All existing assets come have been enable on the primary bridge. + -- So it's safe to update all assets with the chain ID configured in the + -- network parameters. + SELECT value::JSONB ->> 'chain_id' as chain_id + INTO primary_chain_id + FROM network_parameters_current + WHERE key = 'blockchains.ethereumConfig'; + + UPDATE assets SET chain_id = primary_chain_id; + UPDATE erc20_multisig_signer_events SET chain_id = primary_chain_id; + END; +$$; +-- +goose StatementEnd + + +-- +goose Down +DROP VIEW IF EXISTS assets_current; + +ALTER TABLE assets + DROP COLUMN IF EXISTS chain_id; + +CREATE VIEW assets_current AS +( +SELECT DISTINCT ON (id) * +FROM assets +ORDER BY id, vega_time DESC + ); + + +ALTER TABLE erc20_multisig_signer_events + DROP COLUMN IF EXISTS chain_id; \ No newline at end of file diff --git a/datanode/sqlstore/migrations/0102_update_proposal_error_name.sql b/datanode/sqlstore/migrations/0102_update_proposal_error_name.sql new file mode 100644 index 0000000000..db6e14333a --- /dev/null +++ b/datanode/sqlstore/migrations/0102_update_proposal_error_name.sql @@ -0,0 +1,23 @@ +-- +goose Up + +ALTER TYPE proposal_error ADD VALUE IF NOT EXISTS 'PROPOSAL_ERROR_INVALID_SIZE_DECIMAL_PLACES'; + +CREATE TYPE proposal_error_new AS ENUM('PROPOSAL_ERROR_UNSPECIFIED', 'PROPOSAL_ERROR_CLOSE_TIME_TOO_SOON', 'PROPOSAL_ERROR_CLOSE_TIME_TOO_LATE', 'PROPOSAL_ERROR_ENACT_TIME_TOO_SOON', 'PROPOSAL_ERROR_ENACT_TIME_TOO_LATE', 'PROPOSAL_ERROR_INSUFFICIENT_TOKENS', 'PROPOSAL_ERROR_INVALID_INSTRUMENT_SECURITY', 'PROPOSAL_ERROR_NO_PRODUCT', 'PROPOSAL_ERROR_UNSUPPORTED_PRODUCT', 'PROPOSAL_ERROR_NO_TRADING_MODE', 'PROPOSAL_ERROR_UNSUPPORTED_TRADING_MODE', 'PROPOSAL_ERROR_NODE_VALIDATION_FAILED', 'PROPOSAL_ERROR_MISSING_BUILTIN_ASSET_FIELD', 'PROPOSAL_ERROR_MISSING_ERC20_CONTRACT_ADDRESS', 'PROPOSAL_ERROR_INVALID_ASSET', 'PROPOSAL_ERROR_INCOMPATIBLE_TIMESTAMPS', 'PROPOSAL_ERROR_NO_RISK_PARAMETERS', 'PROPOSAL_ERROR_NETWORK_PARAMETER_INVALID_KEY', 'PROPOSAL_ERROR_NETWORK_PARAMETER_INVALID_VALUE', 'PROPOSAL_ERROR_NETWORK_PARAMETER_VALIDATION_FAILED', 'PROPOSAL_ERROR_OPENING_AUCTION_DURATION_TOO_SMALL', 'PROPOSAL_ERROR_OPENING_AUCTION_DURATION_TOO_LARGE', 'PROPOSAL_ERROR_MARKET_MISSING_LIQUIDITY_COMMITMENT', 'PROPOSAL_ERROR_COULD_NOT_INSTANTIATE_MARKET', 'PROPOSAL_ERROR_INVALID_FUTURE_PRODUCT', 'PROPOSAL_ERROR_MISSING_COMMITMENT_AMOUNT', 'PROPOSAL_ERROR_INVALID_FEE_AMOUNT', 'PROPOSAL_ERROR_INVALID_SHAPE', 'PROPOSAL_ERROR_INVALID_RISK_PARAMETER', 'PROPOSAL_ERROR_MAJORITY_THRESHOLD_NOT_REACHED', 'PROPOSAL_ERROR_PARTICIPATION_THRESHOLD_NOT_REACHED', 'PROPOSAL_ERROR_INVALID_ASSET_DETAILS', 'PROPOSAL_ERROR_UNKNOWN_TYPE', 'PROPOSAL_ERROR_UNKNOWN_RISK_PARAMETER_TYPE', 'PROPOSAL_ERROR_INVALID_FREEFORM', 'PROPOSAL_ERROR_INSUFFICIENT_EQUITY_LIKE_SHARE', 'PROPOSAL_ERROR_INVALID_MARKET', 'PROPOSAL_ERROR_TOO_MANY_MARKET_DECIMAL_PLACES', 'PROPOSAL_ERROR_TOO_MANY_PRICE_MONITORING_TRIGGERS', 'PROPOSAL_ERROR_ERC20_ADDRESS_ALREADY_IN_USE','PROPOSAL_ERROR_INVALID_SUCCESSOR_MARKET','PROPOSAL_ERROR_GOVERNANCE_TRANSFER_PROPOSAL_INVALID','PROPOSAL_ERROR_GOVERNANCE_TRANSFER_PROPOSAL_FAILED','PROPOSAL_ERROR_GOVERNANCE_CANCEL_TRANSFER_PROPOSAL_INVALID','PROPOSAL_ERROR_INVALID_MARKET_STATE_UPDATE','PROPOSAL_ERROR_MISSING_SLA_PARAMS','PROPOSAL_ERROR_INVALID_SLA_PARAMS','PROPOSAL_ERROR_INVALID_PERPETUAL_PRODUCT','PROPOSAL_ERROR_LP_PRICE_RANGE_NONPOSITIVE','PROPOSAL_ERROR_LP_PRICE_RANGE_TOO_LARGE','PROPOSAL_ERROR_LINEAR_SLIPPAGE_FACTOR_OUT_OF_RANGE','PROPOSAL_ERROR_QUADRATIC_SLIPPAGE_FACTOR_OUT_OF_RANGE','PROPOSAL_ERROR_INVALID_SPOT','PROPOSAL_ERROR_SPOT_PRODUCT_DISABLED','PROPOSAL_ERROR_INVALID_REFERRAL_PROGRAM','PROPOSAL_ERROR_INVALID_VOLUME_DISCOUNT_PROGRAM','PROPOSAL_ERROR_PROPOSAL_IN_BATCH_REJECTED','PROPOSAL_ERROR_PROPOSAL_IN_BATCH_DECLINED','PROPOSAL_ERROR_INVALID_SIZE_DECIMAL_PLACES'); + +DELETE FROM proposals WHERE reason = 'PROPOSAL_ERROR_INVALID_POSITION_DECIMAL_PLACES'; + +DROP VIEW IF EXISTS proposals_current; + +ALTER TABLE proposals ALTER COLUMN reason TYPE proposal_error_new USING reason::text::proposal_error_new; + +DROP TYPE proposal_error; + +ALTER TYPE proposal_error_new RENAME TO proposal_error; + +-- Recreate the proposals_current view +CREATE VIEW proposals_current AS ( + SELECT DISTINCT ON (id) * FROM proposals ORDER BY id, vega_time DESC +); + +-- +goose Down + diff --git a/datanode/sqlstore/migrations/0103_retro_fill_team_reward_totals.sql b/datanode/sqlstore/migrations/0103_retro_fill_team_reward_totals.sql new file mode 100644 index 0000000000..8fc8054a32 --- /dev/null +++ b/datanode/sqlstore/migrations/0103_retro_fill_team_reward_totals.sql @@ -0,0 +1,99 @@ +-- +goose Up + +-- Carry over all reward totals that are missing across epochs. +-- +goose StatementBegin +do $$ +declare + first_epoch bigint; + last_epoch bigint; +begin + select min(epoch_id), max(epoch_id) into first_epoch, last_epoch from game_reward_totals; + if first_epoch is null or last_epoch is null then + return; + end if; + + -- for each epoch, we want to carry over rewards that exist in this epoch, but not in the next + -- we have to do it one epoch at a time, so that the carried forward rewards can continue to be carried + -- over to the next epoch as well. + for epoch in first_epoch..last_epoch-1 loop + + INSERT INTO game_reward_totals(game_id, party_id, asset_id, market_id, team_id, total_rewards, total_rewards_quantum, epoch_id) + SELECT DISTINCT -- we need distinct because the game ID is a hash of the dispatch metric on the transfer and these can be duplicated across multiple transfers when they are cancelled and replaced, or have been rejected at some point. + grto.game_id, + grto.party_id, + grto.asset_id, + grto.market_id, + grto.team_id, + grto.total_rewards, + grto.total_rewards_quantum, + (grto.epoch_id + 1) AS epoch_id + FROM game_reward_totals AS grto + -- get the game end date from the transfer table and do not carry over rewards for games that have ended + JOIN transfers_current t on grto.game_id = t.game_id and t.transfer_type = 'Recurring' and t.end_epoch > grto.epoch_id + WHERE grto.epoch_id = epoch + AND NOT EXISTS ( + SELECT 1 + FROM game_reward_totals AS grtc + WHERE grtc.party_id = grto.party_id + AND grtc.asset_id = grto.asset_id + AND grtc.market_id = grto.market_id + AND grtc.game_id = grto.game_id + AND grtc.team_id = grto.team_id + AND grtc.epoch_id = grto.epoch_id + 1 + ); + end loop; + +end; +$$; +-- +goose StatementEnd + + + +-- Create a function to carry over data between 2 given epochs. +-- +goose StatementBegin +CREATE OR REPLACE FUNCTION carry_over_rewards_on_epoch() + RETURNS TRIGGER + LANGUAGE PLPGSQL AS +$$ +BEGIN + INSERT INTO game_reward_totals (game_id, party_id, asset_id, market_id, team_id, total_rewards, total_rewards_quantum, epoch_id) + SELECT + grto.game_id, + grto.party_id, + grto.asset_id, + grto.market_id, + grto.team_id, + grto.total_rewards, + grto.total_rewards_quantum, + (NEW.id - 1) AS epoch_id + FROM game_reward_totals AS grto + -- get the game end date from the transfer table and do not carry over rewards for games that have ended + JOIN transfers t on grto.game_id = t.game_id and t.end_epoch > grto.epoch_id + WHERE grto.epoch_id = (NEW.id - 2) + AND NOT EXISTS ( + SELECT 1 + FROM game_reward_totals AS grtc + WHERE grtc.party_id = grto.party_id + AND grtc.game_id = grto.game_id + AND grtc.asset_id = grto.asset_id + AND grtc.market_id = grto.market_id + AND grtc.team_id = grto.team_id + AND grtc.epoch_id = (NEW.id - 1) + ); +RETURN NEW; +END; +$$; +-- +goose StatementEnd + +-- add trigger to the epochs table +CREATE OR REPLACE TRIGGER carry_over_epoch_data + AFTER INSERT + ON epochs + FOR EACH STATEMENT + EXECUTE FUNCTION carry_over_rewards_on_epoch(); + +-- +goose Down + +DROP TRIGGER IF EXISTS carry_over_epoch_data ON epochs; + +DROP FUNCTION IF EXISTS carry_over_rewards_on_epoch(); diff --git a/datanode/sqlstore/migrations/0104_recreate_stop_order_views.sql b/datanode/sqlstore/migrations/0104_recreate_stop_order_views.sql new file mode 100644 index 0000000000..57778ddf38 --- /dev/null +++ b/datanode/sqlstore/migrations/0104_recreate_stop_order_views.sql @@ -0,0 +1,75 @@ +-- +goose Up + +create or replace view stop_orders_current_desc +as + select distinct on (so.created_at, so.id) * + from stop_orders so + order by so.created_at desc, so.id, so.vega_time desc, so.seq_num desc; + +create or replace view stop_orders_current_desc_by_market +as + select distinct on (so.created_at, so.market_id, so.id) * + from stop_orders so + order by so.created_at desc, so.market_id, so.id, so.vega_time desc, so.seq_num desc; + +create or replace view stop_orders_current_desc_by_party +as +select distinct on (so.created_at, so.party_id, so.id) * +from stop_orders so +order by so.created_at desc, so.party_id, so.id, so.vega_time desc, so.seq_num desc; + +alter table stop_orders_live + add column if not exists size_override_setting int not null default 0, + add column if not exists size_override_value varchar null; + +-- +goose StatementBegin +create or replace function stop_orders_live_insert_trigger() +returns trigger + language plpgsql + as $$ +begin + delete from stop_orders_live + where id = new.id; + + if new.status in ('STATUS_UNSPECIFIED', 'STATUS_PENDING') then + insert into stop_orders_live + values (new.id, new.oco_link_id, new.expires_at, new.expiry_strategy, new.trigger_direction, new.status, + new.created_at, new.updated_at, new.order_id, new.trigger_price, new.trigger_percent_offset, new.party_id, + new.market_id, new.vega_time, new.seq_num, new.tx_hash, new.submission, new.size_override_setting, new.size_override_value); + end if; + + return new; +end; +$$; + +-- +goose StatementEnd + +drop trigger if exists stop_orders_live_insert_trigger on stop_orders; +create trigger stop_orders_live_insert_trigger before insert on stop_orders for each row execute function stop_orders_live_insert_trigger(); + +-- +goose Down + +-- restore the views to how they were befpre the migration or network history may fail due to migrations failing +drop view if exists stop_orders_current_desc; +create view stop_orders_current_desc +as +select distinct on (so.created_at, so.id) id, oco_link_id, expires_at, expiry_strategy, trigger_direction, status, created_at, + updated_at, order_id, trigger_price, trigger_percent_offset, party_id, market_id, vega_time, seq_num, tx_hash, submission + from stop_orders so + order by so.created_at desc, so.id, so.vega_time desc, so.seq_num desc; + +drop view if exists stop_orders_current_desc_by_market; +create view stop_orders_current_desc_by_market +as +select distinct on (so.created_at, so.market_id, so.id)id, oco_link_id, expires_at, expiry_strategy, trigger_direction, status, created_at, + updated_at, order_id, trigger_price, trigger_percent_offset, party_id, market_id, vega_time, seq_num, tx_hash, submission + from stop_orders so + order by so.created_at desc, so.market_id, so.id, so.vega_time desc, so.seq_num desc; + +drop view if exists stop_orders_current_desc_by_party; +create view stop_orders_current_desc_by_party +as +select distinct on (so.created_at, so.party_id, so.id)id, oco_link_id, expires_at, expiry_strategy, trigger_direction, status, created_at, + updated_at, order_id, trigger_price, trigger_percent_offset, party_id, market_id, vega_time, seq_num, tx_hash, submission + from stop_orders so + order by so.created_at desc, so.party_id, so.id, so.vega_time desc, so.seq_num desc; diff --git a/datanode/sqlstore/migrations/0105_games_stats_team_members_fix.sql b/datanode/sqlstore/migrations/0105_games_stats_team_members_fix.sql new file mode 100644 index 0000000000..5d004dabf9 --- /dev/null +++ b/datanode/sqlstore/migrations/0105_games_stats_team_members_fix.sql @@ -0,0 +1,225 @@ +-- +goose Up + +drop materialized view if exists game_stats; +drop materialized view if exists game_stats_current; + +-- These materialized views should only be updated once per epoch +create materialized view game_stats as +with + game_epochs as ( + select distinct + game_id, epoch_id + from rewards + where + game_id is not null + ), + dispatch_strategies AS ( + SELECT DISTINCT + ON (game_id) game_id, dispatch_strategy + FROM transfers + WHERE + transfer_type = 'Recurring' + ORDER BY game_id, vega_time DESC + ), + game_rewards as ( + select + r.*, t.dispatch_strategy, tm.team_id, tmr.rank as member_rank, tr.rank as team_rank, tmr.total_rewards, tmr.total_rewards_quantum, + tr.total_rewards as team_total_rewards, tr.total_rewards_quantum as team_total_rewards_quantum, 'ENTITY_SCOPE_TEAMS' as entity_scope + from + rewards r + join game_epochs ge on r.game_id = ge.game_id + and r.epoch_id = ge.epoch_id + JOIN dispatch_strategies t ON r.game_id = t.game_id + AND t.dispatch_strategy ->> 'entity_scope' = '2' + join current_team_members tm on r.party_id = tm.party_id + left join game_team_rankings tr on r.game_id = tr.game_id + and r.epoch_id = tr.epoch_id + and tm.team_id = tr.team_id + left join game_team_member_rankings tmr on r.game_id = tmr.game_id + and r.epoch_id = tmr.epoch_id + and tm.team_id = tmr.team_id + and r.party_id = tmr.party_id + union all + select + r.*, t.dispatch_strategy, null as team_id, tmr.rank as member_rank, null as team_rank, tmr.total_rewards, tmr.total_rewards_quantum, + null as team_total_rewards, null as team_total_rewards_quantum, 'ENTITY_SCOPE_INDIVIDUALS' as entity_scope + from + rewards r + join game_epochs ge on r.game_id = ge.game_id + and r.epoch_id = ge.epoch_id + JOIN dispatch_strategies t ON r.game_id = t.game_id + AND t.dispatch_strategy ->> 'entity_scope' = '1' + left join game_individual_rankings tmr on r.game_id = tmr.game_id + and r.epoch_id = tmr.epoch_id + and r.party_id = tmr.party_id + ) +select * +from game_rewards +with data; + +create materialized view game_stats_current as +with + game_epochs as ( + select game_id, max(epoch_id) as epoch_id + from rewards + where + game_id is not null + group by + game_id + ), + dispatch_strategies AS ( + SELECT DISTINCT + ON (game_id) game_id, dispatch_strategy + FROM transfers + WHERE + transfer_type = 'Recurring' + ORDER BY game_id, vega_time DESC + ), + game_rewards as ( + select + r.*, t.dispatch_strategy, tm.team_id, tmr.rank as member_rank, tr.rank as team_rank, tmr.total_rewards, tmr.total_rewards_quantum, + tr.total_rewards as team_total_rewards, tr.total_rewards_quantum as team_total_rewards_quantum, 'ENTITY_SCOPE_TEAMS' as entity_scope + from + rewards r + join game_epochs ge on r.game_id = ge.game_id + and r.epoch_id = ge.epoch_id + JOIN dispatch_strategies t ON r.game_id = t.game_id + AND t.dispatch_strategy ->> 'entity_scope' = '2' + join current_team_members tm on r.party_id = tm.party_id + left join game_team_rankings tr on r.game_id = tr.game_id + and r.epoch_id = tr.epoch_id + and tm.team_id = tr.team_id + left join game_team_member_rankings tmr on r.game_id = tmr.game_id + and r.epoch_id = tmr.epoch_id + and tm.team_id = tmr.team_id + and r.party_id = tmr.party_id + union all + select + r.*, t.dispatch_strategy, null as team_id, tmr.rank as member_rank, null as team_rank, tmr.total_rewards, tmr.total_rewards_quantum, + null as team_total_rewards, null as team_total_rewards_quantum, 'ENTITY_SCOPE_INDIVIDUALS' as entity_scope + from + rewards r + join game_epochs ge on r.game_id = ge.game_id + and r.epoch_id = ge.epoch_id + JOIN dispatch_strategies t ON r.game_id = t.game_id + AND t.dispatch_strategy ->> 'entity_scope' = '1' + left join game_individual_rankings tmr on r.game_id = tmr.game_id + and r.epoch_id = tmr.epoch_id + and r.party_id = tmr.party_id + ) +select * +from game_rewards +with data; + +-- +goose Down + +drop materialized view if exists game_stats; +drop materialized view if exists game_stats_current; + +-- These materialized views should only be updated once per epoch +create materialized view game_stats as +with + game_epochs as ( + select distinct + game_id, epoch_id + from rewards + where + game_id is not null + ), + dispatch_strategies AS ( + SELECT DISTINCT + ON (game_id) game_id, dispatch_strategy + FROM transfers + WHERE + transfer_type = 'Recurring' + ORDER BY game_id, vega_time DESC + ), + game_rewards as ( + select + r.*, t.dispatch_strategy, tm.team_id, tmr.rank as member_rank, tr.rank as team_rank, tmr.total_rewards, tmr.total_rewards_quantum, + tr.total_rewards as team_total_rewards, tr.total_rewards_quantum as team_total_rewards_quantum, 'ENTITY_SCOPE_TEAMS' as entity_scope + from + rewards r + join game_epochs ge on r.game_id = ge.game_id + and r.epoch_id = ge.epoch_id + JOIN dispatch_strategies t ON r.game_id = t.game_id + AND t.dispatch_strategy ->> 'entity_scope' = '2' + join team_members tm on r.party_id = tm.party_id + left join game_team_rankings tr on r.game_id = tr.game_id + and r.epoch_id = tr.epoch_id + and tm.team_id = tr.team_id + left join game_team_member_rankings tmr on r.game_id = tmr.game_id + and r.epoch_id = tmr.epoch_id + and tm.team_id = tmr.team_id + and r.party_id = tmr.party_id + union all + select + r.*, t.dispatch_strategy, null as team_id, tmr.rank as member_rank, null as team_rank, tmr.total_rewards, tmr.total_rewards_quantum, + null as team_total_rewards, null as team_total_rewards_quantum, 'ENTITY_SCOPE_INDIVIDUALS' as entity_scope + from + rewards r + join game_epochs ge on r.game_id = ge.game_id + and r.epoch_id = ge.epoch_id + JOIN dispatch_strategies t ON r.game_id = t.game_id + AND t.dispatch_strategy ->> 'entity_scope' = '1' + left join game_individual_rankings tmr on r.game_id = tmr.game_id + and r.epoch_id = tmr.epoch_id + and r.party_id = tmr.party_id + ) +select * +from game_rewards +with data; + +create materialized view game_stats_current as +with + game_epochs as ( + select game_id, max(epoch_id) as epoch_id + from rewards + where + game_id is not null + group by + game_id + ), + dispatch_strategies AS ( + SELECT DISTINCT + ON (game_id) game_id, dispatch_strategy + FROM transfers + WHERE + transfer_type = 'Recurring' + ORDER BY game_id, vega_time DESC + ), + game_rewards as ( + select + r.*, t.dispatch_strategy, tm.team_id, tmr.rank as member_rank, tr.rank as team_rank, tmr.total_rewards, tmr.total_rewards_quantum, + tr.total_rewards as team_total_rewards, tr.total_rewards_quantum as team_total_rewards_quantum, 'ENTITY_SCOPE_TEAMS' as entity_scope + from + rewards r + join game_epochs ge on r.game_id = ge.game_id + and r.epoch_id = ge.epoch_id + JOIN dispatch_strategies t ON r.game_id = t.game_id + AND t.dispatch_strategy ->> 'entity_scope' = '2' + join team_members tm on r.party_id = tm.party_id + left join game_team_rankings tr on r.game_id = tr.game_id + and r.epoch_id = tr.epoch_id + and tm.team_id = tr.team_id + left join game_team_member_rankings tmr on r.game_id = tmr.game_id + and r.epoch_id = tmr.epoch_id + and tm.team_id = tmr.team_id + and r.party_id = tmr.party_id + union all + select + r.*, t.dispatch_strategy, null as team_id, tmr.rank as member_rank, null as team_rank, tmr.total_rewards, tmr.total_rewards_quantum, + null as team_total_rewards, null as team_total_rewards_quantum, 'ENTITY_SCOPE_INDIVIDUALS' as entity_scope + from + rewards r + join game_epochs ge on r.game_id = ge.game_id + and r.epoch_id = ge.epoch_id + JOIN dispatch_strategies t ON r.game_id = t.game_id + AND t.dispatch_strategy ->> 'entity_scope' = '1' + left join game_individual_rankings tmr on r.game_id = tmr.game_id + and r.epoch_id = tmr.epoch_id + and r.party_id = tmr.party_id + ) +select * +from game_rewards +with data; diff --git a/datanode/sqlstore/migrations/0106_add_stop_order_rejection_reason.sql b/datanode/sqlstore/migrations/0106_add_stop_order_rejection_reason.sql new file mode 100644 index 0000000000..6e0686a16c --- /dev/null +++ b/datanode/sqlstore/migrations/0106_add_stop_order_rejection_reason.sql @@ -0,0 +1,7 @@ +-- +goose Up + +ALTER TYPE stop_order_rejection_reason ADD VALUE IF NOT EXISTS 'REJECTION_REASON_STOP_ORDER_SIZE_OVERRIDE_UNSUPPORTED_FOR_SPOT'; + +-- +goose Down + +-- Do nothing, if it already exists it won't matter and won't be recreated by the up migration. diff --git a/datanode/sqlstore/migrations/0107_ensure_distinct_game_id.sql b/datanode/sqlstore/migrations/0107_ensure_distinct_game_id.sql new file mode 100644 index 0000000000..a722bca448 --- /dev/null +++ b/datanode/sqlstore/migrations/0107_ensure_distinct_game_id.sql @@ -0,0 +1,154 @@ +-- +goose Up + +drop materialized view if exists game_stats; +drop materialized view if exists game_stats_current; +drop view if exists game_individual_rankings; + +create view game_individual_rankings as +with individual_games as ( + -- get the games where the entity scope is individuals + select distinct game_id + from transfers + where dispatch_strategy ->> 'entity_scope' = '1' + and game_id is not null), + individual_totals as ( + -- calculate the total rewards for each individual in each individual entity scoped game + select t.game_id, + t.epoch_id, + t.asset_id, + t.party_id, + sum(t.total_rewards) as total_rewards, + sum(total_rewards_quantum) as total_rewards_quantum + from game_reward_totals t + join individual_games i on t.game_id = i.game_id + group by t.game_id, t.epoch_id, t.asset_id, t.party_id), + individual_rankings as ( +-- rank the individuals for each game at each epoch + select game_id, + epoch_id, + party_id, + total_rewards_quantum, + rank() over ( + partition by game_id, epoch_id order by total_rewards_quantum desc + ) as rank + from individual_totals) +select it.game_id, + it.epoch_id, + it.party_id, + it.total_rewards, + ir.total_rewards_quantum, + ir.rank +from individual_totals it + join individual_rankings ir + on it.game_id = ir.game_id and it.epoch_id = ir.epoch_id and it.party_id = ir.party_id; + +create materialized view game_stats as +with + game_epochs as ( + select distinct + game_id, epoch_id + from rewards + where + game_id is not null + ), + dispatch_strategies AS ( + SELECT DISTINCT + ON (game_id) game_id, dispatch_strategy + FROM transfers + WHERE + transfer_type = 'Recurring' + ORDER BY game_id, vega_time DESC + ), + game_rewards as ( + select + r.*, t.dispatch_strategy, tm.team_id, tmr.rank as member_rank, tr.rank as team_rank, tmr.total_rewards, tmr.total_rewards_quantum, + tr.total_rewards as team_total_rewards, tr.total_rewards_quantum as team_total_rewards_quantum, 'ENTITY_SCOPE_TEAMS' as entity_scope + from + rewards r + join game_epochs ge on r.game_id = ge.game_id + and r.epoch_id = ge.epoch_id + JOIN dispatch_strategies t ON r.game_id = t.game_id + AND t.dispatch_strategy ->> 'entity_scope' = '2' + join team_members tm on r.party_id = tm.party_id + left join game_team_rankings tr on r.game_id = tr.game_id + and r.epoch_id = tr.epoch_id + and tm.team_id = tr.team_id + left join game_team_member_rankings tmr on r.game_id = tmr.game_id + and r.epoch_id = tmr.epoch_id + and tm.team_id = tmr.team_id + and r.party_id = tmr.party_id + union all + select + r.*, t.dispatch_strategy, null as team_id, tmr.rank as member_rank, null as team_rank, tmr.total_rewards, tmr.total_rewards_quantum, + null as team_total_rewards, null as team_total_rewards_quantum, 'ENTITY_SCOPE_INDIVIDUALS' as entity_scope + from + rewards r + join game_epochs ge on r.game_id = ge.game_id + and r.epoch_id = ge.epoch_id + JOIN dispatch_strategies t ON r.game_id = t.game_id + AND t.dispatch_strategy ->> 'entity_scope' = '1' + left join game_individual_rankings tmr on r.game_id = tmr.game_id + and r.epoch_id = tmr.epoch_id + and r.party_id = tmr.party_id + ) +select * +from game_rewards +with data; + +create materialized view game_stats_current as +with + game_epochs as ( + select game_id, max(epoch_id) as epoch_id + from rewards + where + game_id is not null + group by + game_id + ), + dispatch_strategies AS ( + SELECT DISTINCT + ON (game_id) game_id, dispatch_strategy + FROM transfers + WHERE + transfer_type = 'Recurring' + ORDER BY game_id, vega_time DESC + ), + game_rewards as ( + select + r.*, t.dispatch_strategy, tm.team_id, tmr.rank as member_rank, tr.rank as team_rank, tmr.total_rewards, tmr.total_rewards_quantum, + tr.total_rewards as team_total_rewards, tr.total_rewards_quantum as team_total_rewards_quantum, 'ENTITY_SCOPE_TEAMS' as entity_scope + from + rewards r + join game_epochs ge on r.game_id = ge.game_id + and r.epoch_id = ge.epoch_id + JOIN dispatch_strategies t ON r.game_id = t.game_id + AND t.dispatch_strategy ->> 'entity_scope' = '2' + join team_members tm on r.party_id = tm.party_id + left join game_team_rankings tr on r.game_id = tr.game_id + and r.epoch_id = tr.epoch_id + and tm.team_id = tr.team_id + left join game_team_member_rankings tmr on r.game_id = tmr.game_id + and r.epoch_id = tmr.epoch_id + and tm.team_id = tmr.team_id + and r.party_id = tmr.party_id + union all + select + r.*, t.dispatch_strategy, null as team_id, tmr.rank as member_rank, null as team_rank, tmr.total_rewards, tmr.total_rewards_quantum, + null as team_total_rewards, null as team_total_rewards_quantum, 'ENTITY_SCOPE_INDIVIDUALS' as entity_scope + from + rewards r + join game_epochs ge on r.game_id = ge.game_id + and r.epoch_id = ge.epoch_id + JOIN dispatch_strategies t ON r.game_id = t.game_id + AND t.dispatch_strategy ->> 'entity_scope' = '1' + left join game_individual_rankings tmr on r.game_id = tmr.game_id + and r.epoch_id = tmr.epoch_id + and r.party_id = tmr.party_id + ) +select * +from game_rewards +with data; + +-- +goose Down + +-- We are fixing a bug, and there is no point of reinstating a bug, we do nothing. diff --git a/datanode/sqlstore/node_test.go b/datanode/sqlstore/node_test.go index 430bfc2737..b977d2d187 100644 --- a/datanode/sqlstore/node_test.go +++ b/datanode/sqlstore/node_test.go @@ -22,7 +22,9 @@ import ( "code.vegaprotocol.io/vega/datanode/entities" "code.vegaprotocol.io/vega/datanode/sqlstore" + vegapb "code.vegaprotocol.io/vega/protos/vega" + "github.com/georgysavva/scany/pgxscan" "github.com/shopspring/decimal" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -550,3 +552,75 @@ func TestNode_AddRankingScoreInSameEpoch(t *testing.T) { VegaTime: block.VegaTime, }) } + +func TestNodeStatusEnum(t *testing.T) { + var nodeStatus vegapb.NodeStatus + states := getEnums(t, nodeStatus) + assert.Len(t, states, 3) + for s, state := range states { + t.Run(state, func(t *testing.T) { + ctx := tempTransaction(t) + + bs := sqlstore.NewBlocks(connectionSource) + ns := sqlstore.NewNode(connectionSource) + block := addTestBlock(t, ctx, bs) + + node := entities.Node{ + ID: entities.NodeID(GenerateID()), + PubKey: entities.VegaPublicKey(GenerateID()), + TmPubKey: entities.TendermintPublicKey(generateTendermintPublicKey()), + EthereumAddress: entities.EthereumAddress(generateEthereumAddress()), + VegaTime: block.VegaTime, + Status: entities.NodeStatus(s), + TxHash: generateTxHash(), + } + + require.NoError(t, ns.UpsertNode(ctx, &node)) + fetched, err := ns.GetByTxHash(ctx, node.TxHash) + assert.NoError(t, err) + assert.Len(t, fetched, 1) + assert.Equal(t, node.Status, fetched[0].Status) + }) + } +} + +func TestNodeValidatorStatusEnum(t *testing.T) { + var validatorNodeStatus vegapb.ValidatorNodeStatus + states := getEnums(t, validatorNodeStatus) + assert.Len(t, states, 4) + + for s, state := range states { + t.Run(state, func(t *testing.T) { + ctx := tempTransaction(t) + + bs := sqlstore.NewBlocks(connectionSource) + ns := sqlstore.NewNode(connectionSource) + + block := addTestBlock(t, ctx, bs) + node1 := addTestNode(t, ctx, ns, block, GenerateID()) + score := entities.RankingScore{ + StakeScore: decimal.NewFromFloat(0.5), + PerformanceScore: decimal.NewFromFloat(0.25), + PreviousStatus: entities.ValidatorNodeStatusUnspecified, + Status: entities.ValidatorNodeStatus(s), + EpochSeq: 1, + VegaTime: block.VegaTime, + TxHash: generateTxHash(), + } + addRankingScore(t, ctx, ns, node1, score) + var got entities.RankingScore + require.NoError(t, pgxscan.Get(ctx, connectionSource.Connection, &got, ` + SELECT + stake_score, + performance_score, + previous_status, + status, + voting_power, + ranking_score, + tx_hash, + vega_time + FROM ranking_scores WHERE tx_hash = $1`, score.TxHash)) + assert.Equal(t, score.Status, got.Status) + }) + } +} diff --git a/datanode/sqlstore/notary_test.go b/datanode/sqlstore/notary_test.go index 24e179bcf2..3a53db5106 100644 --- a/datanode/sqlstore/notary_test.go +++ b/datanode/sqlstore/notary_test.go @@ -375,3 +375,24 @@ func setupNodeSignaturePaginationTest(t *testing.T, ctx context.Context) (*sqlst return ns, signatures } + +func TestNodeSignatureKindEnum(t *testing.T) { + var nodeSignatureKind v1.NodeSignatureKind + sigKinds := getEnums(t, nodeSignatureKind) + assert.Len(t, sigKinds, 6) + for k, kind := range sigKinds { + t.Run(kind, func(t *testing.T) { + ctx := tempTransaction(t) + + ws, bs, _ := setupNotaryStoreTests(t) + + ns := getTestNodeSignature(t, ctx, bs, "deadbeef", "iamsig") + ns.Kind = entities.NodeSignatureKind(k) + require.NoError(t, ws.Add(ctx, ns)) + got, err := ws.GetByTxHash(ctx, ns.TxHash) + require.NoError(t, err) + assert.Len(t, got, 1) + assert.Equal(t, ns.Kind, got[0].Kind) + }) + } +} diff --git a/datanode/sqlstore/oracle_spec_test.go b/datanode/sqlstore/oracle_spec_test.go index cf10d1e022..e42949a23b 100644 --- a/datanode/sqlstore/oracle_spec_test.go +++ b/datanode/sqlstore/oracle_spec_test.go @@ -692,3 +692,29 @@ func testOracleSpecPaginationLastBeforeNewestFirst(t *testing.T) { EndCursor: specs[6].Cursor().Encode(), }, pageInfo) } + +func TestOracleSpecStatusEnum(t *testing.T) { + var oracleSpecStatus vegapb.DataSourceSpec_Status + states := getEnums(t, oracleSpecStatus) + assert.Len(t, states, 3) + for s, state := range states { + t.Run(state, func(t *testing.T) { + ctx := tempTransaction(t) + + bs, os, _ := setupOracleSpecTest(t) + + block := addTestBlock(t, ctx, bs) + specProtos := getTestSpecs() + + proto := specProtos[0] + proto.ExternalDataSourceSpec.Spec.Status = vegapb.DataSourceSpec_Status(s) + data := entities.OracleSpecFromProto(proto, generateTxHash(), block.VegaTime) + assert.NoError(t, os.Upsert(ctx, data)) + + got, err := os.GetByTxHash(ctx, data.ExternalDataSourceSpec.Spec.TxHash) + require.NoError(t, err) + assert.Len(t, got, 1) + assert.Equal(t, data.ExternalDataSourceSpec.Spec.Status, got[0].ExternalDataSourceSpec.Spec.Status) + }) + } +} diff --git a/datanode/sqlstore/positions_test.go b/datanode/sqlstore/positions_test.go index a2a739b8f2..bd52df28f1 100644 --- a/datanode/sqlstore/positions_test.go +++ b/datanode/sqlstore/positions_test.go @@ -23,6 +23,7 @@ import ( "code.vegaprotocol.io/vega/datanode/entities" "code.vegaprotocol.io/vega/datanode/sqlstore" + vegapb "code.vegaprotocol.io/vega/protos/vega" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -631,3 +632,47 @@ func testPositionCursorPaginationPartyMarketNoCursorNewestFirst(t *testing.T) { EndCursor: want[0].Cursor().Encode(), }, pageInfo) } + +func TestPositionStatusEnum(t *testing.T) { + var positionStatus vegapb.PositionStatus + states := getEnums(t, positionStatus) + for s, state := range states { + t.Run(state, func(t *testing.T) { + ctx := tempTransaction(t) + + ps := sqlstore.NewPositions(connectionSource) + qs := sqlstore.NewParties(connectionSource) + bs := sqlstore.NewBlocks(connectionSource) + + block := addTestBlockForTime(t, ctx, bs, time.Now().Add((-26*time.Hour)-(2*time.Second))) + + market := entities.Market{ID: entities.MarketID("dead")} + party := addTestParty(t, ctx, qs, block) + pos := entities.NewEmptyPosition(market.ID, party.ID) + volume := int64(100) + pos.OpenVolume = volume + pos.PendingOpenVolume = volume + pos.VegaTime = block.VegaTime + pos.RealisedPnl = decimal.New(0, 0) + pos.PendingRealisedPnl = decimal.New(0, 0) + pos.UnrealisedPnl = decimal.New(0, 0) + pos.PendingUnrealisedPnl = decimal.New(0, 0) + pos.AverageEntryPrice = decimal.New(0, 0) + pos.PendingAverageEntryPrice = decimal.New(0, 0) + pos.AverageEntryMarketPrice = decimal.New(0, 0) + pos.PendingAverageEntryMarketPrice = decimal.New(0, 0) + pos.Adjustment = decimal.New(0, 0) + pos.Loss = decimal.New(0, 0) + pos.TxHash = generateTxHash() + pos.DistressedStatus = entities.PositionStatus(s) + require.NoError(t, ps.Add(ctx, pos)) + _, err := ps.Flush(ctx) + require.NoError(t, err) + + got, err := ps.GetByTxHash(ctx, pos.TxHash) + require.NoError(t, err) + assert.Len(t, got, 1) + assert.Equal(t, pos.DistressedStatus, got[0].DistressedStatus) + }) + } +} diff --git a/datanode/sqlstore/proposals_test.go b/datanode/sqlstore/proposals_test.go index 4b42a8148b..856765e9b9 100644 --- a/datanode/sqlstore/proposals_test.go +++ b/datanode/sqlstore/proposals_test.go @@ -1222,7 +1222,6 @@ func getNewSpotMarketProposal(partyID string) *vega.Proposal { Spot: &vega.SpotProduct{ BaseAsset: "USD", QuoteAsset: "ETH", - Name: "ETH/USD", }, }, }, @@ -1549,3 +1548,72 @@ func testShouldUpdateSavePerpetualMarketProposalsToStore(t *testing.T) { assert.NotNil(t, perps) }) } + +func TestProposalEnums(t *testing.T) { + t.Run("Should save and retrieve proposals with all possible errors", testProposalError) + t.Run("Should save and retrieve proposals with all possible states", testProposalState) +} + +func testProposalError(t *testing.T) { + var proposalError vega.ProposalError + errs := getEnums(t, proposalError) + assert.Len(t, errs, 55) + + for e, err := range errs { + t.Run(err, func(t *testing.T) { + ctx := tempTransaction(t) + + partyStore := sqlstore.NewParties(connectionSource) + propStore := sqlstore.NewProposals(connectionSource) + blockStore := sqlstore.NewBlocks(connectionSource) + block1 := addTestBlock(t, ctx, blockStore) + + party1 := addTestParty(t, ctx, partyStore, block1) + rationale1 := entities.ProposalRationale{ProposalRationale: &vega.ProposalRationale{Title: "myurl1.com", Description: "desc"}} + terms1 := entities.ProposalTerms{ProposalTerms: &vega.ProposalTerms{Change: &vega.ProposalTerms_NewMarket{NewMarket: &vega.NewMarket{}}}} + id1 := GenerateID() + + reference1 := GenerateID() + prop1 := addTestProposal(t, ctx, propStore, id1, party1, reference1, block1, entities.ProposalStateEnacted, rationale1, terms1, entities.ProposalError(e), nil, entities.BatchProposalTerms{}) + + prop1ID := prop1.ID.String() + + expected := prop1 + actual, err := propStore.GetByID(ctx, prop1ID) + require.NoError(t, err) + assertProposalMatch(t, expected, actual) + }) + } +} + +func testProposalState(t *testing.T) { + var proposalState vega.Proposal_State + errs := getEnums(t, proposalState) + assert.Len(t, errs, 8) + + for s, state := range errs { + t.Run(state, func(t *testing.T) { + ctx := tempTransaction(t) + + partyStore := sqlstore.NewParties(connectionSource) + propStore := sqlstore.NewProposals(connectionSource) + blockStore := sqlstore.NewBlocks(connectionSource) + block1 := addTestBlock(t, ctx, blockStore) + + party1 := addTestParty(t, ctx, partyStore, block1) + rationale1 := entities.ProposalRationale{ProposalRationale: &vega.ProposalRationale{Title: "myurl1.com", Description: "desc"}} + terms1 := entities.ProposalTerms{ProposalTerms: &vega.ProposalTerms{Change: &vega.ProposalTerms_NewMarket{NewMarket: &vega.NewMarket{}}}} + id1 := GenerateID() + + reference1 := GenerateID() + prop1 := addTestProposal(t, ctx, propStore, id1, party1, reference1, block1, entities.ProposalState(s), rationale1, terms1, entities.ProposalErrorUnspecified, nil, entities.BatchProposalTerms{}) + + prop1ID := prop1.ID.String() + + expected := prop1 + actual, err := propStore.GetByID(ctx, prop1ID) + require.NoError(t, err) + assertProposalMatch(t, expected, actual) + }) + } +} diff --git a/datanode/sqlstore/protocol_upgrade_proposal_test.go b/datanode/sqlstore/protocol_upgrade_proposal_test.go index f9e61fd79d..93c5e5492b 100644 --- a/datanode/sqlstore/protocol_upgrade_proposal_test.go +++ b/datanode/sqlstore/protocol_upgrade_proposal_test.go @@ -130,3 +130,34 @@ func TestProtocolUpgradeProposal(t *testing.T) { _, _ = pup1a, pup2a } + +func TestProtocolUpdateProposalStatusEnum(t *testing.T) { + var protocolUpgradeProposalStatus eventspb.ProtocolUpgradeProposalStatus + states := getEnums(t, protocolUpgradeProposalStatus) + assert.Len(t, states, 4) + for s, state := range states { + t.Run(state, func(t *testing.T) { + ctx := tempTransaction(t) + height := uint64(1) + tag := "1.1" + approvers := []string{"phil"} + blockStore := sqlstore.NewBlocks(connectionSource) + block := addTestBlock(t, ctx, blockStore) + store := sqlstore.NewProtocolUpgradeProposals(connectionSource) + + pup := entities.ProtocolUpgradeProposal{ + UpgradeBlockHeight: height, + VegaReleaseTag: tag, + Approvers: approvers, + Status: entities.ProtocolUpgradeProposalStatus(s), + VegaTime: block.VegaTime, + TxHash: generateTxHash(), + } + require.NoError(t, store.Add(ctx, pup)) + got, err := store.GetByTxHash(ctx, pup.TxHash) + require.NoError(t, err) + assert.Len(t, got, 1) + assert.Equal(t, pup.Status, got[0].Status) + }) + } +} diff --git a/datanode/sqlstore/sqlstore_test.go b/datanode/sqlstore/sqlstore_test.go index 35c0080108..0abb970db5 100644 --- a/datanode/sqlstore/sqlstore_test.go +++ b/datanode/sqlstore/sqlstore_test.go @@ -27,6 +27,7 @@ import ( "strconv" "testing" + "code.vegaprotocol.io/vega/datanode/entities" "code.vegaprotocol.io/vega/datanode/sqlstore" "code.vegaprotocol.io/vega/datanode/utils/databasetest" @@ -80,3 +81,8 @@ func tempTransaction(t *testing.T) context.Context { return ctx } + +func getEnums[T entities.ProtoEnum](t *testing.T, enumsT T) map[int32]string { + t.Helper() + return enumsT.GetEnums() +} diff --git a/datanode/sqlstore/stake_linking_test.go b/datanode/sqlstore/stake_linking_test.go index 3ebd4b5354..c348e4fea6 100644 --- a/datanode/sqlstore/stake_linking_test.go +++ b/datanode/sqlstore/stake_linking_test.go @@ -26,6 +26,7 @@ import ( "code.vegaprotocol.io/vega/libs/num" eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" + "github.com/georgysavva/scany/pgxscan" "github.com/shopspring/decimal" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -450,3 +451,62 @@ func setupStakeLinkingPaginationTest(t *testing.T, ctx context.Context) (*sqlsto } return ls, linkings } + +func TestStakeLinkingEnums(t *testing.T) { + t.Run("should be able to store and retrieve all stake linking statuses", testStakeLinkingStatusEnum) + t.Run("should be able to store and retrieve all stake linking types", testStakeLinkingTypeEnum) +} + +func testStakeLinkingStatusEnum(t *testing.T) { + var stakeLinkingStatus eventspb.StakeLinking_Status + states := getEnums(t, stakeLinkingStatus) + assert.Len(t, states, 4) + for s, state := range states { + t.Run(state, func(t *testing.T) { + ctx := tempTransaction(t) + + bs, sl := setupStakeLinkingTest(t) + + block := addTestBlock(t, ctx, bs) + stakingProtos := getStakingProtos() + + proto := stakingProtos[0] + proto.Status = eventspb.StakeLinking_Status(s) + data, err := entities.StakeLinkingFromProto(proto, generateTxHash(), block.VegaTime) + require.NoError(t, err) + assert.NoError(t, sl.Upsert(ctx, data)) + + _, got, _, err := sl.GetStake(ctx, data.PartyID, entities.CursorPagination{}) + require.NoError(t, err) + assert.Len(t, got, 1) + assert.Equal(t, data.StakeLinkingStatus, got[0].StakeLinkingStatus) + }) + } +} + +func testStakeLinkingTypeEnum(t *testing.T) { + var stakeLinkingType eventspb.StakeLinking_Type + types := getEnums(t, stakeLinkingType) + assert.Len(t, types, 3) + for ty, typ := range types { + t.Run(typ, func(t *testing.T) { + ctx := tempTransaction(t) + + bs, sl := setupStakeLinkingTest(t) + + block := addTestBlock(t, ctx, bs) + stakingProtos := getStakingProtos() + + proto := stakingProtos[0] + proto.Type = eventspb.StakeLinking_Type(ty) + data, err := entities.StakeLinkingFromProto(proto, generateTxHash(), block.VegaTime) + require.NoError(t, err) + assert.NoError(t, sl.Upsert(ctx, data)) + + var got entities.StakeLinking + + require.NoError(t, pgxscan.Get(ctx, connectionSource.Connection, &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_test.go b/datanode/sqlstore/stop_orders_test.go index 0cc10c9f8a..d38a79f403 100644 --- a/datanode/sqlstore/stop_orders_test.go +++ b/datanode/sqlstore/stop_orders_test.go @@ -25,6 +25,7 @@ import ( "code.vegaprotocol.io/vega/datanode/sqlstore" "code.vegaprotocol.io/vega/datanode/sqlstore/helpers" "code.vegaprotocol.io/vega/libs/ptr" + vegapb "code.vegaprotocol.io/vega/protos/vega" commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" "github.com/georgysavva/scany/pgxscan" @@ -997,3 +998,222 @@ func TestStopOrders_ListStopOrders(t *testing.T) { }) }) } + +func TestStopOrderEnums(t *testing.T) { + t.Run("Should write and retrieve all values of expiry strategy", testStopOrderExpiryStrategyEnum) + t.Run("Should write and retrieve all values of rejection reason", testStopOrderExpiryRejectionReason) + t.Run("Should write and retrieve all values of status", testStopOrderExpiryStatus) + t.Run("Should write and retrieve all values of trigger direction", testStopOrderTriggerDirection) +} + +func testStopOrderTriggerDirection(t *testing.T) { + var stopOrderTriggerDirection vegapb.StopOrder_TriggerDirection + directions := getEnums(t, stopOrderTriggerDirection) + assert.Len(t, directions, 3) + for d, direction := range directions { + t.Run(direction, func(t *testing.T) { + ctx := tempTransaction(t) + so := sqlstore.NewStopOrders(connectionSource) + bs := sqlstore.NewBlocks(connectionSource) + ps := sqlstore.NewParties(connectionSource) + ms := sqlstore.NewMarkets(connectionSource) + + block := addTestBlock(t, ctx, bs) + party := addTestParty(t, ctx, ps, block) + markets := helpers.GenerateMarkets(t, ctx, 1, block, ms) + + o := entities.StopOrder{ + ID: entities.StopOrderID(GenerateID()), + ExpiryStrategy: entities.StopOrderExpiryStrategySubmit, + TriggerDirection: entities.StopOrderTriggerDirection(d), + Status: entities.StopOrderStatusPending, + CreatedAt: block.VegaTime, + UpdatedAt: nil, + OrderID: "", + TriggerPrice: ptr.From("100"), + PartyID: party.ID, + MarketID: markets[0].ID, + VegaTime: block.VegaTime, + SeqNum: 1, + TxHash: generateTxHash(), + Submission: &commandspb.OrderSubmission{ + MarketId: markets[0].ID.String(), + Price: "100", + Size: uint64(100), + Side: entities.SideBuy, + TimeInForce: entities.OrderTimeInForceUnspecified, + ExpiresAt: 0, + Type: entities.OrderTypeMarket, + Reference: GenerateID(), + }, + RejectionReason: entities.StopOrderRejectionReasonUnspecified, + } + + require.NoError(t, so.Add(o)) + _, err := so.Flush(ctx) + require.NoError(t, err) + got, err := so.GetStopOrder(ctx, o.ID.String()) + require.NoError(t, err) + assert.Equal(t, o.TriggerDirection, got.TriggerDirection) + }) + } +} + +func testStopOrderExpiryStatus(t *testing.T) { + var stopOrderStatus vegapb.StopOrder_Status + states := getEnums(t, stopOrderStatus) + assert.Len(t, states, 7) + for e, state := range states { + t.Run(state, func(t *testing.T) { + ctx := tempTransaction(t) + so := sqlstore.NewStopOrders(connectionSource) + bs := sqlstore.NewBlocks(connectionSource) + ps := sqlstore.NewParties(connectionSource) + ms := sqlstore.NewMarkets(connectionSource) + + block := addTestBlock(t, ctx, bs) + party := addTestParty(t, ctx, ps, block) + markets := helpers.GenerateMarkets(t, ctx, 1, block, ms) + + o := entities.StopOrder{ + ID: entities.StopOrderID(GenerateID()), + ExpiryStrategy: entities.StopOrderExpiryStrategySubmit, + TriggerDirection: entities.StopOrderTriggerDirectionRisesAbove, + Status: entities.StopOrderStatus(e), + CreatedAt: block.VegaTime, + UpdatedAt: nil, + OrderID: "", + TriggerPrice: ptr.From("100"), + PartyID: party.ID, + MarketID: markets[0].ID, + VegaTime: block.VegaTime, + SeqNum: 1, + TxHash: generateTxHash(), + Submission: &commandspb.OrderSubmission{ + MarketId: markets[0].ID.String(), + Price: "100", + Size: uint64(100), + Side: entities.SideBuy, + TimeInForce: entities.OrderTimeInForceUnspecified, + ExpiresAt: 0, + Type: entities.OrderTypeMarket, + Reference: GenerateID(), + }, + RejectionReason: entities.StopOrderRejectionReasonUnspecified, + } + + require.NoError(t, so.Add(o)) + _, err := so.Flush(ctx) + require.NoError(t, err) + got, err := so.GetStopOrder(ctx, o.ID.String()) + require.NoError(t, err) + assert.Equal(t, o.Status, got.Status) + }) + } +} + +func testStopOrderExpiryRejectionReason(t *testing.T) { + var stopOrderRejectionReason vegapb.StopOrder_RejectionReason + reasons := getEnums(t, stopOrderRejectionReason) + assert.Len(t, reasons, 11) + for r, reason := range reasons { + t.Run(reason, func(t *testing.T) { + ctx := tempTransaction(t) + so := sqlstore.NewStopOrders(connectionSource) + bs := sqlstore.NewBlocks(connectionSource) + ps := sqlstore.NewParties(connectionSource) + ms := sqlstore.NewMarkets(connectionSource) + + block := addTestBlock(t, ctx, bs) + party := addTestParty(t, ctx, ps, block) + markets := helpers.GenerateMarkets(t, ctx, 1, block, ms) + + o := entities.StopOrder{ + ID: entities.StopOrderID(GenerateID()), + ExpiryStrategy: entities.StopOrderExpiryStrategySubmit, + TriggerDirection: entities.StopOrderTriggerDirectionRisesAbove, + Status: entities.StopOrderStatusPending, + CreatedAt: block.VegaTime, + UpdatedAt: nil, + OrderID: "", + TriggerPrice: ptr.From("100"), + PartyID: party.ID, + MarketID: markets[0].ID, + VegaTime: block.VegaTime, + SeqNum: 1, + TxHash: generateTxHash(), + Submission: &commandspb.OrderSubmission{ + MarketId: markets[0].ID.String(), + Price: "100", + Size: uint64(100), + Side: entities.SideBuy, + TimeInForce: entities.OrderTimeInForceUnspecified, + ExpiresAt: 0, + Type: entities.OrderTypeMarket, + Reference: GenerateID(), + }, + RejectionReason: entities.StopOrderRejectionReason(r), + } + + require.NoError(t, so.Add(o)) + _, err := so.Flush(ctx) + require.NoError(t, err) + got, err := so.GetStopOrder(ctx, o.ID.String()) + require.NoError(t, err) + assert.Equal(t, o.RejectionReason, got.RejectionReason) + }) + } +} + +func testStopOrderExpiryStrategyEnum(t *testing.T) { + var stopOrderExpiryStrategy vegapb.StopOrder_ExpiryStrategy + strategies := getEnums(t, stopOrderExpiryStrategy) + assert.Len(t, strategies, 3) + for s, strategy := range strategies { + t.Run(strategy, func(t *testing.T) { + ctx := tempTransaction(t) + so := sqlstore.NewStopOrders(connectionSource) + bs := sqlstore.NewBlocks(connectionSource) + ps := sqlstore.NewParties(connectionSource) + ms := sqlstore.NewMarkets(connectionSource) + + block := addTestBlock(t, ctx, bs) + party := addTestParty(t, ctx, ps, block) + markets := helpers.GenerateMarkets(t, ctx, 1, block, ms) + + o := entities.StopOrder{ + ID: entities.StopOrderID(GenerateID()), + ExpiryStrategy: entities.StopOrderExpiryStrategy(s), + TriggerDirection: entities.StopOrderTriggerDirectionRisesAbove, + Status: entities.StopOrderStatusPending, + CreatedAt: block.VegaTime, + UpdatedAt: nil, + OrderID: "", + TriggerPrice: ptr.From("100"), + PartyID: party.ID, + MarketID: markets[0].ID, + VegaTime: block.VegaTime, + SeqNum: 1, + TxHash: generateTxHash(), + Submission: &commandspb.OrderSubmission{ + MarketId: markets[0].ID.String(), + Price: "100", + Size: uint64(100), + Side: entities.SideBuy, + TimeInForce: entities.OrderTimeInForceUnspecified, + ExpiresAt: 0, + Type: entities.OrderTypeMarket, + Reference: GenerateID(), + }, + RejectionReason: entities.StopOrderRejectionReasonUnspecified, + } + + require.NoError(t, so.Add(o)) + _, err := so.Flush(ctx) + require.NoError(t, err) + got, err := so.GetStopOrder(ctx, o.ID.String()) + require.NoError(t, err) + assert.Equal(t, o.ExpiryStrategy, got.ExpiryStrategy) + }) + } +} diff --git a/datanode/sqlstore/teams_test.go b/datanode/sqlstore/teams_test.go index 3c8d21deae..16ff852289 100644 --- a/datanode/sqlstore/teams_test.go +++ b/datanode/sqlstore/teams_test.go @@ -29,6 +29,7 @@ import ( vgcrypto "code.vegaprotocol.io/vega/libs/crypto" "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/libs/ptr" + vegapb "code.vegaprotocol.io/vega/protos/vega" eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" "github.com/georgysavva/scany/pgxscan" @@ -784,6 +785,8 @@ func testShouldReturnPageOfRefereeHistoryGivenPagination(t *testing.T) { func TestListTeamStatistics(t *testing.T) { ctx := tempTransaction(t) + accountsStore := sqlstore.NewAccounts(connectionSource) + transfersStore := sqlstore.NewTransfers(connectionSource) teamsStore := sqlstore.NewTeams(connectionSource) blocksStore := sqlstore.NewBlocks(connectionSource) rewardsStore := sqlstore.NewRewards(ctx, connectionSource) @@ -820,6 +823,41 @@ func TestListTeamStatistics(t *testing.T) { startTime := time.Now() + for _, gameID := range gameIDs { + fromAccount := &entities.Account{ + PartyID: entities.PartyID(GenerateID()), + AssetID: entities.AssetID(GenerateID()), + MarketID: entities.MarketID(GenerateID()), + Type: vegapb.AccountType_ACCOUNT_TYPE_GENERAL, + TxHash: generateTxHash(), + VegaTime: startTime, + } + require.NoError(t, accountsStore.Add(ctx, fromAccount)) + + toAccount := &entities.Account{ + PartyID: entities.PartyID(GenerateID()), + AssetID: entities.AssetID(GenerateID()), + MarketID: entities.MarketID(GenerateID()), + Type: vegapb.AccountType_ACCOUNT_TYPE_GENERAL, + TxHash: generateTxHash(), + VegaTime: startTime, + } + require.NoError(t, accountsStore.Add(ctx, toAccount)) + + require.NoError(t, transfersStore.Upsert(ctx, &entities.Transfer{ + ID: entities.TransferID(GenerateID()), + TxHash: generateTxHash(), + VegaTime: startTime, + FromAccountID: sqlstore.DeterministicIDFromAccount(fromAccount), + ToAccountID: sqlstore.DeterministicIDFromAccount(toAccount), + TransferType: 2, + DispatchStrategy: &vegapb.DispatchStrategy{ + EntityScope: 2, + }, + GameID: gameID, + })) + } + for team, members := range teams { require.NoError(t, teamsStore.AddTeam(ctx, &entities.Team{ ID: team, diff --git a/datanode/sqlstore/transfers_helpers_for_test.go b/datanode/sqlstore/transfers_helpers_for_test.go index e1e7c43792..86f1e1f871 100644 --- a/datanode/sqlstore/transfers_helpers_for_test.go +++ b/datanode/sqlstore/transfers_helpers_for_test.go @@ -164,3 +164,9 @@ func TransferWithGameID(gameID *string) TransferOption { transfer.GameId = gameID } } + +func TransferWithType(typ entities.TransferType) TransferOption { + return func(t *testing.T, transfer *eventspb.Transfer) { + t.Helper() + } +} diff --git a/datanode/sqlstore/transfers_test.go b/datanode/sqlstore/transfers_test.go index a76afb0e88..a3bb129d16 100644 --- a/datanode/sqlstore/transfers_test.go +++ b/datanode/sqlstore/transfers_test.go @@ -957,3 +957,51 @@ func TestGetAllRewardTransfers(t *testing.T) { } }) } + +func TestTransferTypeEnums(t *testing.T) { + t.Run("Should be able to save and retrieve transfers with all states", testTransferStateEnum) +} + +func testTransferStateEnum(t *testing.T) { + var transferStatus eventspb.Transfer_Status + states := getEnums(t, transferStatus) + assert.Len(t, states, 6) + for s, state := range states { + t.Run(state, func(t *testing.T) { + ctx := tempTransaction(t) + + blocksStore := sqlstore.NewBlocks(connectionSource) + assetsStore := sqlstore.NewAssets(connectionSource) + accountsStore := sqlstore.NewAccounts(connectionSource) + transfersStore := sqlstore.NewTransfers(connectionSource) + + block := addTestBlockForTime(t, ctx, blocksStore, time.Now()) + + asset := CreateAsset(t, ctx, assetsStore, block) + + account1 := CreateAccount(t, ctx, accountsStore, block, + AccountForAsset(asset), + ) + account2 := CreateAccount(t, ctx, accountsStore, block, + AccountWithType(vegapb.AccountType_ACCOUNT_TYPE_GLOBAL_REWARD), + AccountForAsset(asset), + ) + + transfer := NewTransfer(t, ctx, accountsStore, block, + TransferWithAsset(asset), + TransferFromToAccounts(account1, account2), + TransferAsRecurring(&eventspb.RecurringTransfer{ + StartEpoch: 10, + EndEpoch: nil, + Factor: "0.1", + }), + TransferWithStatus(entities.TransferStatus(s)), + ) + + require.NoError(t, transfersStore.Upsert(ctx, transfer)) + retrieved, err := transfersStore.GetByID(ctx, transfer.ID.String()) + require.NoError(t, err) + assert.Equal(t, transfer.Status, retrieved.Status) + }) + } +} diff --git a/datanode/sqlstore/votes_test.go b/datanode/sqlstore/votes_test.go index 2a71b44b0c..6c52443692 100644 --- a/datanode/sqlstore/votes_test.go +++ b/datanode/sqlstore/votes_test.go @@ -405,3 +405,41 @@ func testVotesCursorPaginationLastWithBeforeNewestFirst(t *testing.T) { EndCursor: votes[6].Cursor().Encode(), }, pageInfo) } + +func TestVoteValueEnum(t *testing.T) { + var voteValue vega.Vote_Value + values := getEnums(t, voteValue) + assert.Len(t, values, 3) + for v, value := range values { + t.Run(value, func(t *testing.T) { + ctx := tempTransaction(t) + + partyStore := sqlstore.NewParties(connectionSource) + propStore := sqlstore.NewProposals(connectionSource) + voteStore := sqlstore.NewVotes(connectionSource) + blockStore := sqlstore.NewBlocks(connectionSource) + block := addTestBlock(t, ctx, blockStore) + + party := addTestParty(t, ctx, partyStore, block) + proposal := addTestProposal(t, ctx, propStore, GenerateID(), party, GenerateID(), block, entities.ProposalStateEnacted, entities.ProposalRationale{ProposalRationale: &vega.ProposalRationale{Title: "myurl1.com", Description: "desc"}}, entities.ProposalTerms{ProposalTerms: &vega.ProposalTerms{Change: &vega.ProposalTerms_NewMarket{}}}, entities.ProposalErrorUnspecified, nil, entities.BatchProposalTerms{}) + + txHash := txHashFromString("tx_vote_1") + want := entities.Vote{ + PartyID: party.ID, + ProposalID: proposal.ID, + Value: entities.VoteValue(v), + TotalGovernanceTokenBalance: decimal.NewFromInt(100), + TotalGovernanceTokenWeight: decimal.NewFromFloat(0.1), + TotalEquityLikeShareWeight: decimal.NewFromFloat(0.3), + VegaTime: block.VegaTime, + InitialTime: block.VegaTime, + TxHash: txHash, + } + require.NoError(t, voteStore.Add(ctx, want)) + got, err := voteStore.GetByTxHash(ctx, txHash) + require.NoError(t, err) + assert.Len(t, got, 1) + assert.Equal(t, want.Value, got[0].Value) + }) + } +} diff --git a/datanode/sqlstore/withdrawals_test.go b/datanode/sqlstore/withdrawals_test.go index 1f23a2ff87..4ce7643a17 100644 --- a/datanode/sqlstore/withdrawals_test.go +++ b/datanode/sqlstore/withdrawals_test.go @@ -996,3 +996,28 @@ func testWithdrawalsPaginationBetweenDatesLastBeforeNewestFirst(t *testing.T) { }.String()).Encode(), }, pageInfo) } + +func TestWithdrawalStatusEnum(t *testing.T) { + var withdrawalStatus vega.Withdrawal_Status + states := getEnums(t, withdrawalStatus) + assert.Len(t, states, 4) + for s, state := range states { + t.Run(state, func(t *testing.T) { + ctx := tempTransaction(t) + + bs, ws, _ := setupWithdrawalStoreTests(t) + + block := addTestBlock(t, ctx, bs) + withdrawalProto := getTestWithdrawal(testID, testID, testID, testAmount, testID, block.VegaTime) + withdrawalProto.Status = vega.Withdrawal_Status(s) + + withdrawal, err := entities.WithdrawalFromProto(withdrawalProto, generateTxHash(), block.VegaTime) + require.NoError(t, err, "Converting withdrawal proto to database entity") + require.NoError(t, ws.Upsert(ctx, withdrawal)) + got, err := ws.GetByTxHash(ctx, withdrawal.TxHash) + require.NoError(t, err) + assert.Len(t, got, 1) + assert.Equal(t, withdrawal.Status, got[0].Status) + }) + } +} diff --git a/datanode/sqlsubscribers/asset.go b/datanode/sqlsubscribers/asset.go index 5cf9bcb115..d4aabdb7aa 100644 --- a/datanode/sqlsubscribers/asset.go +++ b/datanode/sqlsubscribers/asset.go @@ -72,7 +72,7 @@ func (a *Asset) addAsset(ctx context.Context, va vega.Asset, txHash string, vega return errors.Errorf("bad quantum '%v'", va.Details.Quantum) } - var source, erc20Contract string + var source, erc20Contract, chainID string lifetimeLimit := decimal.Zero withdrawalThreshold := decimal.Zero switch src := va.Details.Source.(type) { @@ -94,6 +94,7 @@ func (a *Asset) addAsset(ctx context.Context, va vega.Asset, txHash string, vega } withdrawalThreshold = res } + chainID = src.Erc20.ChainId default: return errors.Errorf("unknown asset source: %v", source) } @@ -106,6 +107,7 @@ func (a *Asset) addAsset(ctx context.Context, va vega.Asset, txHash string, vega asset := entities.Asset{ ID: entities.AssetID(va.Id), + ChainID: chainID, Name: va.Details.Name, Symbol: va.Details.Symbol, Decimals: decimals, diff --git a/datanode/sqlsubscribers/mocks/mocks.go b/datanode/sqlsubscribers/mocks/mocks.go index 9b5bce1221..c4d1da44df 100644 --- a/datanode/sqlsubscribers/mocks/mocks.go +++ b/datanode/sqlsubscribers/mocks/mocks.go @@ -805,3 +805,17 @@ func (mr *MockMarketSvcMockRecorder) GetMarketScalingFactor(arg0, arg1 interface mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMarketScalingFactor", reflect.TypeOf((*MockMarketSvc)(nil).GetMarketScalingFactor), arg0, arg1) } + +// IsSpotMarket mocks base method. +func (m *MockMarketSvc) IsSpotMarket(arg0 context.Context, arg1 string) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsSpotMarket", arg0, arg1) + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsSpotMarket indicates an expected call of IsSpotMarket. +func (mr *MockMarketSvcMockRecorder) IsSpotMarket(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSpotMarket", reflect.TypeOf((*MockMarketSvc)(nil).IsSpotMarket), arg0, arg1) +} diff --git a/datanode/sqlsubscribers/order.go b/datanode/sqlsubscribers/order.go index abad0f8314..10a4b4281b 100644 --- a/datanode/sqlsubscribers/order.go +++ b/datanode/sqlsubscribers/order.go @@ -43,6 +43,11 @@ type ExpiredOrdersEvent interface { OrderIDs() []string } +type CancelledOrdersEvent interface { + ExpiredOrdersEvent + PartyID() string +} + type OrderStore interface { Add(entities.Order) error Flush(ctx context.Context) error @@ -67,6 +72,7 @@ func (os *Order) Types() []events.Type { events.OrderEvent, events.ExpiredOrdersEvent, events.EndBlockEvent, + events.CancelledOrdersEvent, } } @@ -78,6 +84,8 @@ func (os *Order) Push(ctx context.Context, evt events.Event) error { return os.expired(ctx, evt.(ExpiredOrdersEvent), evt.Sequence()) case events.EndBlockEvent: os.consumeEndBlock() + case events.CancelledOrdersEvent: + return os.cancelled(ctx, evt.(CancelledOrdersEvent), evt.Sequence()) } return nil } @@ -115,6 +123,33 @@ func (os *Order) expired(ctx context.Context, eo ExpiredOrdersEvent, seqNum uint return nil } +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 + } + txHash := entities.TxHash(co.TxHash()) + for _, o := range orders { + o.Status = entities.OrderStatusCancelled + o.SeqNum = seqNum + o.UpdatedAt = os.vegaTime + o.VegaTime = os.vegaTime + o.TxHash = txHash + + torder, err := types.OrderFromProto(o.ToProto()) + if err != nil { + panic(err) + } + os.depthService.AddOrder(torder, os.vegaTime, seqNum) + + if err := os.store.Add(o); err != nil { + return errors.Wrap(err, "adding order to database") + } + seqNum++ + } + return nil +} + func (os *Order) consume(oe OrderEvent, seqNum uint64) error { protoOrder := oe.Order() diff --git a/datanode/sqlsubscribers/position.go b/datanode/sqlsubscribers/position.go index 3aec8274b5..46b441f164 100644 --- a/datanode/sqlsubscribers/position.go +++ b/datanode/sqlsubscribers/position.go @@ -93,6 +93,7 @@ type PositionStore interface { type MarketSvc interface { GetMarketScalingFactor(ctx context.Context, marketID string) (num.Decimal, bool) + IsSpotMarket(ctx context.Context, marketID string) bool } type Position struct { @@ -202,6 +203,10 @@ func (p *Position) handleDistressedPositions(ctx context.Context, event distress func (p *Position) handleOrdersClosedEvent(ctx context.Context, event ordersClosed) error { p.mutex.Lock() defer p.mutex.Unlock() + if sm := p.mktSvc.IsSpotMarket(ctx, event.MarketID()); sm { + return nil + } + positions, err := p.store.GetByMarketAndParties(ctx, event.MarketID(), event.Parties()) if err != nil { return fmt.Errorf("failed to get positions: %w", err) @@ -219,10 +224,14 @@ func (p *Position) handleTradeEvent(ctx context.Context, event tradeEvent) error trade := event.Trade() p.mutex.Lock() defer p.mutex.Unlock() + if sm := p.mktSvc.IsSpotMarket(ctx, trade.MarketId); sm { + return nil + } sf, ok := p.mktSvc.GetMarketScalingFactor(ctx, trade.MarketId) if !ok { return fmt.Errorf("failed to get market scaling factor for market %s", trade.MarketId) } + if trade.Type == types.TradeTypeNetworkCloseOutBad { pos := p.getNetworkPosition(ctx, trade.MarketId) seller := trade.Seller == types.NetworkParty @@ -268,6 +277,9 @@ func (p *Position) handleSettleMarket(ctx context.Context, event settleMarket) e if err != nil { return errors.Wrap(err, "error getting positions") } + if sm := p.mktSvc.IsSpotMarket(ctx, event.MarketID()); sm { + return nil + } for i := range pos { pos[i].UpdateWithSettleMarket(event) err := p.updatePosition(ctx, pos[i]) diff --git a/datanode/sqlsubscribers/positions_test.go b/datanode/sqlsubscribers/positions_test.go index 052061016f..b9d939a1d0 100644 --- a/datanode/sqlsubscribers/positions_test.go +++ b/datanode/sqlsubscribers/positions_test.go @@ -23,6 +23,7 @@ import ( "testing" "code.vegaprotocol.io/vega/core/events" + "code.vegaprotocol.io/vega/core/types" "code.vegaprotocol.io/vega/datanode/entities" "code.vegaprotocol.io/vega/datanode/sqlsubscribers" "code.vegaprotocol.io/vega/datanode/sqlsubscribers/mocks" @@ -503,6 +504,50 @@ func getSubscriberAndStore(t *testing.T) (*sqlsubscribers.Position, sqlsubscribe return p, store } +func TestPositionsForSpots(t *testing.T) { + t.Helper() + ctrl := gomock.NewController(t) + + store := mocks.NewMockPositionStore(ctrl) + mkt := mocks.NewMockMarketSvc(ctrl) + mkt.EXPECT().IsSpotMarket(gomock.Any(), gomock.Any()).Times(1).Return(true) + var lastPos *entities.Position + + getByMarket := func(_ context.Context, _ string) ([]entities.Position, error) { + if lastPos == nil { + return nil, nil + } + return []entities.Position{*lastPos}, nil + } + + store.EXPECT().GetByMarket(gomock.Any(), gomock.Any()).DoAndReturn(getByMarket).AnyTimes() + p := sqlsubscribers.NewPosition(store, mkt) + // spot trade, expect no position + tradeEvent := events.NewTradeEvent(context.Background(), types.Trade{MarketID: "1", MarketPrice: num.NewUint(100), Price: num.NewUint(1000)}) + p.Push(context.Background(), tradeEvent) + pp, err := store.GetByMarket(context.Background(), "1") + assert.NoError(t, err) + assert.Zero(t, len(pp)) + + // futures trade, expect position + recordPos := func(_ context.Context, pos entities.Position) error { + lastPos = &pos + return nil + } + getByMarketAndParty := func(_ context.Context, _ string, _ string) (*entities.Position, error) { + return lastPos, nil + } + store.EXPECT().Add(gomock.Any(), gomock.Any()).DoAndReturn(recordPos).AnyTimes() + mkt.EXPECT().GetMarketScalingFactor(gomock.Any(), gomock.Any()).AnyTimes().Return(num.DecimalFromInt64(1), true) + store.EXPECT().GetByMarketAndParty(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(getByMarketAndParty).AnyTimes() + mkt.EXPECT().IsSpotMarket(gomock.Any(), gomock.Any()).Times(1).Return(false) + tradeEvent = events.NewTradeEvent(context.Background(), types.Trade{MarketID: "2", MarketPrice: num.NewUint(100), Price: num.NewUint(1000)}) + p.Push(context.Background(), tradeEvent) + pp, err = store.GetByMarket(context.Background(), "2") + assert.NoError(t, err) + assert.NotZero(t, len(pp)) +} + type tradeStub struct { size int64 price *num.Uint diff --git a/go.mod b/go.mod index da97d1abe1..12c32e9597 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/jessevdk/go-flags v1.4.0 github.com/jinzhu/copier v0.3.5 github.com/julienschmidt/httprouter v1.3.0 - github.com/mattn/go-isatty v0.0.19 + github.com/mattn/go-isatty v0.0.20 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.16.0 github.com/rs/cors v1.8.3 @@ -31,19 +31,19 @@ require ( github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a go.elastic.co/apm/module/apmhttp v1.8.0 go.nanomsg.org/mangos/v3 v3.2.1 go.uber.org/zap v1.25.0 - golang.org/x/crypto v0.18.0 + golang.org/x/crypto v0.21.0 google.golang.org/grpc v1.60.0 google.golang.org/protobuf v1.31.0 ) require ( - github.com/99designs/gqlgen v0.17.20 - github.com/BurntSushi/toml v1.2.1 + github.com/99designs/gqlgen v0.17.43 + github.com/BurntSushi/toml v1.3.2 github.com/PaesslerAG/gval v1.0.0 github.com/PaesslerAG/jsonpath v0.1.1 github.com/adrg/xdg v0.4.0 @@ -93,13 +93,13 @@ require ( github.com/soheilhy/cmux v0.1.4 github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 github.com/tyler-smith/go-bip39 v1.1.0 - github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa + github.com/urfave/cli/v2 v2.27.1 github.com/vegaprotocol/go-slip10 v0.1.0 - github.com/vektah/gqlparser/v2 v2.5.1 + github.com/vektah/gqlparser/v2 v2.5.11 github.com/wk8/go-ordered-map/v2 v2.0.0 - golang.org/x/sync v0.5.0 - golang.org/x/sys v0.16.0 - golang.org/x/term v0.16.0 + golang.org/x/sync v0.6.0 + golang.org/x/sys v0.18.0 + golang.org/x/term v0.18.0 google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 gopkg.in/natefinch/lumberjack.v2 v2.0.0 ) @@ -256,6 +256,7 @@ require ( github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/samber/lo v1.36.0 // indirect + github.com/sosodev/duration v1.2.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/status-im/keycard-go v0.2.0 // indirect @@ -322,7 +323,7 @@ require ( github.com/gogo/protobuf v1.3.2 github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/orderedcode v0.0.1 // indirect - github.com/google/uuid v1.4.0 + github.com/google/uuid v1.6.0 github.com/gorilla/mux v1.8.0 github.com/gorilla/rpc v1.2.0 github.com/hashicorp/go-immutable-radix v1.3.1 // indirect @@ -359,7 +360,7 @@ require ( github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/spf13/cast v1.6.0 // indirect github.com/spf13/viper v1.18.1 - github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/tklauser/go-sysconf v0.3.10 // indirect github.com/tklauser/numcpus v0.4.0 // indirect @@ -371,10 +372,10 @@ require ( go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.20.0 // indirect + golang.org/x/mod v0.16.0 // indirect + golang.org/x/net v0.22.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.16.0 // indirect + golang.org/x/tools v0.19.0 // indirect gonum.org/v1/gonum v0.13.0 // indirect google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index f03455d9ed..60c91eda39 100644 --- a/go.sum +++ b/go.sum @@ -46,17 +46,16 @@ dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1 dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/99designs/gqlgen v0.17.20 h1:O7WzccIhKB1dm+7g6dhQcULINftfiLSBg2l/mwbpJMw= -github.com/99designs/gqlgen v0.17.20/go.mod h1:Mja2HI23kWT1VRH09hvWshFgOzKswpO20o4ScpJIES4= +github.com/99designs/gqlgen v0.17.43 h1:I4SYg6ahjowErAQcHFVKy5EcWuwJ3+Xw9z2fLpuFCPo= +github.com/99designs/gqlgen v0.17.43/go.mod h1:lO0Zjy8MkZgBdv4T1U91x09r0e0WFOdhVUutlQs1Rsc= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= -github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= @@ -81,6 +80,8 @@ github.com/PaesslerAG/gval v1.0.0/go.mod h1:y/nm5yEyTeX6av0OfKJNp9rBNj2XrGhAf5+v github.com/PaesslerAG/jsonpath v0.1.0/go.mod h1:4BzmtoM/PI8fPO4aQGIusjGxGir2BzcV0grWtFzq1Y8= github.com/PaesslerAG/jsonpath v0.1.1 h1:c1/AToHQMVsduPAa4Vh6xp2U0evy4t8SWp8imEsylIk= github.com/PaesslerAG/jsonpath v0.1.1/go.mod h1:lVboNxFGal/VwW6d9JzIy56bUsYAP6tH/x80vjnCseY= +github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= +github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= @@ -93,7 +94,6 @@ github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= @@ -111,6 +111,8 @@ github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= +github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= @@ -234,7 +236,6 @@ github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XH github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= @@ -541,8 +542,8 @@ github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f/go.mod h1:czg5+yv1E0Z github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -895,7 +896,6 @@ github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7 github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kevinmbeaulieu/eq-go v1.0.0/go.mod h1:G3S8ajA56gKBZm4UB9AOyoOS37JO3roToPzKNM8dtdM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -999,7 +999,6 @@ github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCy github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= github.com/libp2p/zeroconf/v2 v2.2.0 h1:Cup06Jv6u81HLhIj1KasuNM/RHHrJ8T7wOTS4+Tv53Q= github.com/libp2p/zeroconf/v2 v2.2.0/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= -github.com/logrusorgru/aurora/v3 v3.0.0/go.mod h1:vsR12bk5grlLvLXAYrBsb5Oc/N+LxAlxggSjiwMnCUc= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= @@ -1015,7 +1014,6 @@ github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8 github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -1036,8 +1034,8 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= @@ -1081,7 +1079,6 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= @@ -1317,9 +1314,8 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= @@ -1363,6 +1359,8 @@ github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3 github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sosodev/duration v1.2.0 h1:pqK/FLSjsAADWY74SyWDCjOcd5l7H8GSnnOGEB9A1Us= +github.com/sosodev/duration v1.2.0/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= @@ -1396,8 +1394,9 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1408,8 +1407,9 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= @@ -1444,9 +1444,8 @@ github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljT github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.8.1/go.mod h1:Z41J9TPoffeoqP0Iza0YbAhGvymRdZAd2uPmZ5JxRdY= -github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa h1:5SqCsI/2Qya2bCzK15ozrqo2sZxkh0FHynJZOTVoV6Q= -github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI= +github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho= +github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -1461,8 +1460,8 @@ github.com/vegaprotocol/embedded-postgres v1.13.1-0.20221123183204-2e7a2feee5bb github.com/vegaprotocol/embedded-postgres v1.13.1-0.20221123183204-2e7a2feee5bb/go.mod h1:961LFMWKrqeNMTK/KSmIosLErKlH8vgwqLOX4gBIZdY= github.com/vegaprotocol/go-slip10 v0.1.0 h1:pP3XF2gSKM6OuaAURobHZlXZ9AzZ5LgeWvXFudL7Mb4= github.com/vegaprotocol/go-slip10 v0.1.0/go.mod h1:zTjs9hXxElXfZvPRWWFMtEYSe7udGFP1iUM1ktJ72HI= -github.com/vektah/gqlparser/v2 v2.5.1 h1:ZGu+bquAY23jsxDRcYpWjttRZrUz07LbiY77gUOHcr4= -github.com/vektah/gqlparser/v2 v2.5.1/go.mod h1:mPgqFBu/woKTVYWyNk8cO3kh4S/f4aRFZrvOnp3hmCs= +github.com/vektah/gqlparser/v2 v2.5.11 h1:JJxLtXIoN7+3x6MBdtIP59TP1RANnY7pXOaDnADQSf8= +github.com/vektah/gqlparser/v2 v2.5.11/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= @@ -1624,8 +1623,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1675,10 +1674,9 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1738,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.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +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/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= @@ -1766,8 +1764,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1862,14 +1860,14 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1956,10 +1954,9 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= -golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/libs/context/context.go b/libs/context/context.go index a28426e3c5..9a5033a53a 100644 --- a/libs/context/context.go +++ b/libs/context/context.go @@ -169,3 +169,37 @@ func InProgressUpgradeFrom(ctx context.Context, from string) bool { } return from == si.version && si.upgrade } + +// InProgressUpgradeFromMultiple returns whether the data in the contexts tells us that the +// node is restoring from a snapshot taken for a protocol-upgrade by one of the given versions. +// This can be useful in situations where mainnet and fairground are running different versions. +func InProgressUpgradeFromMultiple(ctx context.Context, versions ...string) bool { + v := ctx.Value(snapshotKey) + if v == nil { + return false + } + si, ok := v.(snapshotInfo) + if !ok || !si.upgrade { + return false + } + for _, from := range versions { + if from == si.version { + return true + } + } + return false +} + +// InProgressUpgrade returns whether the data in the contexts tells us that the +// node is restoring from a snapshot taken for a protocol-upgrade. +func InProgressUpgrade(ctx context.Context) bool { + v := ctx.Value(snapshotKey) + if v == nil { + return false + } + si, ok := v.(snapshotInfo) + if !ok { + return false + } + return si.upgrade +} diff --git a/protos/blockexplorer/api/v1/blockexplorer.pb.go b/protos/blockexplorer/api/v1/blockexplorer.pb.go index 5f8444abbb..b891e392e9 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, 0x35, 0x2e, 0x30, 0x1a, 0x13, 0x6c, + 0x41, 0x50, 0x49, 0x73, 0x32, 0x07, 0x76, 0x30, 0x2e, 0x37, 0x36, 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 00d2234f32..f26efb7758 100644 --- a/protos/data-node/api/v2/trading_data.pb.go +++ b/protos/data-node/api/v2/trading_data.pb.go @@ -2005,7 +2005,7 @@ type ObserveOrdersRequest struct { // Restrict orders to those placed on the given markets. MarketIds []string `protobuf:"bytes,1,rep,name=market_ids,json=marketIds,proto3" json:"market_ids,omitempty"` - // Restrict orders to those placed on the by the given parties. + // Restrict orders to those placed on the market by the given parties. PartyIds []string `protobuf:"bytes,2,rep,name=party_ids,json=partyIds,proto3" json:"party_ids,omitempty"` // Whether liquidity orders should be excluded from the stream. If not set, liquidity orders will be included. ExcludeLiquidity *bool `protobuf:"varint,3,opt,name=exclude_liquidity,json=excludeLiquidity,proto3,oneof" json:"exclude_liquidity,omitempty"` @@ -5879,7 +5879,7 @@ type IntervalToCandleId struct { // Interval for the candle. Interval string `protobuf:"bytes,1,opt,name=interval,proto3" json:"interval,omitempty"` - // Unique id of the candle. + // Unique ID of the candle. CandleId string `protobuf:"bytes,2,opt,name=candle_id,json=candleId,proto3" json:"candle_id,omitempty"` } @@ -5999,7 +5999,8 @@ type Candle struct { Close string `protobuf:"bytes,6,opt,name=close,proto3" json:"close,omitempty"` // Total trading volume during the candle interval. Volume uint64 `protobuf:"varint,7,opt,name=volume,proto3" json:"volume,omitempty"` - // Total notional value traded during the candle interval. + // Total notional value traded during the candle interval. This value is determined by multiplying price, using market decimal places, by size, using position decimal places. + // The number of decimal places needed to convert this value to a decimal is market decimal places plus position decimal places. Notional uint64 `protobuf:"varint,8,opt,name=notional,proto3" json:"notional,omitempty"` } @@ -6783,6 +6784,8 @@ type ListERC20MultiSigSignerAddedBundlesRequest struct { EpochSeq string `protobuf:"bytes,3,opt,name=epoch_seq,json=epochSeq,proto3" json:"epoch_seq,omitempty"` // Pagination controls. Pagination *Pagination `protobuf:"bytes,4,opt,name=pagination,proto3" json:"pagination,omitempty"` + // Filter signature bundles to those related to the contract on the given chain ID. + ChainId *string `protobuf:"bytes,5,opt,name=chain_id,json=chainId,proto3,oneof" json:"chain_id,omitempty"` } func (x *ListERC20MultiSigSignerAddedBundlesRequest) Reset() { @@ -6845,6 +6848,13 @@ func (x *ListERC20MultiSigSignerAddedBundlesRequest) GetPagination() *Pagination return nil } +func (x *ListERC20MultiSigSignerAddedBundlesRequest) GetChainId() string { + if x != nil && x.ChainId != nil { + return *x.ChainId + } + return "" +} + // Response from adding a signature bundle to the signer list of a multisig contract for a particular validator type ListERC20MultiSigSignerAddedBundlesResponse struct { state protoimpl.MessageState @@ -7086,6 +7096,8 @@ type ERC20MultiSigSignerAddedBundle struct { Signatures string `protobuf:"bytes,6,opt,name=signatures,proto3" json:"signatures,omitempty"` // Epoch in which the validator was added. EpochSeq string `protobuf:"bytes,3,opt,name=epoch_seq,json=epochSeq,proto3" json:"epoch_seq,omitempty"` + // ID of the EVM chain this signature bundle is valid for. + ChainId string `protobuf:"bytes,7,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (x *ERC20MultiSigSignerAddedBundle) Reset() { @@ -7162,6 +7174,13 @@ func (x *ERC20MultiSigSignerAddedBundle) GetEpochSeq() string { return "" } +func (x *ERC20MultiSigSignerAddedBundle) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + // Request for removing a signature bundle from the signer list of the multisig contract for a particular validator type ListERC20MultiSigSignerRemovedBundlesRequest struct { state protoimpl.MessageState @@ -7176,6 +7195,8 @@ type ListERC20MultiSigSignerRemovedBundlesRequest struct { EpochSeq string `protobuf:"bytes,3,opt,name=epoch_seq,json=epochSeq,proto3" json:"epoch_seq,omitempty"` // Pagination controls. Pagination *Pagination `protobuf:"bytes,4,opt,name=pagination,proto3" json:"pagination,omitempty"` + // Filter signature bundles to those related to the contract on the given chain ID. + ChainId *string `protobuf:"bytes,5,opt,name=chain_id,json=chainId,proto3,oneof" json:"chain_id,omitempty"` } func (x *ListERC20MultiSigSignerRemovedBundlesRequest) Reset() { @@ -7238,6 +7259,13 @@ func (x *ListERC20MultiSigSignerRemovedBundlesRequest) GetPagination() *Paginati return nil } +func (x *ListERC20MultiSigSignerRemovedBundlesRequest) GetChainId() string { + if x != nil && x.ChainId != nil { + return *x.ChainId + } + return "" +} + // Response when removing a signature bundle from the signer list of the multisig contract for a particular validator type ListERC20MultiSigSignerRemovedBundlesResponse struct { state protoimpl.MessageState @@ -7479,6 +7507,8 @@ type ERC20MultiSigSignerRemovedBundle struct { Signatures string `protobuf:"bytes,6,opt,name=signatures,proto3" json:"signatures,omitempty"` // Epoch in which the validator was removed. EpochSeq string `protobuf:"bytes,7,opt,name=epoch_seq,json=epochSeq,proto3" json:"epoch_seq,omitempty"` + // ID of the EVM chain this signature bundle is valid for. + ChainId string `protobuf:"bytes,8,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (x *ERC20MultiSigSignerRemovedBundle) Reset() { @@ -7555,6 +7585,13 @@ func (x *ERC20MultiSigSignerRemovedBundle) GetEpochSeq() string { return "" } +func (x *ERC20MultiSigSignerRemovedBundle) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + // Request for listing the signature bundle to an ERC-20 token in the collateral bridge type GetERC20ListAssetBundleRequest struct { state protoimpl.MessageState @@ -7744,7 +7781,7 @@ type GetERC20SetAssetLimitsBundleResponse struct { Nonce string `protobuf:"bytes,3,opt,name=nonce,proto3" json:"nonce,omitempty"` // Lifetime limit deposit for this asset. LifetimeLimit string `protobuf:"bytes,4,opt,name=lifetime_limit,json=lifetimeLimit,proto3" json:"lifetime_limit,omitempty"` - // Threshold withdraw for this asset. + // Withdrawal threshold for this asset. Threshold string `protobuf:"bytes,5,opt,name=threshold,proto3" json:"threshold,omitempty"` // Signatures bundle as hex encoded data, prefixed with `0x` // e.g: `0x + sig1 + sig2 + ... + sixN`. @@ -7881,7 +7918,7 @@ type GetERC20WithdrawalApprovalResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Address of asset on Ethereum. + // Address of asset on the bridged EVM chain. AssetSource string `protobuf:"bytes,1,opt,name=asset_source,json=assetSource,proto3" json:"asset_source,omitempty"` // Amount to be withdrawn. Amount string `protobuf:"bytes,2,opt,name=amount,proto3" json:"amount,omitempty"` @@ -7890,10 +7927,12 @@ type GetERC20WithdrawalApprovalResponse struct { // Signatures bundle as hex encoded data, prefixed with `0x` // e.g: 0x + sig1 + sig2 + ... + sixN. Signatures string `protobuf:"bytes,5,opt,name=signatures,proto3" json:"signatures,omitempty"` - // Ethereum address, prefixed with `0x`, that will receive the withdrawn assets. + // Address, prefixed with `0x`, that will receive the withdrawn assets. TargetAddress string `protobuf:"bytes,6,opt,name=target_address,json=targetAddress,proto3" json:"target_address,omitempty"` // Creation timestamps. Creation int64 `protobuf:"varint,7,opt,name=creation,proto3" json:"creation,omitempty"` + // Chain ID of the bridged EVM chain. + SourceChainId string `protobuf:"bytes,8,opt,name=source_chain_id,json=sourceChainId,proto3" json:"source_chain_id,omitempty"` } func (x *GetERC20WithdrawalApprovalResponse) Reset() { @@ -7970,6 +8009,13 @@ func (x *GetERC20WithdrawalApprovalResponse) GetCreation() int64 { return 0 } +func (x *GetERC20WithdrawalApprovalResponse) GetSourceChainId() string { + if x != nil { + return x.SourceChainId + } + return "" +} + // Request for the latest trade that occurred on Vega for a given market type GetLastTradeRequest struct { state protoimpl.MessageState @@ -16218,7 +16264,7 @@ type StakeLinkingEdge struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Stake linking represent the intent from a party to deposit. + // Stake linking representing the intent from a party to deposit. Node *v1.StakeLinking `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"` @@ -16602,7 +16648,7 @@ type ObserveLedgerMovementsResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Ledger movements data with list of ledger entries and and post-transfer balances. + // Ledger movements data with list of ledger entries and post-transfer balances. LedgerMovement *vega.LedgerMovement `protobuf:"bytes,1,opt,name=ledger_movement,json=ledgerMovement,proto3" json:"ledger_movement,omitempty"` } @@ -18846,7 +18892,7 @@ type FundingPayment struct { MarketId string `protobuf:"bytes,2,opt,name=market_id,json=marketId,proto3" json:"market_id,omitempty"` // Funding period sequence this payment was calculated from. FundingPeriodSeq uint64 `protobuf:"varint,3,opt,name=funding_period_seq,json=fundingPeriodSeq,proto3" json:"funding_period_seq,omitempty"` - // Timestamp, in Unix nanoseconds, at which this funding payment occured. + // Timestamp, in Unix nanoseconds, at which this funding payment occurred. Timestamp int64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Funding payment amount, where a positive value indicates an earned payment received and a negative value a loss. Amount string `protobuf:"bytes,5,opt,name=amount,proto3" json:"amount,omitempty"` @@ -19803,11 +19849,11 @@ type EstimatePositionRequest struct { AverageEntryPrice string `protobuf:"bytes,3,opt,name=average_entry_price,json=averageEntryPrice,proto3" json:"average_entry_price,omitempty"` // Open and/or hypothetical orders. Orders []*OrderInfo `protobuf:"bytes,4,rep,name=orders,proto3" json:"orders,omitempty"` - // Margin account balance. Needs to be provided scaled to asset decimal places. + // Margin account balance. Needs to scaled by asset decimal places. MarginAccountBalance string `protobuf:"bytes,5,opt,name=margin_account_balance,json=marginAccountBalance,proto3" json:"margin_account_balance,omitempty"` - // General account balance. Needs to be provided scaled to asset decimal places. + // General account balance. Needs to scaled by asset decimal places. GeneralAccountBalance string `protobuf:"bytes,6,opt,name=general_account_balance,json=generalAccountBalance,proto3" json:"general_account_balance,omitempty"` - // Order margin account balance. Needs to be provided scaled to asset decimal places. + // Order margin account balance. Needs to be scaled by asset decimal places. OrderMarginAccountBalance string `protobuf:"bytes,7,opt,name=order_margin_account_balance,json=orderMarginAccountBalance,proto3" json:"order_margin_account_balance,omitempty"` // Margin mode for the party, cross margin or isolated margin. MarginMode vega.MarginMode `protobuf:"varint,8,opt,name=margin_mode,json=marginMode,proto3,enum=vega.MarginMode" json:"margin_mode,omitempty"` @@ -23235,9 +23281,9 @@ type GetFeesStatsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Restrict fee statistics to those related for the given market. + // Restrict fee statistics to those related to the given market. MarketId *string `protobuf:"bytes,1,opt,name=market_id,json=marketId,proto3,oneof" json:"market_id,omitempty"` - // Restrict fee statistics to those related for the given asset. + // Restrict fee statistics to those related to the given asset. AssetId *string `protobuf:"bytes,2,opt,name=asset_id,json=assetId,proto3,oneof" json:"asset_id,omitempty"` // Epoch to get referral fee statistics for. If not set, the last complete epoch is used. EpochSeq *uint64 `protobuf:"varint,3,opt,name=epoch_seq,json=epochSeq,proto3,oneof" json:"epoch_seq,omitempty"` @@ -24323,7 +24369,7 @@ type GetTotalTransferFeeDiscountRequest struct { // ID of party eligible for the discount. PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` - // ID of asset to associated with the discount. + // ID of asset associated with the discount. AssetId string `protobuf:"bytes,5,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"` } @@ -24430,10 +24476,13 @@ type ListGamesRequest struct { // Game ID to filter for. GameId *string `protobuf:"bytes,1,opt,name=game_id,json=gameId,proto3,oneof" json:"game_id,omitempty"` - // First epoch to retrieve game data from. If not provided, defaults to the last epoch minus 30, - // or the first epoch available if not enough epochs have passed. + // Oldest epoch to retrieve game data from, inclusive. The maximum range of epochs that can be fetched at once is 30. + // If not provided, defaults to the 'to' epoch minus 29, or the first epoch available if not enough epochs have passed. + // If the 'to' epoch is not specified, it will be set to the chosen 'from' epoch + 29. EpochFrom *uint64 `protobuf:"varint,2,opt,name=epoch_from,json=epochFrom,proto3,oneof" json:"epoch_from,omitempty"` - // Last epoch to retrieve game data to (inclusive). If not provided, defaults to the last epoch. + // Most recent epoch to retrieve game data to, inclusive. If not provided, defaults to the latest epoch. The maximum range of epochs that can be fetched at once is 30. + // If no 'from' epoch is provided, or the 'from' epoch is out of range, i.e., the 'to' epoch - 'from' epoch > 29, + // the 'from' epoch will be set to the 'to' epoch - 29. EpochTo *uint64 `protobuf:"varint,3,opt,name=epoch_to,json=epochTo,proto3,oneof" json:"epoch_to,omitempty"` // Entity scope to filter games for, i.e. team games or individual games only EntityScope *vega.EntityScope `protobuf:"varint,4,opt,name=entity_scope,json=entityScope,proto3,enum=vega.EntityScope,oneof" json:"entity_scope,omitempty"` @@ -26673,7 +26722,7 @@ var file_data_node_api_v2_trading_data_proto_rawDesc = []byte{ 0x36, 0x0a, 0x14, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, - 0x65, 0x52, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x2a, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x52, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x22, 0xea, 0x01, 0x0a, 0x2a, 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, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, @@ -26685,115 +26734,124 @@ var file_data_node_api_v2_trading_data_proto_rawDesc = []byte{ 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, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7c, 0x0a, 0x2b, 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, 0x12, 0x4d, 0x0a, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 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, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x62, 0x75, - 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x22, 0x74, 0x0a, 0x1c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, - 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 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, 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, 0x22, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x7c, 0x0a, 0x2b, 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, 0x12, 0x4d, 0x0a, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 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, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, + 0x65, 0x73, 0x22, 0x74, 0x0a, 0x1c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x45, 0x64, + 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 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, 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, 0x22, 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, 0x45, 0x64, 0x67, 0x65, 0x12, + 0x43, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 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, 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, 0x45, 0x64, - 0x67, 0x65, 0x12, 0x43, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 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, 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, 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, - 0xa7, 0x01, 0x0a, 0x22, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, - 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 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, 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, 0xce, 0x01, 0x0a, 0x1e, 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, 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, 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, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 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, 0x1e, 0x0a, - 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, - 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x22, 0xbf, 0x01, 0x0a, 0x2c, 0x4c, - 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 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, 0xa7, 0x01, 0x0a, + 0x22, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x33, 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, 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, 0xe9, 0x01, 0x0a, 0x1e, 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, 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, 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, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 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, 0x1e, 0x0a, 0x0a, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x03, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x49, 0x64, 0x22, 0xec, 0x01, 0x0a, 0x2c, 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, 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, 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, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x3b, 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, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, + 0x64, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, + 0x64, 0x22, 0x80, 0x01, 0x0a, 0x2d, 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, 0x12, 0x4f, 0x0a, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 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, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x62, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x73, 0x22, 0x78, 0x0a, 0x1e, 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, 0x45, 0x64, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 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, + 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, 0x85, + 0x01, 0x0a, 0x24, 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, 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, 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, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, - 0x3b, 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, - 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x80, 0x01, 0x0a, - 0x2d, 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, 0x12, 0x4f, - 0x0a, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x35, 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, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x22, - 0x78, 0x0a, 0x1e, 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, 0x45, 0x64, 0x67, - 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x64, 0x6c, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x45, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 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, 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, 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, 0xab, 0x01, 0x0a, 0x24, 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, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x4b, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, + 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, 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, 0x85, 0x01, 0x0a, 0x24, 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, 0x45, 0x64, - 0x67, 0x65, 0x12, 0x45, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 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, 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, 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, 0xab, 0x01, 0x0a, 0x24, 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, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x05, 0x65, 0x64, - 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 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, 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, - 0xd0, 0x01, 0x0a, 0x20, 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, 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, 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, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 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, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 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, 0x22, 0x41, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4c, 0x69, + 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, + 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, 0xeb, 0x01, 0x0a, 0x20, 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, 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, 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, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 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, 0x1e, 0x0a, 0x0a, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 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, 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, 0x41, 0x0a, 0x1e, 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, 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, @@ -26832,7 +26890,7 @@ var file_data_node_api_v2_trading_data_proto_rawDesc = []byte{ 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0d, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x0c, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x49, 0x64, 0x22, - 0xde, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, + 0x86, 0x02, 0x0a, 0x22, 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, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x73, @@ -26845,3647 +26903,3649 @@ var file_data_node_api_v2_trading_data_proto_rawDesc = []byte{ 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x08, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, - 0x22, 0x38, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 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, 0x22, 0x39, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x21, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x05, - 0x74, 0x72, 0x61, 0x64, 0x65, 0x22, 0x8c, 0x02, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, - 0x61, 0x64, 0x65, 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, 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, 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, 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, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, - 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 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, 0x4e, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x74, 0x72, - 0x61, 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, 0x54, 0x72, 0x61, - 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x74, 0x72, - 0x61, 0x64, 0x65, 0x73, 0x22, 0x7b, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x64, 0x65, 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, 0x54, 0x72, 0x61, 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, 0x44, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x64, 0x65, 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, 0x54, 0x72, 0x61, 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, 0x52, 0x0a, 0x14, 0x4f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 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, 0x22, 0x3c, 0x0a, 0x15, 0x4f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 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, 0x42, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2a, 0x0a, 0x0e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, - 0x0c, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x49, 0x64, 0x22, 0x4a, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x0b, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x6f, - 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x22, 0x69, 0x0a, 0x16, 0x4c, 0x69, 0x73, - 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 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, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x64, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, - 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x49, 0x0a, 0x0c, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 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, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, - 0x65, 0x63, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x6f, - 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x15, 0x4c, - 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x73, - 0x70, 0x65, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, - 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 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, 0x11, 0x0a, 0x0f, 0x5f, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, - 0x63, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x60, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, - 0x0b, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 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, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x72, 0x61, 0x63, 0x6c, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0x4e, 0x0a, 0x0e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, - 0x70, 0x65, 0x63, 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, 0x4f, 0x72, 0x61, - 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 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, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, - 0x53, 0x70, 0x65, 0x63, 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, + 0x52, 0x08, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x49, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x38, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4c, + 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 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, 0x22, 0x39, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, + 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x05, 0x74, 0x72, + 0x61, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x05, 0x74, 0x72, 0x61, 0x64, 0x65, 0x22, 0x8c, 0x02, + 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 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, 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, 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, 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, 0x12, 0x3e, + 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 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, 0x4e, 0x0a, 0x12, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x74, 0x72, 0x61, 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, 0x54, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, 0x22, 0x7b, 0x0a, 0x0f, + 0x54, 0x72, 0x61, 0x64, 0x65, 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, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 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, 0x4e, - 0x0a, 0x0e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 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, 0x4f, 0x72, 0x61, 0x63, 0x6c, 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, 0x85, - 0x01, 0x0a, 0x14, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6e, + 0x2e, 0x54, 0x72, 0x61, 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, 0x44, 0x0a, 0x09, 0x54, 0x72, 0x61, + 0x64, 0x65, 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, 0x54, 0x72, 0x61, 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, + 0x52, 0x0a, 0x14, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 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, 0x22, 0x3c, 0x0a, 0x15, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, + 0x61, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x42, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, + 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x0c, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, + 0x70, 0x65, 0x63, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, + 0x0a, 0x0b, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, + 0x63, 0x22, 0x69, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, + 0x70, 0x65, 0x63, 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, 0x42, 0x0d, 0x0a, + 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x64, 0x0a, 0x17, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 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, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, + 0x63, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, + 0x65, 0x63, 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, 0x11, 0x0a, 0x0f, 0x5f, 0x6f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, + 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x60, 0x0a, 0x16, 0x4c, + 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, + 0x64, 0x61, 0x74, 0x61, 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, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0x4e, 0x0a, + 0x0e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 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, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 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, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 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, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x12, 0x36, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, + 0x70, 0x65, 0x63, 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, 0x35, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 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, 0x39, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 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, 0x22, 0xa7, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 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, 0x2c, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x74, - 0x74, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x0e, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x42, - 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x12, - 0x0a, 0x10, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x6c, - 0x65, 0x64, 0x22, 0x52, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x6d, 0x61, 0x72, - 0x6b, 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, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x22, 0x46, 0x0a, 0x0a, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 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, 0x4d, 0x61, 0x72, 0x6b, 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, 0x7d, - 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 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, 0x4d, 0x61, 0x72, 0x6b, 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, 0xaf, 0x01, - 0x0a, 0x1b, 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, 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, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x66, 0x75, 0x6c, 0x6c, - 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x46, 0x75, 0x6c, 0x6c, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x3b, 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, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x6b, 0x0a, 0x0f, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 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, 0x32, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 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, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x22, 0x63, 0x0a, 0x13, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 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, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, - 0x6b, 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, 0x8f, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 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, + 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x4e, 0x0a, 0x0e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x44, 0x61, 0x74, 0x61, 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, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 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, 0x85, 0x01, 0x0a, 0x14, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x44, 0x61, 0x74, 0x61, 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, 0x4f, 0x72, 0x61, 0x63, 0x6c, 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, 0x35, + 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 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, 0x39, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, + 0x22, 0xa7, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 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, 0x2c, 0x0a, 0x0f, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x01, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x22, 0x52, 0x0a, 0x13, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x6d, 0x61, 0x72, 0x6b, 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, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x22, 0x46, + 0x0a, 0x0a, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 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, 0x4d, 0x61, 0x72, 0x6b, 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, 0x7d, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 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, 0x4d, 0x61, 0x72, 0x6b, + 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, 0xaf, 0x01, 0x0a, 0x1b, 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, 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, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x46, + 0x75, 0x6c, 0x6c, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x3b, 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, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6b, 0x0a, 0x0f, 0x53, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x6f, 0x72, 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, 0x32, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, + 0x03, 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, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x61, 0x6c, 0x73, 0x22, 0x63, 0x0a, 0x13, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, + 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 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, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 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, 0x8f, 0x01, 0x0a, 0x19, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 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, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 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, 0x77, 0x0a, 0x1c, 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, 0x12, 0x57, 0x0a, 0x11, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 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, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x73, 0x22, 0x32, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 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, 0x22, 0x35, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x05, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x22, + 0x6c, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 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, 0x3b, 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, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, + 0x13, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 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, 0x50, 0x61, 0x72, 0x74, 0x79, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x44, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x79, 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, 0x50, 0x61, 0x72, 0x74, 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, 0x7b, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x79, 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, 0x50, 0x61, 0x72, 0x74, 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, 0x77, 0x0a, 0x1c, 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, 0x12, 0x57, 0x0a, 0x11, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, - 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 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, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x22, 0x32, 0x0a, 0x0f, - 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 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, - 0x22, 0x35, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, - 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x22, 0x6c, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x65, 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, 0x3b, 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, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x6e, 0x66, 0x6f, 0x22, 0x73, 0x0a, 0x1a, 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, 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, 0x3b, 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, 0x52, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x65, 0x0a, 0x1b, 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, 0x12, 0x46, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 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, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, + 0x52, 0x0a, 0x10, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x45, + 0x64, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 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, 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, 0x19, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 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, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 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, 0x72, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x44, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, - 0x79, 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, 0x50, 0x61, 0x72, 0x74, 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, 0x7b, - 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x22, 0x44, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 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, 0x4f, 0x72, 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, 0x8e, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 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, + 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, 0x3b, 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, 0x52, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x62, 0x0a, 0x18, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 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, 0x4d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x22, 0x67, 0x0a, + 0x1a, 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, 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, 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, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x56, 0x0a, 0x1b, 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, 0x12, 0x37, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 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, 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x22, 0x7b, + 0x0a, 0x0f, 0x4f, 0x72, 0x64, 0x65, 0x72, 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, 0x50, 0x61, 0x72, 0x74, 0x79, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, + 0x76, 0x32, 0x2e, 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, 0x73, 0x0a, 0x1a, 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, 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, 0x3b, 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, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x65, 0x0a, 0x1b, 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, 0x12, - 0x46, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 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, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x70, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x52, 0x0a, 0x10, 0x50, 0x61, 0x72, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x6e, - 0x6f, 0x64, 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, 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, 0x19, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 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, 0x50, 0x61, 0x72, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 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, 0x44, 0x0a, 0x09, 0x4f, 0x72, - 0x64, 0x65, 0x72, 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, 0x4f, 0x72, 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, 0x8e, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, - 0x65, 0x76, 0x65, 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, 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, 0x3b, 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, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x4c, 0x0a, 0x0a, 0x4d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x45, 0x64, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x6e, 0x6f, 0x64, + 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, 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, 0x7d, 0x0a, 0x10, 0x4d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 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, 0x4d, + 0x61, 0x72, 0x67, 0x69, 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, 0xe1, 0x02, 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, + 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, 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, 0x12, 0x22, 0x0a, 0x0a, + 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x48, 0x02, 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, 0x05, 0x20, 0x01, + 0x28, 0x04, 0x48, 0x03, 0x52, 0x07, 0x74, 0x6f, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, + 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, + 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, + 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, 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, 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, + 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, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x62, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, - 0x0d, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 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, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x73, 0x22, 0x67, 0x0a, 0x1a, 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, 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, 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, - 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x56, - 0x0a, 0x1b, 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, 0x12, 0x37, 0x0a, - 0x0d, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 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, 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x22, 0x7b, 0x0a, 0x0f, 0x4f, 0x72, 0x64, 0x65, 0x72, 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, 0x4f, 0x72, 0x64, 0x65, 0x72, + 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, + 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, 0x4c, 0x0a, 0x0a, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x45, 0x64, 0x67, - 0x65, 0x12, 0x26, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 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, 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, 0x7d, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 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, 0x4d, 0x61, 0x72, 0x67, 0x69, 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, 0xe1, 0x02, 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, 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, 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, 0x12, 0x22, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 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, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x03, 0x52, 0x07, 0x74, 0x6f, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 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, 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, 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, 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, + 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, 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, 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, + 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, 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, 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, + 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, 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, + 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, + 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, 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, 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, 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, + 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, 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, 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, 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, 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, + 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, 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, + 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, 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, + 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, + 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, + 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, - 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, + 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, 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, + 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, 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, 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, + 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, + 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, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x66, + 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, 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, 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, + 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, 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, + 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, + 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, 0x53, 0x74, 0x61, 0x74, 0x73, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, + 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, 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, 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, + 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, 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, + 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, 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, + 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, 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, 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, + 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, - 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, + 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, 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, + 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, - 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, + 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, - 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, + 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, 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, 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, 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, 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, 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, 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, + 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, 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, + 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, + 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, 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, + 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, 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, + 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, 0x46, 0x52, 0x4f, 0x4d, 0x5f, 0x49, 0x44, 0x10, 0x01, - 0x12, 0x24, 0x0a, 0x20, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, - 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, - 0x4f, 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, - 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x03, 0x2a, 0xb0, 0x01, 0x0a, - 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, - 0x19, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, - 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x49, 0x44, - 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, - 0x45, 0x4c, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x1a, - 0x0a, 0x16, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, - 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x43, - 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, - 0x45, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x43, 0x43, 0x4f, 0x55, - 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x05, 0x2a, - 0xad, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x1e, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, - 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x10, 0x01, 0x12, - 0x22, 0x0a, 0x1e, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, - 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, - 0x4f, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, - 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, - 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x5f, 0x4f, 0x52, 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x10, 0x03, 0x2a, - 0xde, 0x02, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, - 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, - 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x43, 0x48, - 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x53, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x54, - 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, - 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x45, 0x44, 0x47, - 0x45, 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4f, 0x52, - 0x44, 0x45, 0x52, 0x53, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, - 0x54, 0x52, 0x41, 0x44, 0x45, 0x53, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, - 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x07, 0x12, - 0x17, 0x0a, 0x13, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, - 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x53, 0x10, 0x08, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x41, 0x42, 0x4c, - 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x09, 0x12, 0x1e, 0x0a, - 0x1a, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, - 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x0a, 0x12, 0x11, 0x0a, - 0x0d, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x0b, - 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, - 0x54, 0x53, 0x10, 0x0c, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x57, 0x49, - 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x53, 0x10, 0x0d, 0x12, 0x10, 0x0a, 0x0c, 0x54, - 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x53, 0x10, 0x0e, 0x12, 0x11, 0x0a, - 0x0d, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, 0x10, 0x0f, - 0x32, 0xd2, 0x77, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6a, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x12, 0x75, 0x0a, 0x0f, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x04, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x1c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, - 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x77, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x73, 0x12, 0x6d, 0x0a, 0x0d, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x30, 0x01, - 0x12, 0x68, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 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, 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, 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, + 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x4f, 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x24, + 0x0a, 0x20, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x46, + 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x10, 0x03, 0x2a, 0xb0, 0x01, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, + 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, + 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x43, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, + 0x59, 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x49, 0x44, + 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, + 0x45, 0x4c, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x04, 0x12, + 0x16, 0x0a, 0x12, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x05, 0x2a, 0xad, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, + 0x1e, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x24, 0x0a, 0x20, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, + 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, + 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x54, 0x52, 0x41, 0x4e, 0x53, + 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, + 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x54, + 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x5f, 0x4f, 0x52, + 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x10, 0x03, 0x2a, 0xde, 0x02, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x41, 0x42, 0x4c, + 0x45, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, + 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, + 0x53, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x4c, + 0x45, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, + 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, + 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x05, 0x12, 0x10, + 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x45, 0x53, 0x10, 0x06, + 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, + 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x42, 0x4c, 0x45, + 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x53, 0x10, 0x08, + 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, + 0x4f, 0x4e, 0x53, 0x10, 0x09, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4c, + 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, + 0x4f, 0x4e, 0x53, 0x10, 0x0a, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4d, + 0x41, 0x52, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x0b, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x41, 0x42, 0x4c, + 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x53, 0x10, 0x0c, 0x12, 0x15, 0x0a, 0x11, + 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, + 0x53, 0x10, 0x0d, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x4c, 0x4f, + 0x43, 0x4b, 0x53, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x52, + 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, 0x10, 0x0f, 0x32, 0xd2, 0x77, 0x0a, 0x12, 0x54, 0x72, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x6a, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, + 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, + 0x0a, 0x0a, 0x08, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x75, 0x0a, 0x0f, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 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, + 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, 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, + 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, 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, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x77, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, + 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6d, 0x0a, 0x0d, 0x4f, 0x62, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x65, 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, + 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x30, 0x01, 0x12, 0x68, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, + 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x73, 0x12, 0x6e, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x73, 0x12, 0x71, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 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, + 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, + 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, + 0x73, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x81, 0x01, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, + 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x73, 0x12, 0x80, 0x01, 0x0a, 0x13, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x73, 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, 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, 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, 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, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x6e, 0x0a, 0x0c, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, - 0x61, 0x6e, 0x63, 0x65, 0x30, 0x01, 0x12, 0xb3, 0x01, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x45, - 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x3b, + 0x2e, 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, + 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, + 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x63, 0x0a, 0x09, 0x4c, 0x69, 0x73, + 0x74, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, + 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x6e, + 0x0a, 0x0c, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, - 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x42, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, - 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, - 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0xb9, 0x01, 0x0a, - 0x25, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, - 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x42, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 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, - 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, 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, + 0x41, 0x64, 0x64, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, + 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, + 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, + 0x69, 0x64, 0x67, 0x65, 0x12, 0xb9, 0x01, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, + 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 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, + 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, 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, + 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, + 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, 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, 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, + 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, + 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, 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, + 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, 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, + 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, - 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, + 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, 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, 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, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, - 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x12, 0x7f, 0x0a, 0x13, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, - 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, - 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x30, - 0x01, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, - 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 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, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, + 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x5d, 0x0a, 0x08, 0x47, + 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, + 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, + 0x09, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, + 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x12, 0x74, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, + 0x0a, 0x06, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x7f, 0x0a, 0x13, 0x4f, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, + 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, + 0x06, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x30, 0x01, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, - 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 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, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x73, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x30, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, + 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x68, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, + 0x6b, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x71, 0x0a, 0x0f, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, + 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, + 0x5c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, - 0x74, 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, + 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, - 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, - 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x6b, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x12, 0x71, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, - 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, - 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x5c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, - 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x17, 0x4c, 0x69, - 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, - 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, - 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x88, 0x02, 0x01, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x95, 0x01, 0x0a, 0x1a, - 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x41, 0x6c, 0x6c, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, + 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x62, 0x0a, + 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 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, + 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, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x69, 0x71, 0x75, + 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, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, + 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, 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, + 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x97, 0x01, 0x0a, 0x1a, + 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 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, 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, 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, + 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, 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, + 0x74, 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x7b, 0x0a, 0x11, 0x47, 0x65, + 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, + 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x7e, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x47, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x7d, 0x0a, 0x11, 0x4f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x30, 0x01, 0x12, 0x72, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, + 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, + 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, 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, 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, + 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, + 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, 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, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, + 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x88, 0x02, 0x01, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x77, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, + 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, + 0x6d, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x84, + 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 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, 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, + 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, 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, 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, + 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, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 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, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 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, 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, + 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, 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, + 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, 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, 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, + 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, 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, - 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, 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, + 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, 0xaa, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, - 0x65, 0x65, 0x72, 0x73, 0x12, 0x37, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, - 0x70, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x6a, 0x0a, - 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, - 0x08, 0x45, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x12, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, - 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x12, - 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x46, - 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, - 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, - 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, - 0x90, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, - 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x12, 0x99, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x12, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 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, + 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, 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, + 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, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0x45, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, + 0x72, 0x12, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x96, + 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 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, 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, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x46, + 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x90, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6b, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x99, 0x01, 0x0a, 0x19, 0x47, + 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x7e, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x65, 0x61, 0x6d, 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, + 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x93, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, + 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x87, 0x01, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, + 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x5e, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, + 0x61, 0x6d, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, + 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x7c, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, + 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2b, 0x2e, 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, + 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, + 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, 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, + 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, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x09, 0x92, 0x41, 0x06, 0x0a, 0x04, 0x46, 0x65, - 0x65, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x37, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x38, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, - 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x97, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x20, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x12, 0x90, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, - 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x56, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, - 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2c, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, - 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, - 0x07, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x9e, 0x01, 0x0a, 0x19, 0x4f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x92, - 0x41, 0x15, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x30, 0x01, 0x12, 0x80, 0x01, 0x0a, 0x13, 0x45, 0x73, - 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, - 0x65, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, - 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x98, 0x01, 0x0a, - 0x1b, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x33, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, - 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x5e, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x47, - 0x61, 0x6d, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, - 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, - 0x0a, 0x05, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x80, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, - 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, - 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, - 0x41, 0x08, 0x0a, 0x06, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0xa4, 0x01, 0x0a, 0x1f, 0x47, - 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, + 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, 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, + 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, 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, 0x35, 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, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x64, + 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, + 0x97, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x92, 0x41, 0x19, + 0x0a, 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x90, 0x01, 0x0a, 0x19, 0x47, 0x65, + 0x74, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, + 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, + 0x92, 0x41, 0x09, 0x0a, 0x07, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x81, 0x01, 0x0a, + 0x14, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, + 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x12, 0x9e, 0x01, 0x0a, 0x19, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x92, 0x41, 0x15, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x30, + 0x01, 0x12, 0x80, 0x01, 0x0a, 0x13, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, + 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, + 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, + 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, + 0x5e, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x12, + 0x80, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, + 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x12, 0xa4, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x38, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, + 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 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, 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 ( @@ -36706,6 +36766,8 @@ func file_data_node_api_v2_trading_data_proto_init() { 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[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[132].OneofWrappers = []interface{}{} 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 77943d3dd5..8bf070dbd5 100644 --- a/protos/data-node/api/v2/trading_data_grpc.pb.go +++ b/protos/data-node/api/v2/trading_data_grpc.pb.go @@ -178,11 +178,11 @@ type TradingDataServiceClient interface { // // Subscribe to a stream of votes cast on a given proposal, or by all votes made by a given party ObserveVotes(ctx context.Context, in *ObserveVotesRequest, opts ...grpc.CallOption) (TradingDataService_ObserveVotesClient, error) - // List ERC20 multi-sig signer added bundles + // List ERC20 multisig signer added bundles // // Get a list of the signature bundles to add a particular validator to the signer list of the multisig contract ListERC20MultiSigSignerAddedBundles(ctx context.Context, in *ListERC20MultiSigSignerAddedBundlesRequest, opts ...grpc.CallOption) (*ListERC20MultiSigSignerAddedBundlesResponse, error) - // List ERC20 multi-sig signer removed bundles + // List ERC20 multisig signer removed bundles // // Get a list of the signature bundles to remove a particular validator from signer list of the multisig contract ListERC20MultiSigSignerRemovedBundles(ctx context.Context, in *ListERC20MultiSigSignerRemovedBundlesRequest, opts ...grpc.CallOption) (*ListERC20MultiSigSignerRemovedBundlesResponse, error) @@ -252,7 +252,7 @@ type TradingDataServiceClient interface { ListPartiesProfiles(ctx context.Context, in *ListPartiesProfilesRequest, opts ...grpc.CallOption) (*ListPartiesProfilesResponse, error) // List margin levels // - // Get a list margin levels that match the provided criteria. If no filter is provided, all margin levels will be returned. + // Get a list of margin levels that match the provided criteria. If no filter is provided, all margin levels will be returned. ListMarginLevels(ctx context.Context, in *ListMarginLevelsRequest, opts ...grpc.CallOption) (*ListMarginLevelsResponse, error) // Observe margin levels // @@ -272,7 +272,7 @@ type TradingDataServiceClient interface { // List epoch reward summaries // // Get a list of reward summaries by epoch for a given range of epochs. - // The result is filtered by list of asset IDs, market IDs and starting and ending epochs, for which to return rewards. + // The result is filtered by a list of asset IDs, market IDs and starting and ending epochs, for which to return rewards. // If no data is provided, all reward summaries will be returned, grouped by epochs, market IDs, asset IDs and reward type. ListEpochRewardSummaries(ctx context.Context, in *ListEpochRewardSummariesRequest, opts ...grpc.CallOption) (*ListEpochRewardSummariesResponse, error) // Get deposit @@ -512,11 +512,11 @@ type TradingDataServiceClient interface { ListTeamRefereeHistory(ctx context.Context, in *ListTeamRefereeHistoryRequest, opts ...grpc.CallOption) (*ListTeamRefereeHistoryResponse, error) // Get fees statistics // - // Get accumulated fees, rewards, and applied discount information. Either a market or an asset must be supplied as filter. + // Get accumulated fees, rewards, and applied discount information. Either a market or an asset must be supplied as a filter. GetFeesStats(ctx context.Context, in *GetFeesStatsRequest, opts ...grpc.CallOption) (*GetFeesStatsResponse, error) // Get fees statistics for a party // - // Get accumulated fees, rewards, and applied discount information. A party ID must be supplied as filter. + // Get accumulated fees, rewards, and applied discount information. A party ID must be supplied as a filter. GetFeesStatsForParty(ctx context.Context, in *GetFeesStatsForPartyRequest, opts ...grpc.CallOption) (*GetFeesStatsForPartyResponse, error) // Get current volume discount program // @@ -2279,11 +2279,11 @@ type TradingDataServiceServer interface { // // Subscribe to a stream of votes cast on a given proposal, or by all votes made by a given party ObserveVotes(*ObserveVotesRequest, TradingDataService_ObserveVotesServer) error - // List ERC20 multi-sig signer added bundles + // List ERC20 multisig signer added bundles // // Get a list of the signature bundles to add a particular validator to the signer list of the multisig contract ListERC20MultiSigSignerAddedBundles(context.Context, *ListERC20MultiSigSignerAddedBundlesRequest) (*ListERC20MultiSigSignerAddedBundlesResponse, error) - // List ERC20 multi-sig signer removed bundles + // List ERC20 multisig signer removed bundles // // Get a list of the signature bundles to remove a particular validator from signer list of the multisig contract ListERC20MultiSigSignerRemovedBundles(context.Context, *ListERC20MultiSigSignerRemovedBundlesRequest) (*ListERC20MultiSigSignerRemovedBundlesResponse, error) @@ -2353,7 +2353,7 @@ type TradingDataServiceServer interface { ListPartiesProfiles(context.Context, *ListPartiesProfilesRequest) (*ListPartiesProfilesResponse, error) // List margin levels // - // Get a list margin levels that match the provided criteria. If no filter is provided, all margin levels will be returned. + // Get a list of margin levels that match the provided criteria. If no filter is provided, all margin levels will be returned. ListMarginLevels(context.Context, *ListMarginLevelsRequest) (*ListMarginLevelsResponse, error) // Observe margin levels // @@ -2373,7 +2373,7 @@ type TradingDataServiceServer interface { // List epoch reward summaries // // Get a list of reward summaries by epoch for a given range of epochs. - // The result is filtered by list of asset IDs, market IDs and starting and ending epochs, for which to return rewards. + // The result is filtered by a list of asset IDs, market IDs and starting and ending epochs, for which to return rewards. // If no data is provided, all reward summaries will be returned, grouped by epochs, market IDs, asset IDs and reward type. ListEpochRewardSummaries(context.Context, *ListEpochRewardSummariesRequest) (*ListEpochRewardSummariesResponse, error) // Get deposit @@ -2613,11 +2613,11 @@ type TradingDataServiceServer interface { ListTeamRefereeHistory(context.Context, *ListTeamRefereeHistoryRequest) (*ListTeamRefereeHistoryResponse, error) // Get fees statistics // - // Get accumulated fees, rewards, and applied discount information. Either a market or an asset must be supplied as filter. + // Get accumulated fees, rewards, and applied discount information. Either a market or an asset must be supplied as a filter. GetFeesStats(context.Context, *GetFeesStatsRequest) (*GetFeesStatsResponse, error) // Get fees statistics for a party // - // Get accumulated fees, rewards, and applied discount information. A party ID must be supplied as filter. + // Get accumulated fees, rewards, and applied discount information. A party ID must be supplied as a filter. GetFeesStatsForParty(context.Context, *GetFeesStatsForPartyRequest) (*GetFeesStatsForPartyResponse, error) // Get current volume discount program // diff --git a/protos/sources/blockexplorer/api/v1/blockexplorer.proto b/protos/sources/blockexplorer/api/v1/blockexplorer.proto index 9d8eab34ab..56bf3ff92e 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.75.0"; + version: "v0.76.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 efc16d7cb4..82a5e97213 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.75.0"; + version: "v0.76.0"; } schemes: [ HTTP, @@ -279,14 +279,14 @@ service TradingDataService { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Governance"}; } - // List ERC20 multi-sig signer added bundles + // List ERC20 multisig signer added bundles // // Get a list of the signature bundles to add a particular validator to the signer list of the multisig contract rpc ListERC20MultiSigSignerAddedBundles(ListERC20MultiSigSignerAddedBundlesRequest) returns (ListERC20MultiSigSignerAddedBundlesResponse) { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "ERC20 bridge"}; } - // List ERC20 multi-sig signer removed bundles + // List ERC20 multisig signer removed bundles // // Get a list of the signature bundles to remove a particular validator from signer list of the multisig contract rpc ListERC20MultiSigSignerRemovedBundles(ListERC20MultiSigSignerRemovedBundlesRequest) returns (ListERC20MultiSigSignerRemovedBundlesResponse) { @@ -404,7 +404,7 @@ service TradingDataService { // List margin levels // - // Get a list margin levels that match the provided criteria. If no filter is provided, all margin levels will be returned. + // Get a list of margin levels that match the provided criteria. If no filter is provided, all margin levels will be returned. rpc ListMarginLevels(ListMarginLevelsRequest) returns (ListMarginLevelsResponse) { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Margin"}; } @@ -436,7 +436,7 @@ service TradingDataService { // List epoch reward summaries // // Get a list of reward summaries by epoch for a given range of epochs. - // The result is filtered by list of asset IDs, market IDs and starting and ending epochs, for which to return rewards. + // The result is filtered by a list of asset IDs, market IDs and starting and ending epochs, for which to return rewards. // If no data is provided, all reward summaries will be returned, grouped by epochs, market IDs, asset IDs and reward type. rpc ListEpochRewardSummaries(ListEpochRewardSummariesRequest) returns (ListEpochRewardSummariesResponse) { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Rewards"}; @@ -851,14 +851,14 @@ service TradingDataService { // Get fees statistics // - // Get accumulated fees, rewards, and applied discount information. Either a market or an asset must be supplied as filter. + // Get accumulated fees, rewards, and applied discount information. Either a market or an asset must be supplied as a filter. rpc GetFeesStats(GetFeesStatsRequest) returns (GetFeesStatsResponse) { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Fees"}; } // Get fees statistics for a party // - // Get accumulated fees, rewards, and applied discount information. A party ID must be supplied as filter. + // Get accumulated fees, rewards, and applied discount information. A party ID must be supplied as a filter. rpc GetFeesStatsForParty(GetFeesStatsForPartyRequest) returns (GetFeesStatsForPartyResponse) { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Fees"}; } @@ -1274,7 +1274,7 @@ message ListOrderVersionsResponse { message ObserveOrdersRequest { // Restrict orders to those placed on the given markets. repeated string market_ids = 1; - // Restrict orders to those placed on the by the given parties. + // Restrict orders to those placed on the market by the given parties. repeated string party_ids = 2; // Whether liquidity orders should be excluded from the stream. If not set, liquidity orders will be included. optional bool exclude_liquidity = 3; @@ -1889,7 +1889,7 @@ message ListCandleIntervalsRequest { message IntervalToCandleId { // Interval for the candle. string interval = 1; - // Unique id of the candle. + // Unique ID of the candle. string candle_id = 2; } @@ -1916,7 +1916,8 @@ message Candle { string close = 6; // Total trading volume during the candle interval. uint64 volume = 7; - // Total notional value traded during the candle interval. + // Total notional value traded during the candle interval. This value is determined by multiplying price, using market decimal places, by size, using position decimal places. + // The number of decimal places needed to convert this value to a decimal is market decimal places plus position decimal places. uint64 notional = 8; } @@ -2026,6 +2027,8 @@ message ListERC20MultiSigSignerAddedBundlesRequest { string epoch_seq = 3; // Pagination controls. Pagination pagination = 4; + // Filter signature bundles to those related to the contract on the given chain ID. + optional string chain_id = 5; } // Response from adding a signature bundle to the signer list of a multisig contract for a particular validator @@ -2072,6 +2075,8 @@ message ERC20MultiSigSignerAddedBundle { string signatures = 6; // Epoch in which the validator was added. string epoch_seq = 3; + // ID of the EVM chain this signature bundle is valid for. + string chain_id = 7; } // Request for removing a signature bundle from the signer list of the multisig contract for a particular validator @@ -2082,9 +2087,10 @@ message ListERC20MultiSigSignerRemovedBundlesRequest { string submitter = 2; // Epoch in which the bundle was generated, i.e. the epoch in which the node was demoted from a consensus validator. string epoch_seq = 3; - // Pagination controls. Pagination pagination = 4; + // Filter signature bundles to those related to the contract on the given chain ID. + optional string chain_id = 5; } // Response when removing a signature bundle from the signer list of the multisig contract for a particular validator @@ -2131,6 +2137,8 @@ message ERC20MultiSigSignerRemovedBundle { string signatures = 6; // Epoch in which the validator was removed. string epoch_seq = 7; + // ID of the EVM chain this signature bundle is valid for. + string chain_id = 8; } // Request for listing the signature bundle to an ERC-20 token in the collateral bridge @@ -2168,7 +2176,7 @@ message GetERC20SetAssetLimitsBundleResponse { string nonce = 3; // Lifetime limit deposit for this asset. string lifetime_limit = 4; - // Threshold withdraw for this asset. + // Withdrawal threshold for this asset. string threshold = 5; // Signatures bundle as hex encoded data, prefixed with `0x` // e.g: `0x + sig1 + sig2 + ... + sixN`. @@ -2185,7 +2193,7 @@ message GetERC20WithdrawalApprovalRequest { // function withdraw_asset(address asset_source, uint256 asset_id, uint256 amount, uint256 expiry, uint256 nonce, bytes memory signatures) message GetERC20WithdrawalApprovalResponse { reserved 3; - // Address of asset on Ethereum. + // Address of asset on the bridged EVM chain. string asset_source = 1; // Amount to be withdrawn. string amount = 2; @@ -2194,10 +2202,12 @@ message GetERC20WithdrawalApprovalResponse { // Signatures bundle as hex encoded data, prefixed with `0x` // e.g: 0x + sig1 + sig2 + ... + sixN. string signatures = 5; - // Ethereum address, prefixed with `0x`, that will receive the withdrawn assets. + // Address, prefixed with `0x`, that will receive the withdrawn assets. string target_address = 6; // Creation timestamps. int64 creation = 7; + // Chain ID of the bridged EVM chain. + string source_chain_id = 8; } // -- Trades -- @@ -3404,7 +3414,7 @@ message GetStakeResponse { // Stake linking data with the corresponding cursor. message StakeLinkingEdge { - // Stake linking represent the intent from a party to deposit. + // Stake linking representing the intent from a party to deposit. vega.events.v1.StakeLinking node = 1; // Cursor that can be used to fetch further pages. string cursor = 2; @@ -3463,7 +3473,7 @@ message ObserveLedgerMovementsRequest {} // Response from ledger movements subscription message ObserveLedgerMovementsResponse { - // Ledger movements data with list of ledger entries and and post-transfer balances. + // Ledger movements data with list of ledger entries and post-transfer balances. vega.LedgerMovement ledger_movement = 1; } @@ -3789,7 +3799,7 @@ message FundingPayment { string market_id = 2; // Funding period sequence this payment was calculated from. uint64 funding_period_seq = 3; - // Timestamp, in Unix nanoseconds, at which this funding payment occured. + // Timestamp, in Unix nanoseconds, at which this funding payment occurred. int64 timestamp = 4; // Funding payment amount, where a positive value indicates an earned payment received and a negative value a loss. string amount = 5; @@ -3925,11 +3935,11 @@ message EstimatePositionRequest { string average_entry_price = 3 [(google.api.field_behavior) = REQUIRED]; // Open and/or hypothetical orders. repeated OrderInfo orders = 4; - // Margin account balance. Needs to be provided scaled to asset decimal places. + // Margin account balance. Needs to scaled by asset decimal places. string margin_account_balance = 5 [(google.api.field_behavior) = REQUIRED]; - // General account balance. Needs to be provided scaled to asset decimal places. + // General account balance. Needs to scaled by asset decimal places. string general_account_balance = 6 [(google.api.field_behavior) = REQUIRED]; - // Order margin account balance. Needs to be provided scaled to asset decimal places. + // Order margin account balance. Needs to be scaled by asset decimal places. string order_margin_account_balance = 7 [(google.api.field_behavior) = REQUIRED]; // Margin mode for the party, cross margin or isolated margin. vega.MarginMode margin_mode = 8 [(google.api.field_behavior) = REQUIRED]; @@ -4443,9 +4453,9 @@ message ListTeamRefereeHistoryResponse { // Request that is sent to retrieve fees statistics. message GetFeesStatsRequest { - // Restrict fee statistics to those related for the given market. + // Restrict fee statistics to those related to the given market. optional string market_id = 1; - // Restrict fee statistics to those related for the given asset. + // Restrict fee statistics to those related to the given asset. optional string asset_id = 2; // Epoch to get referral fee statistics for. If not set, the last complete epoch is used. optional uint64 epoch_seq = 3; @@ -4611,7 +4621,7 @@ message EstimateTransferFeeResponse { message GetTotalTransferFeeDiscountRequest { // ID of party eligible for the discount. string party_id = 1; - // ID of asset to associated with the discount. + // ID of asset associated with the discount. string asset_id = 5; } @@ -4625,10 +4635,13 @@ message GetTotalTransferFeeDiscountResponse { message ListGamesRequest { // Game ID to filter for. optional string game_id = 1; - // First epoch to retrieve game data from. If not provided, defaults to the last epoch minus 30, - // or the first epoch available if not enough epochs have passed. + // Oldest epoch to retrieve game data from, inclusive. The maximum range of epochs that can be fetched at once is 30. + // If not provided, defaults to the 'to' epoch minus 29, or the first epoch available if not enough epochs have passed. + // If the 'to' epoch is not specified, it will be set to the chosen 'from' epoch + 29. optional uint64 epoch_from = 2; - // Last epoch to retrieve game data to (inclusive). If not provided, defaults to the last epoch. + // Most recent epoch to retrieve game data to, inclusive. If not provided, defaults to the latest epoch. The maximum range of epochs that can be fetched at once is 30. + // If no 'from' epoch is provided, or the 'from' epoch is out of range, i.e., the 'to' epoch - 'from' epoch > 29, + // the 'from' epoch will be set to the 'to' epoch - 29. optional uint64 epoch_to = 3; // Entity scope to filter games for, i.e. team games or individual games only optional vega.EntityScope entity_scope = 4; diff --git a/protos/sources/vega/api/v1/core.proto b/protos/sources/vega/api/v1/core.proto index 764e3bdc6f..d72574475b 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.75.0"; + version: "v0.76.0"; } schemes: [ HTTP, diff --git a/protos/sources/vega/api/v1/corestate.proto b/protos/sources/vega/api/v1/corestate.proto index 69e9000ad0..40aac3ba4b 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.75.0"; + version: "v0.76.0"; } schemes: [ HTTP, diff --git a/protos/sources/vega/assets.proto b/protos/sources/vega/assets.proto index c230d05940..a418c45823 100644 --- a/protos/sources/vega/assets.proto +++ b/protos/sources/vega/assets.proto @@ -66,6 +66,8 @@ message ERC20 { // There’s no limit on the size of a withdrawal // note: this is a temporary measure that can be changed by governance. string withdraw_threshold = 3; + // Chain ID the asset originated from. + string chain_id = 4; } // Changes to apply on an existing asset. diff --git a/protos/sources/vega/chain_events.proto b/protos/sources/vega/chain_events.proto index 4ac3fede43..179fb75b98 100644 --- a/protos/sources/vega/chain_events.proto +++ b/protos/sources/vega/chain_events.proto @@ -105,6 +105,9 @@ message ERC20Event { uint64 index = 1; // Block in which the transaction was added. uint64 block = 2; + // ID of the source chain for this event. + string chain_id = 3; + // Action undertaken as a result of the event. oneof action { // List an ERC20 asset. @@ -166,6 +169,9 @@ message ERC20MultiSigEvent { uint64 index = 1; // Block in which the transaction was added uint64 block = 2; + // ID of the source chain for this event. + string chain_id = 3; + // Action undertaken as a result of the event. oneof action { // Add a signer to the erc20 bridge diff --git a/protos/sources/vega/checkpoint/v1/checkpoint.proto b/protos/sources/vega/checkpoint/v1/checkpoint.proto index a7968e31b8..58c9ab12af 100644 --- a/protos/sources/vega/checkpoint/v1/checkpoint.proto +++ b/protos/sources/vega/checkpoint/v1/checkpoint.proto @@ -164,18 +164,21 @@ message ScheduledGovernanceTransferAtTime { message Banking { repeated ScheduledTransferAtTime transfers_at_time = 1; RecurringTransfers recurring_transfers = 2; - BridgeState bridge_state = 3; + BridgeState primary_bridge_state = 3; repeated AssetAction asset_actions = 4; - uint64 last_seen_eth_block = 5; + uint64 last_seen_primary_eth_block = 5; repeated string seen_refs = 6; repeated ScheduledGovernanceTransferAtTime governance_transfers_at_time = 7; repeated GovernanceTransfer recurring_governance_transfers = 8; + BridgeState secondary_bridge_state = 9; + uint64 last_seen_secondary_eth_block = 10; } message BridgeState { bool active = 1; uint64 block_height = 2; uint64 log_index = 3; + string chain_id = 4; } message Validators { @@ -209,6 +212,7 @@ message MarketTracker { repeated MarketActivityTracker market_activity = 1; repeated TakerNotionalVolume taker_notional_volume = 2; repeated MarketToPartyTakerNotionalVolume market_to_party_taker_notional_volume = 3; + repeated EpochPartyTakerFees epoch_taker_fees = 4; } message MarketActivityTracker { @@ -233,6 +237,15 @@ message MarketActivityTracker { repeated EpochTimeWeightPositionData time_weighted_position_data_history = 16; repeated EpochTimeWeightedNotionalData time_weighted_notional_data_history = 17; repeated EpochReturnsData returns_data_history = 18; + repeated PartyFees infra_fees = 19; + repeated PartyFees lp_paid_fees = 20; + + repeated ReturnsData realised_returns = 21; + repeated EpochReturnsData realised_returns_history = 22; +} + +message EpochPartyTakerFees { + repeated AssetMarketPartyTakerFees epoch_party_taker_fees_paid = 1; } message EpochTimeWeightPositionData { @@ -253,6 +266,17 @@ message PartyTimeWeightedPosition { uint64 tw_position = 2; } +message AssetMarketPartyTakerFees { + string asset = 1; + string market = 2; + repeated PartyTakerFees taker_fees = 3; +} + +message PartyTakerFees { + string party = 1; + bytes taker_fees = 2; +} + message EpochPartyFees { repeated PartyFeesHistory party_fees = 1; } @@ -314,6 +338,7 @@ message AssetAction { vega.ERC20AssetLimitsUpdated erc20_asset_limits_updated = 10; bool erc20_bridge_stopped = 11; bool erc20_bridge_resumed = 12; + string chain_id = 13; } message ELSShare { diff --git a/protos/sources/vega/commands/v1/commands.proto b/protos/sources/vega/commands/v1/commands.proto index 2bfd5ad886..623bc72b7c 100644 --- a/protos/sources/vega/commands/v1/commands.proto +++ b/protos/sources/vega/commands/v1/commands.proto @@ -348,6 +348,8 @@ message IssueSignatures { NodeSignatureKind kind = 2; // Node ID of the validator node that will be signed in or out of the smart contract. string validator_node_id = 3; + // Chain ID of the bridge to generate signatures for. + string chain_id = 4; } // Command that a party can use to instruct the network to create a new referral set on the network. diff --git a/protos/sources/vega/events/v1/events.proto b/protos/sources/vega/events/v1/events.proto index c7cef4f5a9..fc9efbf3e9 100644 --- a/protos/sources/vega/events/v1/events.proto +++ b/protos/sources/vega/events/v1/events.proto @@ -260,6 +260,8 @@ message ERC20MultiSigSignerAdded { string nonce = 6; // Epoch that the node was added for string epoch_seq = 7; + // EVM chain ID that the multisig control contract lives on. + string chain_id = 8; } message ERC20MultiSigSignerRemovedSubmitter { @@ -284,6 +286,8 @@ message ERC20MultiSigSignerRemoved { string nonce = 5; // Epoch that the node was removed for string epoch_seq = 6; + // EVM chain ID that the multisig control contract lives on. + string chain_id = 8; } message Transfer { @@ -411,6 +415,7 @@ message ERC20MultiSigSignerEvent { string tx_hash = 6; uint64 log_index = 7; uint64 block_number = 8; + string chain_id = 9; } message ERC20MultiSigThresholdSetEvent { @@ -421,6 +426,7 @@ message ERC20MultiSigThresholdSetEvent { string tx_hash = 5; uint64 log_index = 6; uint64 block_number = 7; + string chain_id = 8; } message CheckpointEvent { @@ -528,8 +534,8 @@ message TransactionResult { commands.v1.BatchMarketInstructions batch_market_instructions = 119; commands.v1.KeyRotateSubmission key_rotate_submission = 120; commands.v1.EthereumKeyRotateSubmission ethereum_key_rotate_submission = 121; - commands.v1.StopOrdersSubmission stop_order_submission = 122; - commands.v1.StopOrdersCancellation stop_order_cancellation = 123; + commands.v1.StopOrdersSubmission stop_orders_submission = 122; + commands.v1.StopOrdersCancellation stop_orders_cancellation = 123; commands.v1.CreateReferralSet create_referral_set = 124; commands.v1.UpdateReferralSet update_referral_set = 125; commands.v1.ApplyReferralCode apply_referral_code = 126; @@ -892,6 +898,15 @@ message ExpiredOrders { repeated string order_ids = 2; } +message CancelledOrders { + // Market ID for the event. + string market_id = 1; + // The ID of the party which cancelled the orders. + string party_id = 2; + // The order IDs that were cancelled. + repeated string order_ids = 3; +} + message TeamCreated { // The unique identifier of the created team. string team_id = 1; @@ -1337,6 +1352,9 @@ enum BusEventType { // Event indicating time weighted notional position has been updated. BUS_EVENT_TYPE_TIME_WEIGHTED_NOTIONAL_POSITION_UPDATED = 88; + // Event containing the IDs of orders cancelled by a party on a market. + BUS_EVENT_TYPE_CANCELLED_ORDERS = 89; + // 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 @@ -1522,6 +1540,8 @@ message BusEvent { TeamsStatsUpdated teams_stats_updated = 185; // Event notifying an update of the time weighted notional position for a party in an asset 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; // Market tick events MarketEvent market = 1001; diff --git a/protos/sources/vega/governance.proto b/protos/sources/vega/governance.proto index cc53e51ce8..21196ffbf3 100644 --- a/protos/sources/vega/governance.proto +++ b/protos/sources/vega/governance.proto @@ -15,8 +15,6 @@ message SpotProduct { string base_asset = 1; // Quote asset ID. string quote_asset = 2; - // Product name. - string name = 3; } // Future product configuration @@ -85,7 +83,7 @@ message NewSpotMarketConfiguration { // New spot market instrument configuration. InstrumentConfiguration instrument = 1; // Decimal places used for the new spot market, sets the smallest price increment on the book. - uint64 decimal_places = 2; + uint64 price_decimal_places = 2; // Optional new spot market metadata, tags. repeated string metadata = 3; // Price monitoring parameters. @@ -100,7 +98,7 @@ message NewSpotMarketConfiguration { LogNormalRiskModel log_normal = 101; } // Decimal places for order sizes, sets what size the smallest order / position on the spot market can be. - int64 position_decimal_places = 6; + int64 size_decimal_places = 6; // Specifies the liquidity provision SLA parameters. LiquiditySLAParameters sla_params = 7; // Specifies how the liquidity fee for the market will be calculated. @@ -246,6 +244,15 @@ message UpdateSpotMarketConfiguration { LiquidityFeeSettings liquidity_fee_settings = 5; // The market tick size defines the minimum change in quote price for the market string tick_size = 6; + // Specifies the name and code of the spot instrument. + UpdateSpotInstrumentConfiguration instrument = 7; +} + +message UpdateSpotInstrumentConfiguration { + // Instrument code, human-readable shortcode used to describe the instrument. + string code = 1; + // Instrument name + string name = 2; } // Instrument configuration @@ -375,6 +382,9 @@ message BatchProposalTermsChange { // Timestamp as Unix time in seconds when proposal terms gets enacted if proposal passed the vote, // constrained by `minEnact` and `maxEnact` network parameters. int64 enactment_timestamp = 1; + // Validation timestamp as Unix time in seconds. + int64 validation_timestamp = 2; + // Changes being proposed. oneof change { // Proposal change for modifying an existing futures market. @@ -402,6 +412,8 @@ message BatchProposalTermsChange { UpdateReferralProgram update_referral_program = 111; // Proposal change for updating the volume discount program. UpdateVolumeDiscountProgram update_volume_discount_program = 112; + // Proposal change for adding a new asset. + NewAsset new_asset = 113; } } @@ -659,6 +671,8 @@ enum ProposalError { PROPOSAL_ERROR_PROPOSAL_IN_BATCH_REJECTED = 58; // One or more proposals in a batch has been declined PROPOSAL_ERROR_PROPOSAL_IN_BATCH_DECLINED = 59; + // Spot market decimal places cannot be greater than the base asset’s decimal places + PROPOSAL_ERROR_INVALID_SIZE_DECIMAL_PLACES = 60; } // Governance vote diff --git a/protos/sources/vega/markets.proto b/protos/sources/vega/markets.proto index df6f338d24..686a0c68c4 100644 --- a/protos/sources/vega/markets.proto +++ b/protos/sources/vega/markets.proto @@ -26,8 +26,6 @@ message Spot { string base_asset = 1; // Asset ID of the underlying quote asset for the spot product. string quote_asset = 2; - // Name of the instrument. - string name = 3; } // Future product definition @@ -348,7 +346,7 @@ message Market { TradableInstrument tradable_instrument = 2; // Number of decimal places that a price must be shifted by in order to get a // correct price denominated in the currency of the market, for example: - // `realPrice = price / 10^decimalPlaces`. + // `realPrice = price / 10^decimalPlaces`. On spot markets, also called 'size decimal places'. uint64 decimal_places = 3; // Fees configuration that apply to the market. Fees fees = 4; @@ -366,6 +364,7 @@ message Market { // Timestamps for when the market state changes. MarketTimestamps market_timestamps = 10; // The number of decimal places for a position. + // On spot markets, used for order size, also known as 'size decimal places'. int64 position_decimal_places = 11; // Percentage move up and down from the mid price which specifies the range of // price levels over which automated liquidity provisions will be deployed. @@ -412,6 +411,9 @@ message LiquidationStrategy { uint64 full_disposal_size = 3; // Max fraction of the total volume of the orderbook, within liquidity bounds, that the network can use to close its position; range 0 through 1. string max_fraction_consumed = 4; + // Decimal > 0 specifying the range range above and below the mid price within which the network will trade to dispose of its position. + // The value can be > 1. For example, if set to 1.5, the minimum price will be 0, ie max(0, mid_price * (1 - 1.5)), and the maximum price will be mid_price * (1 + 1.5). + string disposal_slippage_range = 5; } enum CompositePriceType { diff --git a/protos/sources/vega/snapshot/v1/snapshot.proto b/protos/sources/vega/snapshot/v1/snapshot.proto index ccc9accb57..26186f2605 100644 --- a/protos/sources/vega/snapshot/v1/snapshot.proto +++ b/protos/sources/vega/snapshot/v1/snapshot.proto @@ -118,7 +118,7 @@ message Payload { ProofOfWork proof_of_work = 53; PendingAssetUpdates pending_asset_updates = 54; ProtocolUpgradeProposals protocol_upgrade_proposals = 55; - BankingBridgeState banking_bridge_state = 56; + BankingBridgeState banking_primary_bridge_state = 56; SettlementState settlement_state = 57; LiquidityScores liquidity_scores = 58; SpotLiquidityTarget spot_liquidity_target = 59; @@ -146,6 +146,8 @@ message Payload { Parties parties = 83; L2EthOracles l2_eth_oracles = 84; EthOracleVerifierMisc eth_oracle_verifier_misc = 85; + BankingEVMBridgeStates banking_evm_bridge_states = 86; + EVMMultisigTopologies evm_multisig_topologies = 87; } } @@ -235,6 +237,7 @@ message EventForwarder { // this is deprecated, use the other one now repeated string acked_events = 1; repeated EventForwarderBucket buckets = 2; + string chain_id = 3; } message CollateralAccounts { @@ -273,6 +276,7 @@ message TxRef { uint64 block_nr = 2; string hash = 3; uint64 log_index = 4; + string chain_id = 5; } message BankingWithdrawals { @@ -285,7 +289,8 @@ message BankingDeposits { message BankingSeen { repeated string refs = 1; - uint64 last_seen_eth_block = 2; + uint64 last_seen_primary_eth_block = 2; + uint64 last_seen_secondary_eth_block = 3; } message BankingAssetActions { @@ -312,6 +317,10 @@ message BankingBridgeState { vega.checkpoint.v1.BridgeState bridge_state = 1; } +message BankingEVMBridgeStates { + repeated vega.checkpoint.v1.BridgeState bridge_states = 1; +} + message Checkpoint { int64 next_cp = 1; } @@ -360,6 +369,7 @@ message GovernanceBatchActive { message GovernanceNode { repeated vega.Proposal proposals = 1; repeated ProposalData proposal_data = 2; // includes votes + repeated BatchProposalData batch_proposal_data = 3; } message StakingAccount { @@ -419,6 +429,7 @@ message PriceBound { message PriceRangeCache { PriceBound bound = 1; PriceRange range = 2; + uint64 bound_index = 3; } message CurrentPrice { @@ -503,6 +514,8 @@ message SpotMarket { StopOrders stop_orders = 19; repeated vega.Order expiring_stop_orders = 20; vega.events.v1.FeesStats fees_stats = 21; + bool has_traded = 22; + MarketLiquidity market_liquidity = 23; } message Market { @@ -537,6 +550,7 @@ message Market { CompositePriceCalculator mark_price_calculator = 29; optional CompositePriceCalculator internal_composite_price_calculator = 30; int64 next_internal_composite_price_calc = 31; + MarketLiquidity market_liquidity = 32; } message PartyMarginFactor { @@ -901,6 +915,7 @@ message IssuedERC20MultisigControlSignature { string resource_id = 1; string ethereum_address = 2; string submitter_address = 3; + string chain_id = 4; } message ValidatorState { @@ -1091,6 +1106,7 @@ message MarketTracker { repeated checkpoint.v1.MarketActivityTracker market_activity = 1; repeated checkpoint.v1.TakerNotionalVolume taker_notional_volume = 2; repeated checkpoint.v1.MarketToPartyTakerNotionalVolume market_to_party_taker_notional_volume = 3; + repeated checkpoint.v1.EpochPartyTakerFees epoch_taker_fees = 4; } message SignerEventsPerAddress { @@ -1112,6 +1128,16 @@ message ERC20MultiSigTopologyPending { repeated string witnessed_threshold_sets = 4; } +message EVMMultisigTopology { + string chain_id = 1; + ERC20MultiSigTopologyVerified verified = 2; + ERC20MultiSigTopologyPending pending = 3; +} + +message EVMMultisigTopologies { + repeated EVMMultisigTopology evm_multisig_topology = 1; +} + message ProofOfWork { repeated uint64 block_height = 1; repeated string block_hash = 2; @@ -1343,3 +1369,7 @@ message PartyProfile { string alias = 2; repeated vega.Metadata metadata = 3; } + +message MarketLiquidity { + string price_range = 1; +} diff --git a/protos/sources/vega/vega.proto b/protos/sources/vega/vega.proto index db02758f2d..7b0f51a470 100644 --- a/protos/sources/vega/vega.proto +++ b/protos/sources/vega/vega.proto @@ -96,6 +96,8 @@ message StopOrder { REJECTION_REASON_STOP_ORDER_NOT_ALLOWED_DURING_OPENING_AUCTION = 8; // Stop OCO orders cannot have the same expiry timestamp REJECTION_REASON_STOP_ORDER_CANNOT_MATCH_OCO_EXPIRY_TIMES = 9; + // Stop orders with a position size override are not supported for spot markets + REJECTION_REASON_STOP_ORDER_SIZE_OVERRIDE_UNSUPPORTED_FOR_SPOT = 10; } // ID of this stop order @@ -920,6 +922,9 @@ enum AccountType { // Per asset market account for party in isolated margin mode ACCOUNT_TYPE_ORDER_MARGIN = 29; + // Per asset market reward account for realised return + ACCOUNT_TYPE_REWARD_REALISED_RETURN = 30; + // Note: If adding an enum value, add a matching entry in: // - gateway/graphql/helpers_enum.go // - gateway/graphql/schema.graphql (enum AccountType) @@ -1075,6 +1080,8 @@ enum DispatchMetric { DISPATCH_METRIC_RETURN_VOLATILITY = 7; // Dispatch metric that uses the validator ranking of the validator as metric DISPATCH_METRIC_VALIDATOR_RANKING = 8; + // Dispatch metric that uses the realised return of the party in a market + DISPATCH_METRIC_REALISED_RETURN = 9; } enum EntityScope { @@ -1132,6 +1139,8 @@ message DispatchStrategy { repeated Rank rank_table = 13; // If set, the actual amount of rewards transferred to each public key during distribution for this transfer will be `min(calculated_reward_in_quantum, cap_reward_fee_multiple × fees_paid_this_epoch_in_quantum). optional string cap_reward_fee_multiple = 14; + // Number of epochs between transfers, i.e. when 4, funds will be transferred every 4 epochs with the first transfer occurring 4 epochs after the transaction is processed. + optional int32 transfer_interval = 15; } message Rank { @@ -1545,7 +1554,7 @@ message EthereumConfig { string network_id = 1; // Chain ID of this Ethereum network. string chain_id = 2; - //// Contract configuration of the collateral bridge contract for this Ethereum network. + // Contract configuration of the collateral bridge contract for this Ethereum network. EthereumContractConfig collateral_bridge_contract = 3; // Number of block confirmations to wait to consider an Ethereum transaction trusted. // An Ethereum block is trusted when there are at least "n" blocks confirmed by the @@ -1561,8 +1570,36 @@ message EthereumConfig { EthereumContractConfig multisig_control_contract = 7; } +// EVM Chain configuration details. +message EVMBridgeConfig { + // Network ID of this EVM compatible network. + string network_id = 1; + // Chain ID of this EVM compatible network. + string chain_id = 2; + // Contract configuration of the collateral bridge contract for this EVM compatible network. + EthereumContractConfig collateral_bridge_contract = 3; + // Number of block confirmations to wait to consider an EVM compatible chain transaction trusted. + // An EVM compatible chain block is trusted when there are at least "n" blocks confirmed by the + // network, "n" being the number of `confirmations` required. If `confirmations` was set to `3`, + // and the current block to be forged (or mined) on the EVM compatible chain is block 14, block + // 10 would be considered as trusted, but not block 11. + uint32 confirmations = 4; + // Contract configuration of the multisig control contract for this EVM compatible network. + EthereumContractConfig multisig_control_contract = 5; + // Approximate block time of the EVM chain as a duration e.g. 12s, 250ms. + string block_time = 6; + // Display name of this network. + string name = 7; +} + +// A list of EVM bridge configurations +message EVMBridgeConfigs { + // The EVM configurations + repeated EVMBridgeConfig configs = 1; +} + message EthereumContractConfig { - // Address of the contract for this Ethereum network. The address should start with "0x". + // Address of the contract for this EVM compatible network. The address should start with "0x". string address = 1; // Block height at which the stacking contract has been deployed for this Ethereum network. uint64 deployment_block_height = 6; diff --git a/protos/vega/api/v1/core.pb.go b/protos/vega/api/v1/core.pb.go index 4cee1d88ae..963481f939 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, 0x35, 0x2e, 0x30, 0x1a, 0x13, 0x6c, 0x62, 0x2e, + 0x49, 0x73, 0x32, 0x07, 0x76, 0x30, 0x2e, 0x37, 0x36, 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 5968dea7c0..032f0b0bd0 100644 --- a/protos/vega/api/v1/corestate.pb.go +++ b/protos/vega/api/v1/corestate.pb.go @@ -1511,7 +1511,7 @@ 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, 0x35, + 0x74, 0x61, 0x74, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x32, 0x07, 0x76, 0x30, 0x2e, 0x37, 0x36, 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/assets.pb.go b/protos/vega/assets.pb.go index 02786de3b9..6ab24260fc 100644 --- a/protos/vega/assets.pb.go +++ b/protos/vega/assets.pb.go @@ -333,6 +333,8 @@ type ERC20 struct { // There’s no limit on the size of a withdrawal // note: this is a temporary measure that can be changed by governance. WithdrawThreshold string `protobuf:"bytes,3,opt,name=withdraw_threshold,json=withdrawThreshold,proto3" json:"withdraw_threshold,omitempty"` + // Chain ID the asset originated from. + ChainId string `protobuf:"bytes,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (x *ERC20) Reset() { @@ -388,6 +390,13 @@ func (x *ERC20) GetWithdrawThreshold() string { return "" } +func (x *ERC20) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + // Changes to apply on an existing asset. type AssetDetailsUpdate struct { state protoimpl.MessageState @@ -567,7 +576,7 @@ var file_vega_assets_proto_rawDesc = []byte{ 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x61, 0x75, 0x63, 0x65, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x46, 0x61, 0x75, 0x63, 0x65, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x69, 0x6e, - 0x74, 0x22, 0x88, 0x01, 0x0a, 0x05, 0x45, 0x52, 0x43, 0x32, 0x30, 0x12, 0x29, 0x0a, 0x10, 0x63, + 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x05, 0x45, 0x52, 0x43, 0x32, 0x30, 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, 0x25, 0x0a, 0x0e, 0x6c, 0x69, 0x66, 0x65, 0x74, 0x69, @@ -575,24 +584,26 @@ var file_vega_assets_proto_rawDesc = []byte{ 0x6c, 0x69, 0x66, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x7b, 0x0a, 0x12, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x12, 0x29, 0x0a, 0x05, - 0x65, 0x72, 0x63, 0x32, 0x30, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, - 0x52, 0x05, 0x65, 0x72, 0x63, 0x32, 0x30, 0x42, 0x08, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, - 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x63, 0x0a, 0x0b, 0x45, 0x52, 0x43, - 0x32, 0x30, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x69, 0x66, 0x65, - 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6c, 0x69, 0x66, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x2d, 0x0a, 0x12, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 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, + 0x72, 0x61, 0x77, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 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, 0x7b, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x12, 0x29, 0x0a, 0x05, 0x65, 0x72, 0x63, 0x32, 0x30, + 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, + 0x43, 0x32, 0x30, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x63, + 0x32, 0x30, 0x42, 0x08, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x01, + 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, + 0x08, 0x04, 0x10, 0x05, 0x22, 0x63, 0x0a, 0x0b, 0x45, 0x52, 0x43, 0x32, 0x30, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x69, 0x66, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x69, 0x66, + 0x65, 0x74, 0x69, 0x6d, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x27, 0x5a, 0x25, 0x63, 0x6f, 0x64, + 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, + 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, + 0x67, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/protos/vega/chain_events.pb.go b/protos/vega/chain_events.pb.go index fefeeba8bb..0552d76e84 100644 --- a/protos/vega/chain_events.pb.go +++ b/protos/vega/chain_events.pb.go @@ -676,6 +676,8 @@ type ERC20Event struct { Index uint64 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` // Block in which the transaction was added. Block uint64 `protobuf:"varint,2,opt,name=block,proto3" json:"block,omitempty"` + // ID of the source chain for this event. + ChainId string `protobuf:"bytes,3,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` // Action undertaken as a result of the event. // // Types that are assignable to Action: @@ -736,6 +738,13 @@ func (x *ERC20Event) GetBlock() uint64 { return 0 } +func (x *ERC20Event) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + func (m *ERC20Event) GetAction() isERC20Event_Action { if m != nil { return m.Action @@ -1062,6 +1071,8 @@ type ERC20MultiSigEvent struct { Index uint64 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` // Block in which the transaction was added Block uint64 `protobuf:"varint,2,opt,name=block,proto3" json:"block,omitempty"` + // ID of the source chain for this event. + ChainId string `protobuf:"bytes,3,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` // Action undertaken as a result of the event. // // Types that are assignable to Action: @@ -1118,6 +1129,13 @@ func (x *ERC20MultiSigEvent) GetBlock() uint64 { return 0 } +func (x *ERC20MultiSigEvent) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + func (m *ERC20MultiSigEvent) GetAction() isERC20MultiSigEvent_Action { if m != nil { return m.Action @@ -1585,118 +1603,121 @@ var file_vega_chain_events_proto_rawDesc = []byte{ 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, 0xcb, + 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, 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, 0x8d, 0x02, - 0x0a, 0x12, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x45, + 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, 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, + 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 ( diff --git a/protos/vega/checkpoint/v1/checkpoint.pb.go b/protos/vega/checkpoint/v1/checkpoint.pb.go index be79b0833c..bbc882dde3 100644 --- a/protos/vega/checkpoint/v1/checkpoint.pb.go +++ b/protos/vega/checkpoint/v1/checkpoint.pb.go @@ -1440,12 +1440,14 @@ type Banking struct { TransfersAtTime []*ScheduledTransferAtTime `protobuf:"bytes,1,rep,name=transfers_at_time,json=transfersAtTime,proto3" json:"transfers_at_time,omitempty"` RecurringTransfers *RecurringTransfers `protobuf:"bytes,2,opt,name=recurring_transfers,json=recurringTransfers,proto3" json:"recurring_transfers,omitempty"` - BridgeState *BridgeState `protobuf:"bytes,3,opt,name=bridge_state,json=bridgeState,proto3" json:"bridge_state,omitempty"` + PrimaryBridgeState *BridgeState `protobuf:"bytes,3,opt,name=primary_bridge_state,json=primaryBridgeState,proto3" json:"primary_bridge_state,omitempty"` AssetActions []*AssetAction `protobuf:"bytes,4,rep,name=asset_actions,json=assetActions,proto3" json:"asset_actions,omitempty"` - LastSeenEthBlock uint64 `protobuf:"varint,5,opt,name=last_seen_eth_block,json=lastSeenEthBlock,proto3" json:"last_seen_eth_block,omitempty"` + LastSeenPrimaryEthBlock uint64 `protobuf:"varint,5,opt,name=last_seen_primary_eth_block,json=lastSeenPrimaryEthBlock,proto3" json:"last_seen_primary_eth_block,omitempty"` SeenRefs []string `protobuf:"bytes,6,rep,name=seen_refs,json=seenRefs,proto3" json:"seen_refs,omitempty"` GovernanceTransfersAtTime []*ScheduledGovernanceTransferAtTime `protobuf:"bytes,7,rep,name=governance_transfers_at_time,json=governanceTransfersAtTime,proto3" json:"governance_transfers_at_time,omitempty"` RecurringGovernanceTransfers []*GovernanceTransfer `protobuf:"bytes,8,rep,name=recurring_governance_transfers,json=recurringGovernanceTransfers,proto3" json:"recurring_governance_transfers,omitempty"` + SecondaryBridgeState *BridgeState `protobuf:"bytes,9,opt,name=secondary_bridge_state,json=secondaryBridgeState,proto3" json:"secondary_bridge_state,omitempty"` + LastSeenSecondaryEthBlock uint64 `protobuf:"varint,10,opt,name=last_seen_secondary_eth_block,json=lastSeenSecondaryEthBlock,proto3" json:"last_seen_secondary_eth_block,omitempty"` } func (x *Banking) Reset() { @@ -1494,9 +1496,9 @@ func (x *Banking) GetRecurringTransfers() *RecurringTransfers { return nil } -func (x *Banking) GetBridgeState() *BridgeState { +func (x *Banking) GetPrimaryBridgeState() *BridgeState { if x != nil { - return x.BridgeState + return x.PrimaryBridgeState } return nil } @@ -1508,9 +1510,9 @@ func (x *Banking) GetAssetActions() []*AssetAction { return nil } -func (x *Banking) GetLastSeenEthBlock() uint64 { +func (x *Banking) GetLastSeenPrimaryEthBlock() uint64 { if x != nil { - return x.LastSeenEthBlock + return x.LastSeenPrimaryEthBlock } return 0 } @@ -1536,6 +1538,20 @@ func (x *Banking) GetRecurringGovernanceTransfers() []*GovernanceTransfer { return nil } +func (x *Banking) GetSecondaryBridgeState() *BridgeState { + if x != nil { + return x.SecondaryBridgeState + } + return nil +} + +func (x *Banking) GetLastSeenSecondaryEthBlock() uint64 { + if x != nil { + return x.LastSeenSecondaryEthBlock + } + return 0 +} + type BridgeState struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1544,6 +1560,7 @@ type BridgeState struct { Active bool `protobuf:"varint,1,opt,name=active,proto3" json:"active,omitempty"` BlockHeight uint64 `protobuf:"varint,2,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"` LogIndex uint64 `protobuf:"varint,3,opt,name=log_index,json=logIndex,proto3" json:"log_index,omitempty"` + ChainId string `protobuf:"bytes,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (x *BridgeState) Reset() { @@ -1599,6 +1616,13 @@ func (x *BridgeState) GetLogIndex() uint64 { return 0 } +func (x *BridgeState) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + type Validators struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1883,6 +1907,7 @@ type MarketTracker struct { MarketActivity []*MarketActivityTracker `protobuf:"bytes,1,rep,name=market_activity,json=marketActivity,proto3" json:"market_activity,omitempty"` TakerNotionalVolume []*TakerNotionalVolume `protobuf:"bytes,2,rep,name=taker_notional_volume,json=takerNotionalVolume,proto3" json:"taker_notional_volume,omitempty"` MarketToPartyTakerNotionalVolume []*MarketToPartyTakerNotionalVolume `protobuf:"bytes,3,rep,name=market_to_party_taker_notional_volume,json=marketToPartyTakerNotionalVolume,proto3" json:"market_to_party_taker_notional_volume,omitempty"` + EpochTakerFees []*EpochPartyTakerFees `protobuf:"bytes,4,rep,name=epoch_taker_fees,json=epochTakerFees,proto3" json:"epoch_taker_fees,omitempty"` } func (x *MarketTracker) Reset() { @@ -1938,6 +1963,13 @@ func (x *MarketTracker) GetMarketToPartyTakerNotionalVolume() []*MarketToPartyTa return nil } +func (x *MarketTracker) GetEpochTakerFees() []*EpochPartyTakerFees { + if x != nil { + return x.EpochTakerFees + } + return nil +} + type MarketActivityTracker struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1961,6 +1993,10 @@ type MarketActivityTracker struct { TimeWeightedPositionDataHistory []*EpochTimeWeightPositionData `protobuf:"bytes,16,rep,name=time_weighted_position_data_history,json=timeWeightedPositionDataHistory,proto3" json:"time_weighted_position_data_history,omitempty"` TimeWeightedNotionalDataHistory []*EpochTimeWeightedNotionalData `protobuf:"bytes,17,rep,name=time_weighted_notional_data_history,json=timeWeightedNotionalDataHistory,proto3" json:"time_weighted_notional_data_history,omitempty"` ReturnsDataHistory []*EpochReturnsData `protobuf:"bytes,18,rep,name=returns_data_history,json=returnsDataHistory,proto3" json:"returns_data_history,omitempty"` + InfraFees []*PartyFees `protobuf:"bytes,19,rep,name=infra_fees,json=infraFees,proto3" json:"infra_fees,omitempty"` + 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"` } func (x *MarketActivityTracker) Reset() { @@ -2121,6 +2157,81 @@ func (x *MarketActivityTracker) GetReturnsDataHistory() []*EpochReturnsData { return nil } +func (x *MarketActivityTracker) GetInfraFees() []*PartyFees { + if x != nil { + return x.InfraFees + } + return nil +} + +func (x *MarketActivityTracker) GetLpPaidFees() []*PartyFees { + if x != nil { + return x.LpPaidFees + } + return nil +} + +func (x *MarketActivityTracker) GetRealisedReturns() []*ReturnsData { + if x != nil { + return x.RealisedReturns + } + return nil +} + +func (x *MarketActivityTracker) GetRealisedReturnsHistory() []*EpochReturnsData { + if x != nil { + return x.RealisedReturnsHistory + } + return nil +} + +type EpochPartyTakerFees struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EpochPartyTakerFeesPaid []*AssetMarketPartyTakerFees `protobuf:"bytes,1,rep,name=epoch_party_taker_fees_paid,json=epochPartyTakerFeesPaid,proto3" json:"epoch_party_taker_fees_paid,omitempty"` +} + +func (x *EpochPartyTakerFees) Reset() { + *x = EpochPartyTakerFees{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EpochPartyTakerFees) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EpochPartyTakerFees) ProtoMessage() {} + +func (x *EpochPartyTakerFees) ProtoReflect() protoreflect.Message { + mi := &file_vega_checkpoint_v1_checkpoint_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 EpochPartyTakerFees.ProtoReflect.Descriptor instead. +func (*EpochPartyTakerFees) Descriptor() ([]byte, []int) { + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{30} +} + +func (x *EpochPartyTakerFees) GetEpochPartyTakerFeesPaid() []*AssetMarketPartyTakerFees { + if x != nil { + return x.EpochPartyTakerFeesPaid + } + return nil +} + type EpochTimeWeightPositionData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2132,7 +2243,7 @@ type EpochTimeWeightPositionData struct { func (x *EpochTimeWeightPositionData) Reset() { *x = EpochTimeWeightPositionData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[30] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2145,7 +2256,7 @@ func (x *EpochTimeWeightPositionData) String() string { func (*EpochTimeWeightPositionData) ProtoMessage() {} func (x *EpochTimeWeightPositionData) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[30] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2158,7 +2269,7 @@ func (x *EpochTimeWeightPositionData) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochTimeWeightPositionData.ProtoReflect.Descriptor instead. func (*EpochTimeWeightPositionData) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{30} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{31} } func (x *EpochTimeWeightPositionData) GetPartyTimeWeightedPositions() []*PartyTimeWeightedPosition { @@ -2179,7 +2290,7 @@ type EpochTimeWeightedNotionalData struct { func (x *EpochTimeWeightedNotionalData) Reset() { *x = EpochTimeWeightedNotionalData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[31] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2192,7 +2303,7 @@ func (x *EpochTimeWeightedNotionalData) String() string { func (*EpochTimeWeightedNotionalData) ProtoMessage() {} func (x *EpochTimeWeightedNotionalData) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[31] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2205,7 +2316,7 @@ func (x *EpochTimeWeightedNotionalData) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochTimeWeightedNotionalData.ProtoReflect.Descriptor instead. func (*EpochTimeWeightedNotionalData) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{31} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{32} } func (x *EpochTimeWeightedNotionalData) GetPartyTimeWeightedNotionals() []*PartyTimeWeightedNotional { @@ -2227,7 +2338,7 @@ type PartyTimeWeightedNotional struct { func (x *PartyTimeWeightedNotional) Reset() { *x = PartyTimeWeightedNotional{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[32] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2240,7 +2351,7 @@ func (x *PartyTimeWeightedNotional) String() string { func (*PartyTimeWeightedNotional) ProtoMessage() {} func (x *PartyTimeWeightedNotional) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[32] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2253,7 +2364,7 @@ func (x *PartyTimeWeightedNotional) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyTimeWeightedNotional.ProtoReflect.Descriptor instead. func (*PartyTimeWeightedNotional) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{32} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{33} } func (x *PartyTimeWeightedNotional) GetParty() string { @@ -2282,7 +2393,7 @@ type PartyTimeWeightedPosition struct { func (x *PartyTimeWeightedPosition) Reset() { *x = PartyTimeWeightedPosition{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[33] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2295,7 +2406,7 @@ func (x *PartyTimeWeightedPosition) String() string { func (*PartyTimeWeightedPosition) ProtoMessage() {} func (x *PartyTimeWeightedPosition) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[33] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2308,7 +2419,7 @@ func (x *PartyTimeWeightedPosition) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyTimeWeightedPosition.ProtoReflect.Descriptor instead. func (*PartyTimeWeightedPosition) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{33} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{34} } func (x *PartyTimeWeightedPosition) GetParty() string { @@ -2325,6 +2436,124 @@ func (x *PartyTimeWeightedPosition) GetTwPosition() uint64 { return 0 } +type AssetMarketPartyTakerFees struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Asset string `protobuf:"bytes,1,opt,name=asset,proto3" json:"asset,omitempty"` + Market string `protobuf:"bytes,2,opt,name=market,proto3" json:"market,omitempty"` + TakerFees []*PartyTakerFees `protobuf:"bytes,3,rep,name=taker_fees,json=takerFees,proto3" json:"taker_fees,omitempty"` +} + +func (x *AssetMarketPartyTakerFees) Reset() { + *x = AssetMarketPartyTakerFees{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AssetMarketPartyTakerFees) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AssetMarketPartyTakerFees) ProtoMessage() {} + +func (x *AssetMarketPartyTakerFees) ProtoReflect() protoreflect.Message { + mi := &file_vega_checkpoint_v1_checkpoint_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 AssetMarketPartyTakerFees.ProtoReflect.Descriptor instead. +func (*AssetMarketPartyTakerFees) Descriptor() ([]byte, []int) { + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{35} +} + +func (x *AssetMarketPartyTakerFees) GetAsset() string { + if x != nil { + return x.Asset + } + return "" +} + +func (x *AssetMarketPartyTakerFees) GetMarket() string { + if x != nil { + return x.Market + } + return "" +} + +func (x *AssetMarketPartyTakerFees) GetTakerFees() []*PartyTakerFees { + if x != nil { + return x.TakerFees + } + return nil +} + +type PartyTakerFees struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Party string `protobuf:"bytes,1,opt,name=party,proto3" json:"party,omitempty"` + TakerFees []byte `protobuf:"bytes,2,opt,name=taker_fees,json=takerFees,proto3" json:"taker_fees,omitempty"` +} + +func (x *PartyTakerFees) Reset() { + *x = PartyTakerFees{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PartyTakerFees) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PartyTakerFees) ProtoMessage() {} + +func (x *PartyTakerFees) ProtoReflect() protoreflect.Message { + mi := &file_vega_checkpoint_v1_checkpoint_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 PartyTakerFees.ProtoReflect.Descriptor instead. +func (*PartyTakerFees) Descriptor() ([]byte, []int) { + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{36} +} + +func (x *PartyTakerFees) GetParty() string { + if x != nil { + return x.Party + } + return "" +} + +func (x *PartyTakerFees) GetTakerFees() []byte { + if x != nil { + return x.TakerFees + } + return nil +} + type EpochPartyFees struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2336,7 +2565,7 @@ type EpochPartyFees struct { func (x *EpochPartyFees) Reset() { *x = EpochPartyFees{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[34] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2349,7 +2578,7 @@ func (x *EpochPartyFees) String() string { func (*EpochPartyFees) ProtoMessage() {} func (x *EpochPartyFees) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[34] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2362,7 +2591,7 @@ func (x *EpochPartyFees) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochPartyFees.ProtoReflect.Descriptor instead. func (*EpochPartyFees) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{34} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{37} } func (x *EpochPartyFees) GetPartyFees() []*PartyFeesHistory { @@ -2384,7 +2613,7 @@ type TakerNotionalVolume struct { func (x *TakerNotionalVolume) Reset() { *x = TakerNotionalVolume{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[35] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2397,7 +2626,7 @@ func (x *TakerNotionalVolume) String() string { func (*TakerNotionalVolume) ProtoMessage() {} func (x *TakerNotionalVolume) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[35] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2410,7 +2639,7 @@ func (x *TakerNotionalVolume) ProtoReflect() protoreflect.Message { // Deprecated: Use TakerNotionalVolume.ProtoReflect.Descriptor instead. func (*TakerNotionalVolume) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{35} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{38} } func (x *TakerNotionalVolume) GetParty() string { @@ -2439,7 +2668,7 @@ type MarketToPartyTakerNotionalVolume struct { func (x *MarketToPartyTakerNotionalVolume) Reset() { *x = MarketToPartyTakerNotionalVolume{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[36] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2452,7 +2681,7 @@ func (x *MarketToPartyTakerNotionalVolume) String() string { func (*MarketToPartyTakerNotionalVolume) ProtoMessage() {} func (x *MarketToPartyTakerNotionalVolume) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[36] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2465,7 +2694,7 @@ func (x *MarketToPartyTakerNotionalVolume) ProtoReflect() protoreflect.Message { // Deprecated: Use MarketToPartyTakerNotionalVolume.ProtoReflect.Descriptor instead. func (*MarketToPartyTakerNotionalVolume) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{36} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{39} } func (x *MarketToPartyTakerNotionalVolume) GetMarket() string { @@ -2493,7 +2722,7 @@ type EpochReturnsData struct { func (x *EpochReturnsData) Reset() { *x = EpochReturnsData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[37] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2506,7 +2735,7 @@ func (x *EpochReturnsData) String() string { func (*EpochReturnsData) ProtoMessage() {} func (x *EpochReturnsData) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[37] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2519,7 +2748,7 @@ func (x *EpochReturnsData) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochReturnsData.ProtoReflect.Descriptor instead. func (*EpochReturnsData) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{37} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{40} } func (x *EpochReturnsData) GetReturns() []*ReturnsData { @@ -2541,7 +2770,7 @@ type ReturnsData struct { func (x *ReturnsData) Reset() { *x = ReturnsData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[38] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2554,7 +2783,7 @@ func (x *ReturnsData) String() string { func (*ReturnsData) ProtoMessage() {} func (x *ReturnsData) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[38] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2567,7 +2796,7 @@ func (x *ReturnsData) ProtoReflect() protoreflect.Message { // Deprecated: Use ReturnsData.ProtoReflect.Descriptor instead. func (*ReturnsData) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{38} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{41} } func (x *ReturnsData) GetParty() string { @@ -2598,7 +2827,7 @@ type TWPositionData struct { func (x *TWPositionData) Reset() { *x = TWPositionData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[39] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2611,7 +2840,7 @@ func (x *TWPositionData) String() string { func (*TWPositionData) ProtoMessage() {} func (x *TWPositionData) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[39] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2624,7 +2853,7 @@ func (x *TWPositionData) ProtoReflect() protoreflect.Message { // Deprecated: Use TWPositionData.ProtoReflect.Descriptor instead. func (*TWPositionData) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{39} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{42} } func (x *TWPositionData) GetParty() string { @@ -2669,7 +2898,7 @@ type TWNotionalData struct { func (x *TWNotionalData) Reset() { *x = TWNotionalData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[40] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2682,7 +2911,7 @@ func (x *TWNotionalData) String() string { func (*TWNotionalData) ProtoMessage() {} func (x *TWNotionalData) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[40] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2695,7 +2924,7 @@ func (x *TWNotionalData) ProtoReflect() protoreflect.Message { // Deprecated: Use TWNotionalData.ProtoReflect.Descriptor instead. func (*TWNotionalData) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{40} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{43} } func (x *TWNotionalData) GetParty() string { @@ -2738,7 +2967,7 @@ type PartyFees struct { func (x *PartyFees) Reset() { *x = PartyFees{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[41] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2751,7 +2980,7 @@ func (x *PartyFees) String() string { func (*PartyFees) ProtoMessage() {} func (x *PartyFees) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[41] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2764,7 +2993,7 @@ func (x *PartyFees) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyFees.ProtoReflect.Descriptor instead. func (*PartyFees) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{41} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{44} } func (x *PartyFees) GetParty() string { @@ -2793,7 +3022,7 @@ type PartyFeesHistory struct { func (x *PartyFeesHistory) Reset() { *x = PartyFeesHistory{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[42] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2806,7 +3035,7 @@ func (x *PartyFeesHistory) String() string { func (*PartyFeesHistory) ProtoMessage() {} func (x *PartyFeesHistory) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[42] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2819,7 +3048,7 @@ func (x *PartyFeesHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyFeesHistory.ProtoReflect.Descriptor instead. func (*PartyFeesHistory) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{42} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{45} } func (x *PartyFeesHistory) GetParty() string { @@ -2853,12 +3082,13 @@ type AssetAction struct { Erc20AssetLimitsUpdated *vega.ERC20AssetLimitsUpdated `protobuf:"bytes,10,opt,name=erc20_asset_limits_updated,json=erc20AssetLimitsUpdated,proto3" json:"erc20_asset_limits_updated,omitempty"` Erc20BridgeStopped bool `protobuf:"varint,11,opt,name=erc20_bridge_stopped,json=erc20BridgeStopped,proto3" json:"erc20_bridge_stopped,omitempty"` Erc20BridgeResumed bool `protobuf:"varint,12,opt,name=erc20_bridge_resumed,json=erc20BridgeResumed,proto3" json:"erc20_bridge_resumed,omitempty"` + ChainId string `protobuf:"bytes,13,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (x *AssetAction) Reset() { *x = AssetAction{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[43] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2871,7 +3101,7 @@ func (x *AssetAction) String() string { func (*AssetAction) ProtoMessage() {} func (x *AssetAction) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[43] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2884,7 +3114,7 @@ func (x *AssetAction) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetAction.ProtoReflect.Descriptor instead. func (*AssetAction) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{43} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{46} } func (x *AssetAction) GetId() string { @@ -2971,6 +3201,13 @@ func (x *AssetAction) GetErc20BridgeResumed() bool { return false } +func (x *AssetAction) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + type ELSShare struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2991,7 +3228,7 @@ type ELSShare struct { func (x *ELSShare) Reset() { *x = ELSShare{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[44] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3004,7 +3241,7 @@ func (x *ELSShare) String() string { func (*ELSShare) ProtoMessage() {} func (x *ELSShare) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[44] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3017,7 +3254,7 @@ func (x *ELSShare) ProtoReflect() protoreflect.Message { // Deprecated: Use ELSShare.ProtoReflect.Descriptor instead. func (*ELSShare) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{44} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{47} } func (x *ELSShare) GetPartyId() string { @@ -3080,7 +3317,7 @@ type MarketState struct { func (x *MarketState) Reset() { *x = MarketState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[45] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3093,7 +3330,7 @@ func (x *MarketState) String() string { func (*MarketState) ProtoMessage() {} func (x *MarketState) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[45] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3106,7 +3343,7 @@ func (x *MarketState) ProtoReflect() protoreflect.Message { // Deprecated: Use MarketState.ProtoReflect.Descriptor instead. func (*MarketState) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{45} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{48} } func (x *MarketState) GetId() string { @@ -3170,7 +3407,7 @@ type ExecutionState struct { func (x *ExecutionState) Reset() { *x = ExecutionState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[46] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3183,7 +3420,7 @@ func (x *ExecutionState) String() string { func (*ExecutionState) ProtoMessage() {} func (x *ExecutionState) ProtoReflect() protoreflect.Message { - mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[46] + mi := &file_vega_checkpoint_v1_checkpoint_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3196,7 +3433,7 @@ func (x *ExecutionState) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecutionState.ProtoReflect.Descriptor instead. func (*ExecutionState) Descriptor() ([]byte, []int) { - return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{46} + return file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP(), []int{49} } func (x *ExecutionState) GetData() []*MarketState { @@ -3409,7 +3646,7 @@ var file_vega_checkpoint_v1_checkpoint_proto_rawDesc = []byte{ 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, 0xf7, 0x04, 0x0a, 0x07, + 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, @@ -3421,352 +3658,413 @@ var file_vega_checkpoint_v1_checkpoint_proto_rawDesc = []byte{ 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, 0x42, 0x0a, 0x0c, 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, 0x0b, 0x62, 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, 0x2d, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, - 0x5f, 0x65, 0x74, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 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, 0x22, 0x65, 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, 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, 0xc8, 0x02, 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, 0x22, 0xf3, 0x09, 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, + 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, 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, 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, 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, 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, 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, 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, 0x22, 0x8f, 0x01, - 0x0a, 0x1b, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x70, 0x0a, - 0x1d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, + 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, 0x52, 0x1a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x91, 0x01, 0x0a, 0x1d, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x70, 0x0a, 0x1d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, - 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, - 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, - 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x52, 0x1a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, - 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x73, 0x22, 0x52, 0x0a, 0x19, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, + 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, + 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, + 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, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x77, 0x5f, 0x6e, 0x6f, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x74, 0x77, 0x4e, - 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0x52, 0x0a, 0x19, 0x50, 0x61, 0x72, 0x74, 0x79, + 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, + 0x01, 0x0a, 0x13, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, + 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, 0x6b, 0x0a, 0x1b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, + 0x5f, 0x70, 0x61, 0x69, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x17, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x50, + 0x61, 0x69, 0x64, 0x22, 0x8f, 0x01, 0x0a, 0x1b, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x69, 0x6d, + 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x70, 0x0a, 0x1d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, + 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x77, - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0a, 0x74, 0x77, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0e, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x12, 0x43, 0x0a, - 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, - 0x65, 0x73, 0x22, 0x43, 0x0a, 0x13, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x20, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x54, 0x6f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x12, 0x5b, 0x0a, 0x15, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x6e, 0x6f, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x13, 0x74, 0x61, - 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x22, 0x4d, 0x0a, 0x10, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, - 0x22, 0x3b, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x77, 0x0a, - 0x0e, 0x54, 0x57, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x77, 0x5f, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x74, 0x77, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x77, 0x0a, 0x0e, 0x54, 0x57, 0x4e, 0x6f, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1a, - 0x0a, 0x08, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x08, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x74, 0x77, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x74, 0x77, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, - 0x33, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x66, 0x65, 0x65, 0x22, 0x3a, 0x0a, 0x10, 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, - 0x73, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x1d, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x54, + 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x70, 0x0a, 0x1d, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x6e, + 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x52, 0x1a, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, + 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x73, 0x22, 0x52, 0x0a, 0x19, 0x50, 0x61, 0x72, + 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, + 0x74, 0x77, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0a, 0x74, 0x77, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0x52, 0x0a, + 0x19, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x77, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x74, 0x77, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x8c, 0x01, 0x0a, 0x19, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x41, 0x0a, + 0x0a, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, + 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x09, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, + 0x22, 0x45, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, + 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x6b, 0x65, + 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x74, 0x61, + 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x22, 0x55, 0x0a, 0x0e, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x22, 0x43, + 0x0a, 0x13, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x6f, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x12, 0x5b, 0x0a, 0x15, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x13, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x4e, + 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x4d, 0x0a, + 0x10, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x39, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x07, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x22, 0x3b, 0x0a, 0x0b, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x77, 0x0a, 0x0e, 0x54, 0x57, 0x50, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x77, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x74, 0x77, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x77, 0x0a, 0x0e, 0x54, 0x57, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6e, 0x6f, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x77, + 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0a, 0x74, 0x77, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0x33, 0x0a, 0x09, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x66, 0x65, 0x65, - 0x22, 0x8d, 0x04, 0x0a, 0x0b, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x19, 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x74, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x42, - 0x0a, 0x0f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, - 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x52, 0x0e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x44, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x12, 0x37, 0x0a, 0x0d, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x64, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x0c, 0x65, - 0x72, 0x63, 0x32, 0x30, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x5a, 0x0a, 0x1a, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, - 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x52, 0x17, 0x65, 0x72, 0x63, 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, - 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x6f, - 0x70, 0x70, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x72, 0x63, 0x32, - 0x30, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x12, 0x30, - 0x0a, 0x14, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x72, - 0x65, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x72, - 0x63, 0x32, 0x30, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x64, - 0x22, 0x99, 0x01, 0x0a, 0x08, 0x45, 0x4c, 0x53, 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x19, 0x0a, - 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x65, 0x12, 0x25, - 0x0a, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, - 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, - 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x69, - 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, - 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x76, 0x67, 0x22, 0xa9, 0x02, 0x0a, - 0x0b, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x34, 0x0a, 0x06, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x4c, 0x53, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x69, - 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, - 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x54, - 0x72, 0x61, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x10, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x12, 0x24, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x22, 0x45, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x42, - 0x35, 0x5a, 0x33, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x65, 0x65, + 0x22, 0x3a, 0x0a, 0x10, 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x66, 0x65, 0x65, 0x22, 0xa8, 0x04, 0x0a, + 0x0b, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x74, + 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, + 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x42, 0x0a, 0x0f, 0x62, 0x75, + 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x74, + 0x69, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x0e, + 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x37, + 0x0a, 0x0d, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, + 0x32, 0x30, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x0c, 0x65, 0x72, 0x63, 0x32, 0x30, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x1a, + 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, + 0x17, 0x65, 0x72, 0x63, 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x65, 0x72, 0x63, 0x32, + 0x30, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x72, 0x63, 0x32, 0x30, 0x42, 0x72, 0x69, + 0x64, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x65, 0x72, + 0x63, 0x32, 0x30, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6d, + 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x72, 0x63, 0x32, 0x30, 0x42, + 0x72, 0x69, 0x64, 0x67, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x45, 0x4c, 0x53, 0x53, + 0x68, 0x61, 0x72, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, + 0x64, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x6b, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x61, 0x76, 0x67, 0x22, 0xa9, 0x02, 0x0a, 0x0b, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x4c, 0x53, 0x53, 0x68, 0x61, 0x72, + 0x65, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x73, + 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, + 0x72, 0x61, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x61, 0x73, + 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x24, 0x0a, 0x06, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x22, + 0x45, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x33, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x42, 0x35, 0x5a, 0x33, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, + 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3781,7 +4079,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_rawDescGZIP() []byte { return file_vega_checkpoint_v1_checkpoint_proto_rawDescData } -var file_vega_checkpoint_v1_checkpoint_proto_msgTypes = make([]protoimpl.MessageInfo, 47) +var file_vega_checkpoint_v1_checkpoint_proto_msgTypes = make([]protoimpl.MessageInfo, 50) var file_vega_checkpoint_v1_checkpoint_proto_goTypes = []interface{}{ (*CheckpointState)(nil), // 0: vega.checkpoint.v1.CheckpointState (*Checkpoint)(nil), // 1: vega.checkpoint.v1.Checkpoint @@ -3813,108 +4111,119 @@ var file_vega_checkpoint_v1_checkpoint_proto_goTypes = []interface{}{ (*MultisigControl)(nil), // 27: vega.checkpoint.v1.MultisigControl (*MarketTracker)(nil), // 28: vega.checkpoint.v1.MarketTracker (*MarketActivityTracker)(nil), // 29: vega.checkpoint.v1.MarketActivityTracker - (*EpochTimeWeightPositionData)(nil), // 30: vega.checkpoint.v1.EpochTimeWeightPositionData - (*EpochTimeWeightedNotionalData)(nil), // 31: vega.checkpoint.v1.EpochTimeWeightedNotionalData - (*PartyTimeWeightedNotional)(nil), // 32: vega.checkpoint.v1.PartyTimeWeightedNotional - (*PartyTimeWeightedPosition)(nil), // 33: vega.checkpoint.v1.PartyTimeWeightedPosition - (*EpochPartyFees)(nil), // 34: vega.checkpoint.v1.EpochPartyFees - (*TakerNotionalVolume)(nil), // 35: vega.checkpoint.v1.TakerNotionalVolume - (*MarketToPartyTakerNotionalVolume)(nil), // 36: vega.checkpoint.v1.MarketToPartyTakerNotionalVolume - (*EpochReturnsData)(nil), // 37: vega.checkpoint.v1.EpochReturnsData - (*ReturnsData)(nil), // 38: vega.checkpoint.v1.ReturnsData - (*TWPositionData)(nil), // 39: vega.checkpoint.v1.TWPositionData - (*TWNotionalData)(nil), // 40: vega.checkpoint.v1.TWNotionalData - (*PartyFees)(nil), // 41: vega.checkpoint.v1.PartyFees - (*PartyFeesHistory)(nil), // 42: vega.checkpoint.v1.PartyFeesHistory - (*AssetAction)(nil), // 43: vega.checkpoint.v1.AssetAction - (*ELSShare)(nil), // 44: vega.checkpoint.v1.ELSShare - (*MarketState)(nil), // 45: vega.checkpoint.v1.MarketState - (*ExecutionState)(nil), // 46: vega.checkpoint.v1.ExecutionState - (*vega.AssetDetails)(nil), // 47: vega.AssetDetails - (*vega.NetworkParameter)(nil), // 48: vega.NetworkParameter - (*vega.Proposal)(nil), // 49: vega.Proposal - (*vega.Transfer)(nil), // 50: vega.Transfer - (vega.AccountType)(0), // 51: vega.AccountType - (*v1.Transfer)(nil), // 52: vega.events.v1.Transfer - (v1.Transfer_Status)(0), // 53: vega.events.v1.Transfer.Status - (*vega.NewTransferConfiguration)(nil), // 54: vega.NewTransferConfiguration - (*v1.ValidatorUpdate)(nil), // 55: vega.events.v1.ValidatorUpdate - (*vega.RankingScore)(nil), // 56: vega.RankingScore - (*v1.StakeLinking)(nil), // 57: vega.events.v1.StakeLinking - (*v1.ERC20MultiSigSignerEvent)(nil), // 58: vega.events.v1.ERC20MultiSigSignerEvent - (*v1.ERC20MultiSigThresholdSetEvent)(nil), // 59: vega.events.v1.ERC20MultiSigThresholdSetEvent - (*vega.BuiltinAssetDeposit)(nil), // 60: vega.BuiltinAssetDeposit - (*vega.ERC20Deposit)(nil), // 61: vega.ERC20Deposit - (*vega.ERC20AssetList)(nil), // 62: vega.ERC20AssetList - (*vega.ERC20AssetLimitsUpdated)(nil), // 63: vega.ERC20AssetLimitsUpdated - (*vega.Market)(nil), // 64: vega.Market + (*EpochPartyTakerFees)(nil), // 30: vega.checkpoint.v1.EpochPartyTakerFees + (*EpochTimeWeightPositionData)(nil), // 31: vega.checkpoint.v1.EpochTimeWeightPositionData + (*EpochTimeWeightedNotionalData)(nil), // 32: vega.checkpoint.v1.EpochTimeWeightedNotionalData + (*PartyTimeWeightedNotional)(nil), // 33: vega.checkpoint.v1.PartyTimeWeightedNotional + (*PartyTimeWeightedPosition)(nil), // 34: vega.checkpoint.v1.PartyTimeWeightedPosition + (*AssetMarketPartyTakerFees)(nil), // 35: vega.checkpoint.v1.AssetMarketPartyTakerFees + (*PartyTakerFees)(nil), // 36: vega.checkpoint.v1.PartyTakerFees + (*EpochPartyFees)(nil), // 37: vega.checkpoint.v1.EpochPartyFees + (*TakerNotionalVolume)(nil), // 38: vega.checkpoint.v1.TakerNotionalVolume + (*MarketToPartyTakerNotionalVolume)(nil), // 39: vega.checkpoint.v1.MarketToPartyTakerNotionalVolume + (*EpochReturnsData)(nil), // 40: vega.checkpoint.v1.EpochReturnsData + (*ReturnsData)(nil), // 41: vega.checkpoint.v1.ReturnsData + (*TWPositionData)(nil), // 42: vega.checkpoint.v1.TWPositionData + (*TWNotionalData)(nil), // 43: vega.checkpoint.v1.TWNotionalData + (*PartyFees)(nil), // 44: vega.checkpoint.v1.PartyFees + (*PartyFeesHistory)(nil), // 45: vega.checkpoint.v1.PartyFeesHistory + (*AssetAction)(nil), // 46: vega.checkpoint.v1.AssetAction + (*ELSShare)(nil), // 47: vega.checkpoint.v1.ELSShare + (*MarketState)(nil), // 48: vega.checkpoint.v1.MarketState + (*ExecutionState)(nil), // 49: vega.checkpoint.v1.ExecutionState + (*vega.AssetDetails)(nil), // 50: vega.AssetDetails + (*vega.NetworkParameter)(nil), // 51: vega.NetworkParameter + (*vega.Proposal)(nil), // 52: vega.Proposal + (*vega.Transfer)(nil), // 53: vega.Transfer + (vega.AccountType)(0), // 54: vega.AccountType + (*v1.Transfer)(nil), // 55: vega.events.v1.Transfer + (v1.Transfer_Status)(0), // 56: vega.events.v1.Transfer.Status + (*vega.NewTransferConfiguration)(nil), // 57: vega.NewTransferConfiguration + (*v1.ValidatorUpdate)(nil), // 58: vega.events.v1.ValidatorUpdate + (*vega.RankingScore)(nil), // 59: vega.RankingScore + (*v1.StakeLinking)(nil), // 60: vega.events.v1.StakeLinking + (*v1.ERC20MultiSigSignerEvent)(nil), // 61: vega.events.v1.ERC20MultiSigSignerEvent + (*v1.ERC20MultiSigThresholdSetEvent)(nil), // 62: vega.events.v1.ERC20MultiSigThresholdSetEvent + (*vega.BuiltinAssetDeposit)(nil), // 63: vega.BuiltinAssetDeposit + (*vega.ERC20Deposit)(nil), // 64: vega.ERC20Deposit + (*vega.ERC20AssetList)(nil), // 65: vega.ERC20AssetList + (*vega.ERC20AssetLimitsUpdated)(nil), // 66: vega.ERC20AssetLimitsUpdated + (*vega.Market)(nil), // 67: vega.Market } var file_vega_checkpoint_v1_checkpoint_proto_depIdxs = []int32{ - 47, // 0: vega.checkpoint.v1.AssetEntry.asset_details:type_name -> vega.AssetDetails + 50, // 0: vega.checkpoint.v1.AssetEntry.asset_details:type_name -> vega.AssetDetails 2, // 1: vega.checkpoint.v1.Assets.assets:type_name -> vega.checkpoint.v1.AssetEntry 2, // 2: vega.checkpoint.v1.Assets.pending_listing_assets:type_name -> vega.checkpoint.v1.AssetEntry 4, // 3: vega.checkpoint.v1.Collateral.balances:type_name -> vega.checkpoint.v1.AssetBalance - 48, // 4: vega.checkpoint.v1.NetParams.params:type_name -> vega.NetworkParameter - 49, // 5: vega.checkpoint.v1.Proposals.proposals:type_name -> vega.Proposal + 51, // 4: vega.checkpoint.v1.NetParams.params:type_name -> vega.NetworkParameter + 52, // 5: vega.checkpoint.v1.Proposals.proposals:type_name -> vega.Proposal 8, // 6: vega.checkpoint.v1.Delegate.active:type_name -> vega.checkpoint.v1.DelegateEntry 8, // 7: vega.checkpoint.v1.Delegate.pending:type_name -> vega.checkpoint.v1.DelegateEntry 12, // 8: vega.checkpoint.v1.Rewards.rewards:type_name -> vega.checkpoint.v1.RewardPayout 13, // 9: vega.checkpoint.v1.RewardPayout.rewards_payout:type_name -> vega.checkpoint.v1.PendingRewardPayout 14, // 10: vega.checkpoint.v1.PendingRewardPayout.party_amount:type_name -> vega.checkpoint.v1.PartyAmount - 50, // 11: vega.checkpoint.v1.ScheduledTransfer.transfer:type_name -> vega.Transfer - 51, // 12: vega.checkpoint.v1.ScheduledTransfer.account_type:type_name -> vega.AccountType - 52, // 13: vega.checkpoint.v1.ScheduledTransfer.oneoff_transfer:type_name -> vega.events.v1.Transfer + 53, // 11: vega.checkpoint.v1.ScheduledTransfer.transfer:type_name -> vega.Transfer + 54, // 12: vega.checkpoint.v1.ScheduledTransfer.account_type:type_name -> vega.AccountType + 55, // 13: vega.checkpoint.v1.ScheduledTransfer.oneoff_transfer:type_name -> vega.events.v1.Transfer 17, // 14: vega.checkpoint.v1.ScheduledTransferAtTime.transfers:type_name -> vega.checkpoint.v1.ScheduledTransfer - 52, // 15: vega.checkpoint.v1.RecurringTransfers.recurring_transfers:type_name -> vega.events.v1.Transfer - 53, // 16: vega.checkpoint.v1.GovernanceTransfer.status:type_name -> vega.events.v1.Transfer.Status - 54, // 17: vega.checkpoint.v1.GovernanceTransfer.config:type_name -> vega.NewTransferConfiguration + 55, // 15: vega.checkpoint.v1.RecurringTransfers.recurring_transfers:type_name -> vega.events.v1.Transfer + 56, // 16: vega.checkpoint.v1.GovernanceTransfer.status:type_name -> vega.events.v1.Transfer.Status + 57, // 17: vega.checkpoint.v1.GovernanceTransfer.config:type_name -> vega.NewTransferConfiguration 20, // 18: vega.checkpoint.v1.ScheduledGovernanceTransferAtTime.transfers:type_name -> vega.checkpoint.v1.GovernanceTransfer 18, // 19: vega.checkpoint.v1.Banking.transfers_at_time:type_name -> vega.checkpoint.v1.ScheduledTransferAtTime 19, // 20: vega.checkpoint.v1.Banking.recurring_transfers:type_name -> vega.checkpoint.v1.RecurringTransfers - 23, // 21: vega.checkpoint.v1.Banking.bridge_state:type_name -> vega.checkpoint.v1.BridgeState - 43, // 22: vega.checkpoint.v1.Banking.asset_actions:type_name -> vega.checkpoint.v1.AssetAction + 23, // 21: vega.checkpoint.v1.Banking.primary_bridge_state:type_name -> vega.checkpoint.v1.BridgeState + 46, // 22: vega.checkpoint.v1.Banking.asset_actions:type_name -> vega.checkpoint.v1.AssetAction 21, // 23: vega.checkpoint.v1.Banking.governance_transfers_at_time:type_name -> vega.checkpoint.v1.ScheduledGovernanceTransferAtTime 20, // 24: vega.checkpoint.v1.Banking.recurring_governance_transfers:type_name -> vega.checkpoint.v1.GovernanceTransfer - 25, // 25: vega.checkpoint.v1.Validators.validator_state:type_name -> vega.checkpoint.v1.ValidatorState - 15, // 26: vega.checkpoint.v1.Validators.pending_key_rotations:type_name -> vega.checkpoint.v1.PendingKeyRotation - 16, // 27: vega.checkpoint.v1.Validators.pending_ethereum_key_rotations:type_name -> vega.checkpoint.v1.PendingEthereumKeyRotation - 55, // 28: vega.checkpoint.v1.ValidatorState.validator_update:type_name -> vega.events.v1.ValidatorUpdate - 56, // 29: vega.checkpoint.v1.ValidatorState.ranking_score:type_name -> vega.RankingScore - 57, // 30: vega.checkpoint.v1.Staking.accepted:type_name -> vega.events.v1.StakeLinking - 58, // 31: vega.checkpoint.v1.MultisigControl.signers:type_name -> vega.events.v1.ERC20MultiSigSignerEvent - 59, // 32: vega.checkpoint.v1.MultisigControl.threshold_set:type_name -> vega.events.v1.ERC20MultiSigThresholdSetEvent - 29, // 33: vega.checkpoint.v1.MarketTracker.market_activity:type_name -> vega.checkpoint.v1.MarketActivityTracker - 35, // 34: vega.checkpoint.v1.MarketTracker.taker_notional_volume:type_name -> vega.checkpoint.v1.TakerNotionalVolume - 36, // 35: vega.checkpoint.v1.MarketTracker.market_to_party_taker_notional_volume:type_name -> vega.checkpoint.v1.MarketToPartyTakerNotionalVolume - 41, // 36: vega.checkpoint.v1.MarketActivityTracker.maker_fees_received:type_name -> vega.checkpoint.v1.PartyFees - 41, // 37: vega.checkpoint.v1.MarketActivityTracker.maker_fees_paid:type_name -> vega.checkpoint.v1.PartyFees - 41, // 38: vega.checkpoint.v1.MarketActivityTracker.lp_fees:type_name -> vega.checkpoint.v1.PartyFees - 39, // 39: vega.checkpoint.v1.MarketActivityTracker.time_weighted_position:type_name -> vega.checkpoint.v1.TWPositionData - 40, // 40: vega.checkpoint.v1.MarketActivityTracker.time_weighted_notional:type_name -> vega.checkpoint.v1.TWNotionalData - 38, // 41: vega.checkpoint.v1.MarketActivityTracker.returns_data:type_name -> vega.checkpoint.v1.ReturnsData - 34, // 42: vega.checkpoint.v1.MarketActivityTracker.maker_fees_received_history:type_name -> vega.checkpoint.v1.EpochPartyFees - 34, // 43: vega.checkpoint.v1.MarketActivityTracker.maker_fees_paid_history:type_name -> vega.checkpoint.v1.EpochPartyFees - 34, // 44: vega.checkpoint.v1.MarketActivityTracker.lp_fees_history:type_name -> vega.checkpoint.v1.EpochPartyFees - 30, // 45: vega.checkpoint.v1.MarketActivityTracker.time_weighted_position_data_history:type_name -> vega.checkpoint.v1.EpochTimeWeightPositionData - 31, // 46: vega.checkpoint.v1.MarketActivityTracker.time_weighted_notional_data_history:type_name -> vega.checkpoint.v1.EpochTimeWeightedNotionalData - 37, // 47: vega.checkpoint.v1.MarketActivityTracker.returns_data_history:type_name -> vega.checkpoint.v1.EpochReturnsData - 33, // 48: vega.checkpoint.v1.EpochTimeWeightPositionData.party_time_weighted_positions:type_name -> vega.checkpoint.v1.PartyTimeWeightedPosition - 32, // 49: vega.checkpoint.v1.EpochTimeWeightedNotionalData.party_time_weighted_notionals:type_name -> vega.checkpoint.v1.PartyTimeWeightedNotional - 42, // 50: vega.checkpoint.v1.EpochPartyFees.party_fees:type_name -> vega.checkpoint.v1.PartyFeesHistory - 35, // 51: vega.checkpoint.v1.MarketToPartyTakerNotionalVolume.taker_notional_volume:type_name -> vega.checkpoint.v1.TakerNotionalVolume - 38, // 52: vega.checkpoint.v1.EpochReturnsData.returns:type_name -> vega.checkpoint.v1.ReturnsData - 60, // 53: vega.checkpoint.v1.AssetAction.builtin_deposit:type_name -> vega.BuiltinAssetDeposit - 61, // 54: vega.checkpoint.v1.AssetAction.erc20_deposit:type_name -> vega.ERC20Deposit - 62, // 55: vega.checkpoint.v1.AssetAction.asset_list:type_name -> vega.ERC20AssetList - 63, // 56: vega.checkpoint.v1.AssetAction.erc20_asset_limits_updated:type_name -> vega.ERC20AssetLimitsUpdated - 44, // 57: vega.checkpoint.v1.MarketState.shares:type_name -> vega.checkpoint.v1.ELSShare - 64, // 58: vega.checkpoint.v1.MarketState.market:type_name -> vega.Market - 45, // 59: vega.checkpoint.v1.ExecutionState.data:type_name -> vega.checkpoint.v1.MarketState - 60, // [60:60] is the sub-list for method output_type - 60, // [60:60] is the sub-list for method input_type - 60, // [60:60] is the sub-list for extension type_name - 60, // [60:60] is the sub-list for extension extendee - 0, // [0:60] is the sub-list for field type_name + 23, // 25: vega.checkpoint.v1.Banking.secondary_bridge_state:type_name -> vega.checkpoint.v1.BridgeState + 25, // 26: vega.checkpoint.v1.Validators.validator_state:type_name -> vega.checkpoint.v1.ValidatorState + 15, // 27: vega.checkpoint.v1.Validators.pending_key_rotations:type_name -> vega.checkpoint.v1.PendingKeyRotation + 16, // 28: vega.checkpoint.v1.Validators.pending_ethereum_key_rotations:type_name -> vega.checkpoint.v1.PendingEthereumKeyRotation + 58, // 29: vega.checkpoint.v1.ValidatorState.validator_update:type_name -> vega.events.v1.ValidatorUpdate + 59, // 30: vega.checkpoint.v1.ValidatorState.ranking_score:type_name -> vega.RankingScore + 60, // 31: vega.checkpoint.v1.Staking.accepted:type_name -> vega.events.v1.StakeLinking + 61, // 32: vega.checkpoint.v1.MultisigControl.signers:type_name -> vega.events.v1.ERC20MultiSigSignerEvent + 62, // 33: vega.checkpoint.v1.MultisigControl.threshold_set:type_name -> vega.events.v1.ERC20MultiSigThresholdSetEvent + 29, // 34: vega.checkpoint.v1.MarketTracker.market_activity:type_name -> vega.checkpoint.v1.MarketActivityTracker + 38, // 35: vega.checkpoint.v1.MarketTracker.taker_notional_volume:type_name -> vega.checkpoint.v1.TakerNotionalVolume + 39, // 36: vega.checkpoint.v1.MarketTracker.market_to_party_taker_notional_volume:type_name -> vega.checkpoint.v1.MarketToPartyTakerNotionalVolume + 30, // 37: vega.checkpoint.v1.MarketTracker.epoch_taker_fees:type_name -> vega.checkpoint.v1.EpochPartyTakerFees + 44, // 38: vega.checkpoint.v1.MarketActivityTracker.maker_fees_received:type_name -> vega.checkpoint.v1.PartyFees + 44, // 39: vega.checkpoint.v1.MarketActivityTracker.maker_fees_paid:type_name -> vega.checkpoint.v1.PartyFees + 44, // 40: vega.checkpoint.v1.MarketActivityTracker.lp_fees:type_name -> vega.checkpoint.v1.PartyFees + 42, // 41: vega.checkpoint.v1.MarketActivityTracker.time_weighted_position:type_name -> vega.checkpoint.v1.TWPositionData + 43, // 42: vega.checkpoint.v1.MarketActivityTracker.time_weighted_notional:type_name -> vega.checkpoint.v1.TWNotionalData + 41, // 43: vega.checkpoint.v1.MarketActivityTracker.returns_data:type_name -> vega.checkpoint.v1.ReturnsData + 37, // 44: vega.checkpoint.v1.MarketActivityTracker.maker_fees_received_history:type_name -> vega.checkpoint.v1.EpochPartyFees + 37, // 45: vega.checkpoint.v1.MarketActivityTracker.maker_fees_paid_history:type_name -> vega.checkpoint.v1.EpochPartyFees + 37, // 46: vega.checkpoint.v1.MarketActivityTracker.lp_fees_history:type_name -> vega.checkpoint.v1.EpochPartyFees + 31, // 47: vega.checkpoint.v1.MarketActivityTracker.time_weighted_position_data_history:type_name -> vega.checkpoint.v1.EpochTimeWeightPositionData + 32, // 48: vega.checkpoint.v1.MarketActivityTracker.time_weighted_notional_data_history:type_name -> vega.checkpoint.v1.EpochTimeWeightedNotionalData + 40, // 49: vega.checkpoint.v1.MarketActivityTracker.returns_data_history:type_name -> vega.checkpoint.v1.EpochReturnsData + 44, // 50: vega.checkpoint.v1.MarketActivityTracker.infra_fees:type_name -> vega.checkpoint.v1.PartyFees + 44, // 51: vega.checkpoint.v1.MarketActivityTracker.lp_paid_fees:type_name -> vega.checkpoint.v1.PartyFees + 41, // 52: vega.checkpoint.v1.MarketActivityTracker.realised_returns:type_name -> vega.checkpoint.v1.ReturnsData + 40, // 53: vega.checkpoint.v1.MarketActivityTracker.realised_returns_history:type_name -> vega.checkpoint.v1.EpochReturnsData + 35, // 54: vega.checkpoint.v1.EpochPartyTakerFees.epoch_party_taker_fees_paid:type_name -> vega.checkpoint.v1.AssetMarketPartyTakerFees + 34, // 55: vega.checkpoint.v1.EpochTimeWeightPositionData.party_time_weighted_positions:type_name -> vega.checkpoint.v1.PartyTimeWeightedPosition + 33, // 56: vega.checkpoint.v1.EpochTimeWeightedNotionalData.party_time_weighted_notionals:type_name -> vega.checkpoint.v1.PartyTimeWeightedNotional + 36, // 57: vega.checkpoint.v1.AssetMarketPartyTakerFees.taker_fees:type_name -> vega.checkpoint.v1.PartyTakerFees + 45, // 58: vega.checkpoint.v1.EpochPartyFees.party_fees:type_name -> vega.checkpoint.v1.PartyFeesHistory + 38, // 59: vega.checkpoint.v1.MarketToPartyTakerNotionalVolume.taker_notional_volume:type_name -> vega.checkpoint.v1.TakerNotionalVolume + 41, // 60: vega.checkpoint.v1.EpochReturnsData.returns:type_name -> vega.checkpoint.v1.ReturnsData + 63, // 61: vega.checkpoint.v1.AssetAction.builtin_deposit:type_name -> vega.BuiltinAssetDeposit + 64, // 62: vega.checkpoint.v1.AssetAction.erc20_deposit:type_name -> vega.ERC20Deposit + 65, // 63: vega.checkpoint.v1.AssetAction.asset_list:type_name -> vega.ERC20AssetList + 66, // 64: vega.checkpoint.v1.AssetAction.erc20_asset_limits_updated:type_name -> vega.ERC20AssetLimitsUpdated + 47, // 65: vega.checkpoint.v1.MarketState.shares:type_name -> vega.checkpoint.v1.ELSShare + 67, // 66: vega.checkpoint.v1.MarketState.market:type_name -> vega.Market + 48, // 67: vega.checkpoint.v1.ExecutionState.data:type_name -> vega.checkpoint.v1.MarketState + 68, // [68:68] is the sub-list for method output_type + 68, // [68:68] is the sub-list for method input_type + 68, // [68:68] is the sub-list for extension type_name + 68, // [68:68] is the sub-list for extension extendee + 0, // [0:68] is the sub-list for field type_name } func init() { file_vega_checkpoint_v1_checkpoint_proto_init() } @@ -4284,7 +4593,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EpochTimeWeightPositionData); i { + switch v := v.(*EpochPartyTakerFees); i { case 0: return &v.state case 1: @@ -4296,7 +4605,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EpochTimeWeightedNotionalData); i { + switch v := v.(*EpochTimeWeightPositionData); i { case 0: return &v.state case 1: @@ -4308,7 +4617,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyTimeWeightedNotional); i { + switch v := v.(*EpochTimeWeightedNotionalData); i { case 0: return &v.state case 1: @@ -4320,7 +4629,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyTimeWeightedPosition); i { + switch v := v.(*PartyTimeWeightedNotional); i { case 0: return &v.state case 1: @@ -4332,7 +4641,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EpochPartyFees); i { + switch v := v.(*PartyTimeWeightedPosition); i { case 0: return &v.state case 1: @@ -4344,7 +4653,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TakerNotionalVolume); i { + switch v := v.(*AssetMarketPartyTakerFees); i { case 0: return &v.state case 1: @@ -4356,7 +4665,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketToPartyTakerNotionalVolume); i { + switch v := v.(*PartyTakerFees); i { case 0: return &v.state case 1: @@ -4368,7 +4677,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EpochReturnsData); i { + switch v := v.(*EpochPartyFees); i { case 0: return &v.state case 1: @@ -4380,7 +4689,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReturnsData); i { + switch v := v.(*TakerNotionalVolume); i { case 0: return &v.state case 1: @@ -4392,7 +4701,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TWPositionData); i { + switch v := v.(*MarketToPartyTakerNotionalVolume); i { case 0: return &v.state case 1: @@ -4404,7 +4713,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TWNotionalData); i { + switch v := v.(*EpochReturnsData); i { case 0: return &v.state case 1: @@ -4416,7 +4725,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyFees); i { + switch v := v.(*ReturnsData); i { case 0: return &v.state case 1: @@ -4428,7 +4737,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyFeesHistory); i { + switch v := v.(*TWPositionData); i { case 0: return &v.state case 1: @@ -4440,7 +4749,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssetAction); i { + switch v := v.(*TWNotionalData); i { case 0: return &v.state case 1: @@ -4452,7 +4761,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ELSShare); i { + switch v := v.(*PartyFees); i { case 0: return &v.state case 1: @@ -4464,7 +4773,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketState); i { + switch v := v.(*PartyFeesHistory); i { case 0: return &v.state case 1: @@ -4476,6 +4785,42 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { } } file_vega_checkpoint_v1_checkpoint_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AssetAction); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_checkpoint_v1_checkpoint_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ELSShare); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_checkpoint_v1_checkpoint_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MarketState); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_checkpoint_v1_checkpoint_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExecutionState); i { case 0: return &v.state @@ -4494,7 +4839,7 @@ func file_vega_checkpoint_v1_checkpoint_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vega_checkpoint_v1_checkpoint_proto_rawDesc, NumEnums: 0, - NumMessages: 47, + NumMessages: 50, NumExtensions: 0, NumServices: 0, }, diff --git a/protos/vega/commands/v1/command.go b/protos/vega/commands/v1/command.go new file mode 100644 index 0000000000..8f5f62430f --- /dev/null +++ b/protos/vega/commands/v1/command.go @@ -0,0 +1,5 @@ +package v1 + +func (NodeSignatureKind) GetEnums() map[int32]string { + return NodeSignatureKind_name +} diff --git a/protos/vega/commands/v1/commands.pb.go b/protos/vega/commands/v1/commands.pb.go index 8da7c7fd3e..70e8011c90 100644 --- a/protos/vega/commands/v1/commands.pb.go +++ b/protos/vega/commands/v1/commands.pb.go @@ -1928,6 +1928,8 @@ type IssueSignatures struct { Kind NodeSignatureKind `protobuf:"varint,2,opt,name=kind,proto3,enum=vega.commands.v1.NodeSignatureKind" json:"kind,omitempty"` // Node ID of the validator node that will be signed in or out of the smart contract. ValidatorNodeId string `protobuf:"bytes,3,opt,name=validator_node_id,json=validatorNodeId,proto3" json:"validator_node_id,omitempty"` + // Chain ID of the bridge to generate signatures for. + ChainId string `protobuf:"bytes,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (x *IssueSignatures) Reset() { @@ -1983,6 +1985,13 @@ func (x *IssueSignatures) GetValidatorNodeId() string { return "" } +func (x *IssueSignatures) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + // Command that a party can use to instruct the network to create a new referral set on the network. // The submitter of this command will become the referrer of the new set and cannot be the referrer or a referee of another set. // A referrer can use the referral set ID as a referral code to attract others to the Vega network and have fees reduced for the referral set. @@ -2752,7 +2761,7 @@ var file_vega_commands_v1_commands_proto_rawDesc = []byte{ 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, 0x94, 0x01, + 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, @@ -2762,61 +2771,63 @@ var file_vega_commands_v1_commands_proto_rawDesc = []byte{ 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, 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, 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, + 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, + 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, } var ( diff --git a/protos/vega/errors.go b/protos/vega/errors.go index 4cfb7e6c2d..3e3294d0a7 100644 --- a/protos/vega/errors.go +++ b/protos/vega/errors.go @@ -120,6 +120,12 @@ func (err OrderError) Error() string { return "OrderError: post only order would trade" case OrderError_ORDER_ERROR_REDUCE_ONLY_ORDER_WOULD_NOT_REDUCE_POSITION: return "OrderError: reduce only order would not reduce position" + case OrderError_ORDER_ERROR_ISOLATED_MARGIN_CHECK_FAILED: + return "OrderError: isolated margin check failed" + case OrderError_ORDER_ERROR_PEGGED_ORDERS_NOT_ALLOWED_IN_ISOLATED_MARGIN_MODE: + 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" default: return "invalid OrderError" } diff --git a/protos/vega/events/v1/events.go b/protos/vega/events/v1/events.go index 525ab07c7d..467080cdcf 100644 --- a/protos/vega/events/v1/events.go +++ b/protos/vega/events/v1/events.go @@ -12,3 +12,23 @@ func (RecurringGovernanceTransfer) IsTransferKind() {} func (OneOffGovernanceTransfer) IsGovernanceTransferKind() {} func (RecurringGovernanceTransfer) IsGovernanceTransferKind() {} + +func (FundingPeriodDataPoint_Source) GetEnums() map[int32]string { + return FundingPeriodDataPoint_Source_name +} + +func (ProtocolUpgradeProposalStatus) GetEnums() map[int32]string { + return ProtocolUpgradeProposalStatus_name +} + +func (StakeLinking_Status) GetEnums() map[int32]string { + return StakeLinking_Status_name +} + +func (StakeLinking_Type) GetEnums() map[int32]string { + return StakeLinking_Type_name +} + +func (Transfer_Status) GetEnums() map[int32]string { + return Transfer_Status_name +} diff --git a/protos/vega/events/v1/events.pb.go b/protos/vega/events/v1/events.pb.go index 24e7886341..6481d218ee 100644 --- a/protos/vega/events/v1/events.pb.go +++ b/protos/vega/events/v1/events.pb.go @@ -262,6 +262,8 @@ const ( BusEventType_BUS_EVENT_TYPE_TEAMS_STATS_UPDATED BusEventType = 87 // Event indicating time weighted notional position has been updated. 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 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 @@ -360,6 +362,7 @@ var ( 86: "BUS_EVENT_TYPE_PARTY_PROFILE_UPDATED", 87: "BUS_EVENT_TYPE_TEAMS_STATS_UPDATED", 88: "BUS_EVENT_TYPE_TIME_WEIGHTED_NOTIONAL_POSITION_UPDATED", + 89: "BUS_EVENT_TYPE_CANCELLED_ORDERS", 101: "BUS_EVENT_TYPE_MARKET", 201: "BUS_EVENT_TYPE_TX_ERROR", } @@ -453,6 +456,7 @@ var ( "BUS_EVENT_TYPE_PARTY_PROFILE_UPDATED": 86, "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_MARKET": 101, "BUS_EVENT_TYPE_TX_ERROR": 201, } @@ -2187,6 +2191,8 @@ type ERC20MultiSigSignerAdded struct { Nonce string `protobuf:"bytes,6,opt,name=nonce,proto3" json:"nonce,omitempty"` // Epoch that the node was added for EpochSeq string `protobuf:"bytes,7,opt,name=epoch_seq,json=epochSeq,proto3" json:"epoch_seq,omitempty"` + // EVM chain ID that the multisig control contract lives on. + ChainId string `protobuf:"bytes,8,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (x *ERC20MultiSigSignerAdded) Reset() { @@ -2270,6 +2276,13 @@ func (x *ERC20MultiSigSignerAdded) GetEpochSeq() string { return "" } +func (x *ERC20MultiSigSignerAdded) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + type ERC20MultiSigSignerRemovedSubmitter struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2346,6 +2359,8 @@ type ERC20MultiSigSignerRemoved struct { Nonce string `protobuf:"bytes,5,opt,name=nonce,proto3" json:"nonce,omitempty"` // Epoch that the node was removed for EpochSeq string `protobuf:"bytes,6,opt,name=epoch_seq,json=epochSeq,proto3" json:"epoch_seq,omitempty"` + // EVM chain ID that the multisig control contract lives on. + ChainId string `protobuf:"bytes,8,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (x *ERC20MultiSigSignerRemoved) Reset() { @@ -2422,6 +2437,13 @@ func (x *ERC20MultiSigSignerRemoved) GetEpochSeq() string { return "" } +func (x *ERC20MultiSigSignerRemoved) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + type Transfer struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3019,6 +3041,7 @@ type ERC20MultiSigSignerEvent struct { TxHash string `protobuf:"bytes,6,opt,name=tx_hash,json=txHash,proto3" json:"tx_hash,omitempty"` LogIndex uint64 `protobuf:"varint,7,opt,name=log_index,json=logIndex,proto3" json:"log_index,omitempty"` BlockNumber uint64 `protobuf:"varint,8,opt,name=block_number,json=blockNumber,proto3" json:"block_number,omitempty"` + ChainId string `protobuf:"bytes,9,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (x *ERC20MultiSigSignerEvent) Reset() { @@ -3109,6 +3132,13 @@ func (x *ERC20MultiSigSignerEvent) GetBlockNumber() uint64 { return 0 } +func (x *ERC20MultiSigSignerEvent) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + type ERC20MultiSigThresholdSetEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3121,6 +3151,7 @@ type ERC20MultiSigThresholdSetEvent struct { TxHash string `protobuf:"bytes,5,opt,name=tx_hash,json=txHash,proto3" json:"tx_hash,omitempty"` LogIndex uint64 `protobuf:"varint,6,opt,name=log_index,json=logIndex,proto3" json:"log_index,omitempty"` BlockNumber uint64 `protobuf:"varint,7,opt,name=block_number,json=blockNumber,proto3" json:"block_number,omitempty"` + ChainId string `protobuf:"bytes,8,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (x *ERC20MultiSigThresholdSetEvent) Reset() { @@ -3204,6 +3235,13 @@ func (x *ERC20MultiSigThresholdSetEvent) GetBlockNumber() uint64 { return 0 } +func (x *ERC20MultiSigThresholdSetEvent) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + type CheckpointEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3851,8 +3889,8 @@ type TransactionResult struct { // *TransactionResult_BatchMarketInstructions // *TransactionResult_KeyRotateSubmission // *TransactionResult_EthereumKeyRotateSubmission - // *TransactionResult_StopOrderSubmission - // *TransactionResult_StopOrderCancellation + // *TransactionResult_StopOrdersSubmission + // *TransactionResult_StopOrdersCancellation // *TransactionResult_CreateReferralSet // *TransactionResult_UpdateReferralSet // *TransactionResult_ApplyReferralCode @@ -4070,16 +4108,16 @@ func (x *TransactionResult) GetEthereumKeyRotateSubmission() *v1.EthereumKeyRota return nil } -func (x *TransactionResult) GetStopOrderSubmission() *v1.StopOrdersSubmission { - if x, ok := x.GetTransaction().(*TransactionResult_StopOrderSubmission); ok { - return x.StopOrderSubmission +func (x *TransactionResult) GetStopOrdersSubmission() *v1.StopOrdersSubmission { + if x, ok := x.GetTransaction().(*TransactionResult_StopOrdersSubmission); ok { + return x.StopOrdersSubmission } return nil } -func (x *TransactionResult) GetStopOrderCancellation() *v1.StopOrdersCancellation { - if x, ok := x.GetTransaction().(*TransactionResult_StopOrderCancellation); ok { - return x.StopOrderCancellation +func (x *TransactionResult) GetStopOrdersCancellation() *v1.StopOrdersCancellation { + if x, ok := x.GetTransaction().(*TransactionResult_StopOrdersCancellation); ok { + return x.StopOrdersCancellation } return nil } @@ -4238,12 +4276,12 @@ type TransactionResult_EthereumKeyRotateSubmission struct { EthereumKeyRotateSubmission *v1.EthereumKeyRotateSubmission `protobuf:"bytes,121,opt,name=ethereum_key_rotate_submission,json=ethereumKeyRotateSubmission,proto3,oneof"` } -type TransactionResult_StopOrderSubmission struct { - StopOrderSubmission *v1.StopOrdersSubmission `protobuf:"bytes,122,opt,name=stop_order_submission,json=stopOrderSubmission,proto3,oneof"` +type TransactionResult_StopOrdersSubmission struct { + StopOrdersSubmission *v1.StopOrdersSubmission `protobuf:"bytes,122,opt,name=stop_orders_submission,json=stopOrdersSubmission,proto3,oneof"` } -type TransactionResult_StopOrderCancellation struct { - StopOrderCancellation *v1.StopOrdersCancellation `protobuf:"bytes,123,opt,name=stop_order_cancellation,json=stopOrderCancellation,proto3,oneof"` +type TransactionResult_StopOrdersCancellation struct { + StopOrdersCancellation *v1.StopOrdersCancellation `protobuf:"bytes,123,opt,name=stop_orders_cancellation,json=stopOrdersCancellation,proto3,oneof"` } type TransactionResult_CreateReferralSet struct { @@ -4314,9 +4352,9 @@ func (*TransactionResult_KeyRotateSubmission) isTransactionResult_Transaction() func (*TransactionResult_EthereumKeyRotateSubmission) isTransactionResult_Transaction() {} -func (*TransactionResult_StopOrderSubmission) isTransactionResult_Transaction() {} +func (*TransactionResult_StopOrdersSubmission) isTransactionResult_Transaction() {} -func (*TransactionResult_StopOrderCancellation) isTransactionResult_Transaction() {} +func (*TransactionResult_StopOrdersCancellation) isTransactionResult_Transaction() {} func (*TransactionResult_CreateReferralSet) isTransactionResult_Transaction() {} @@ -6589,6 +6627,72 @@ func (x *ExpiredOrders) GetOrderIds() []string { return nil } +type CancelledOrders struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Market ID for the event. + MarketId string `protobuf:"bytes,1,opt,name=market_id,json=marketId,proto3" json:"market_id,omitempty"` + // The ID of the party which cancelled the orders. + PartyId string `protobuf:"bytes,2,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + // The order IDs that were cancelled. + OrderIds []string `protobuf:"bytes,3,rep,name=order_ids,json=orderIds,proto3" json:"order_ids,omitempty"` +} + +func (x *CancelledOrders) Reset() { + *x = CancelledOrders{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_events_v1_events_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CancelledOrders) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CancelledOrders) ProtoMessage() {} + +func (x *CancelledOrders) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CancelledOrders.ProtoReflect.Descriptor instead. +func (*CancelledOrders) Descriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{66} +} + +func (x *CancelledOrders) GetMarketId() string { + if x != nil { + return x.MarketId + } + return "" +} + +func (x *CancelledOrders) GetPartyId() string { + if x != nil { + return x.PartyId + } + return "" +} + +func (x *CancelledOrders) GetOrderIds() []string { + if x != nil { + return x.OrderIds + } + return nil +} + type TeamCreated struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6617,7 +6721,7 @@ type TeamCreated struct { func (x *TeamCreated) Reset() { *x = TeamCreated{} 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) } @@ -6630,7 +6734,7 @@ func (x *TeamCreated) String() string { func (*TeamCreated) ProtoMessage() {} func (x *TeamCreated) 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 { @@ -6643,7 +6747,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{66} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{67} } func (x *TeamCreated) GetTeamId() string { @@ -6731,7 +6835,7 @@ type TeamUpdated struct { func (x *TeamUpdated) Reset() { *x = TeamUpdated{} 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) } @@ -6744,7 +6848,7 @@ func (x *TeamUpdated) String() string { func (*TeamUpdated) ProtoMessage() {} func (x *TeamUpdated) 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 { @@ -6757,7 +6861,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{67} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{68} } func (x *TeamUpdated) GetTeamId() string { @@ -6823,7 +6927,7 @@ type RefereeSwitchedTeam struct { func (x *RefereeSwitchedTeam) Reset() { *x = RefereeSwitchedTeam{} 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) } @@ -6836,7 +6940,7 @@ func (x *RefereeSwitchedTeam) String() string { func (*RefereeSwitchedTeam) ProtoMessage() {} func (x *RefereeSwitchedTeam) 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 { @@ -6849,7 +6953,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{68} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{69} } func (x *RefereeSwitchedTeam) GetFromTeamId() string { @@ -6905,7 +7009,7 @@ type RefereeJoinedTeam struct { func (x *RefereeJoinedTeam) Reset() { *x = RefereeJoinedTeam{} 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) } @@ -6918,7 +7022,7 @@ func (x *RefereeJoinedTeam) String() string { func (*RefereeJoinedTeam) ProtoMessage() {} func (x *RefereeJoinedTeam) 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 { @@ -6931,7 +7035,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{69} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{70} } func (x *RefereeJoinedTeam) GetTeamId() string { @@ -6980,7 +7084,7 @@ type ReferralSetCreated struct { func (x *ReferralSetCreated) Reset() { *x = ReferralSetCreated{} 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) } @@ -6993,7 +7097,7 @@ func (x *ReferralSetCreated) String() string { func (*ReferralSetCreated) ProtoMessage() {} func (x *ReferralSetCreated) 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 { @@ -7006,7 +7110,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{70} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{71} } func (x *ReferralSetCreated) GetSetId() string { @@ -7066,7 +7170,7 @@ type ReferralSetStatsUpdated struct { func (x *ReferralSetStatsUpdated) Reset() { *x = ReferralSetStatsUpdated{} 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) } @@ -7079,7 +7183,7 @@ func (x *ReferralSetStatsUpdated) String() string { func (*ReferralSetStatsUpdated) ProtoMessage() {} func (x *ReferralSetStatsUpdated) 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 { @@ -7092,7 +7196,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{71} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{72} } func (x *ReferralSetStatsUpdated) GetSetId() string { @@ -7174,7 +7278,7 @@ type RefereeStats struct { func (x *RefereeStats) Reset() { *x = RefereeStats{} 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) } @@ -7187,7 +7291,7 @@ func (x *RefereeStats) String() string { func (*RefereeStats) ProtoMessage() {} func (x *RefereeStats) 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 { @@ -7200,7 +7304,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{72} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{73} } func (x *RefereeStats) GetPartyId() string { @@ -7242,7 +7346,7 @@ type RefereeJoinedReferralSet struct { func (x *RefereeJoinedReferralSet) Reset() { *x = RefereeJoinedReferralSet{} 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) } @@ -7255,7 +7359,7 @@ func (x *RefereeJoinedReferralSet) String() string { func (*RefereeJoinedReferralSet) ProtoMessage() {} func (x *RefereeJoinedReferralSet) 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 { @@ -7268,7 +7372,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{73} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{74} } func (x *RefereeJoinedReferralSet) GetSetId() string { @@ -7315,7 +7419,7 @@ type ReferralProgramStarted struct { func (x *ReferralProgramStarted) Reset() { *x = ReferralProgramStarted{} 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) } @@ -7328,7 +7432,7 @@ func (x *ReferralProgramStarted) String() string { func (*ReferralProgramStarted) ProtoMessage() {} func (x *ReferralProgramStarted) 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 { @@ -7341,7 +7445,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{74} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{75} } func (x *ReferralProgramStarted) GetProgram() *vega.ReferralProgram { @@ -7381,7 +7485,7 @@ type ReferralProgramUpdated struct { func (x *ReferralProgramUpdated) Reset() { *x = ReferralProgramUpdated{} 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) } @@ -7394,7 +7498,7 @@ func (x *ReferralProgramUpdated) String() string { func (*ReferralProgramUpdated) ProtoMessage() {} func (x *ReferralProgramUpdated) 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 { @@ -7407,7 +7511,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{75} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{76} } func (x *ReferralProgramUpdated) GetProgram() *vega.ReferralProgram { @@ -7449,7 +7553,7 @@ type ReferralProgramEnded struct { func (x *ReferralProgramEnded) Reset() { *x = ReferralProgramEnded{} 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) } @@ -7462,7 +7566,7 @@ func (x *ReferralProgramEnded) String() string { func (*ReferralProgramEnded) ProtoMessage() {} func (x *ReferralProgramEnded) 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 { @@ -7475,7 +7579,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{76} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{77} } func (x *ReferralProgramEnded) GetVersion() uint64 { @@ -7522,7 +7626,7 @@ type VolumeDiscountProgramStarted struct { func (x *VolumeDiscountProgramStarted) Reset() { *x = VolumeDiscountProgramStarted{} 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) } @@ -7535,7 +7639,7 @@ func (x *VolumeDiscountProgramStarted) String() string { func (*VolumeDiscountProgramStarted) ProtoMessage() {} func (x *VolumeDiscountProgramStarted) 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 { @@ -7548,7 +7652,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{77} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{78} } func (x *VolumeDiscountProgramStarted) GetProgram() *vega.VolumeDiscountProgram { @@ -7588,7 +7692,7 @@ type VolumeDiscountProgramUpdated struct { func (x *VolumeDiscountProgramUpdated) Reset() { *x = VolumeDiscountProgramUpdated{} 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) } @@ -7601,7 +7705,7 @@ func (x *VolumeDiscountProgramUpdated) String() string { func (*VolumeDiscountProgramUpdated) ProtoMessage() {} func (x *VolumeDiscountProgramUpdated) 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 { @@ -7614,7 +7718,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{78} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{79} } func (x *VolumeDiscountProgramUpdated) GetProgram() *vega.VolumeDiscountProgram { @@ -7656,7 +7760,7 @@ type VolumeDiscountProgramEnded struct { func (x *VolumeDiscountProgramEnded) Reset() { *x = VolumeDiscountProgramEnded{} 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) } @@ -7669,7 +7773,7 @@ func (x *VolumeDiscountProgramEnded) String() string { func (*VolumeDiscountProgramEnded) ProtoMessage() {} func (x *VolumeDiscountProgramEnded) 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 { @@ -7682,7 +7786,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{79} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{80} } func (x *VolumeDiscountProgramEnded) GetVersion() uint64 { @@ -7733,7 +7837,7 @@ type PaidLiquidityFeesStats struct { func (x *PaidLiquidityFeesStats) Reset() { *x = PaidLiquidityFeesStats{} 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) } @@ -7746,7 +7850,7 @@ func (x *PaidLiquidityFeesStats) String() string { func (*PaidLiquidityFeesStats) ProtoMessage() {} func (x *PaidLiquidityFeesStats) 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 { @@ -7759,7 +7863,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{80} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{81} } func (x *PaidLiquidityFeesStats) GetMarket() string { @@ -7821,7 +7925,7 @@ type PartyMarginModeUpdated struct { func (x *PartyMarginModeUpdated) Reset() { *x = PartyMarginModeUpdated{} 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) } @@ -7834,7 +7938,7 @@ func (x *PartyMarginModeUpdated) String() string { func (*PartyMarginModeUpdated) ProtoMessage() {} func (x *PartyMarginModeUpdated) 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 { @@ -7847,7 +7951,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{81} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{82} } func (x *PartyMarginModeUpdated) GetMarketId() string { @@ -7911,7 +8015,7 @@ type PartyProfileUpdated struct { func (x *PartyProfileUpdated) Reset() { *x = PartyProfileUpdated{} 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) } @@ -7924,7 +8028,7 @@ func (x *PartyProfileUpdated) String() string { func (*PartyProfileUpdated) ProtoMessage() {} func (x *PartyProfileUpdated) 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 { @@ -7937,7 +8041,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{82} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{83} } func (x *PartyProfileUpdated) GetUpdatedProfile() *vega.PartyProfile { @@ -7962,7 +8066,7 @@ type TeamsStatsUpdated struct { func (x *TeamsStatsUpdated) Reset() { *x = TeamsStatsUpdated{} 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) } @@ -7975,7 +8079,7 @@ func (x *TeamsStatsUpdated) String() string { func (*TeamsStatsUpdated) ProtoMessage() {} func (x *TeamsStatsUpdated) 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 { @@ -7988,7 +8092,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{83} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{84} } func (x *TeamsStatsUpdated) GetAtEpoch() uint64 { @@ -8019,7 +8123,7 @@ type TeamStats struct { func (x *TeamStats) Reset() { *x = TeamStats{} 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) } @@ -8032,7 +8136,7 @@ func (x *TeamStats) String() string { func (*TeamStats) ProtoMessage() {} func (x *TeamStats) 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 { @@ -8045,7 +8149,7 @@ func (x *TeamStats) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamStats.ProtoReflect.Descriptor instead. func (*TeamStats) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{84} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{85} } func (x *TeamStats) GetTeamId() string { @@ -8076,7 +8180,7 @@ type TeamMemberStats struct { func (x *TeamMemberStats) Reset() { *x = TeamMemberStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[85] + mi := &file_vega_events_v1_events_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8089,7 +8193,7 @@ func (x *TeamMemberStats) String() string { func (*TeamMemberStats) ProtoMessage() {} func (x *TeamMemberStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[85] + mi := &file_vega_events_v1_events_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8102,7 +8206,7 @@ func (x *TeamMemberStats) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamMemberStats.ProtoReflect.Descriptor instead. func (*TeamMemberStats) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{85} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{86} } func (x *TeamMemberStats) GetPartyId() string { @@ -8218,6 +8322,7 @@ type BusEvent struct { // *BusEvent_PartyProfileUpdated // *BusEvent_TeamsStatsUpdated // *BusEvent_TimeWeightedNotionalPositionUpdated + // *BusEvent_CancelledOrders // *BusEvent_Market // *BusEvent_TxErrEvent Event isBusEvent_Event `protobuf_oneof:"event"` @@ -8230,7 +8335,7 @@ type BusEvent struct { func (x *BusEvent) Reset() { *x = BusEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[86] + mi := &file_vega_events_v1_events_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8243,7 +8348,7 @@ func (x *BusEvent) String() string { func (*BusEvent) ProtoMessage() {} func (x *BusEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[86] + mi := &file_vega_events_v1_events_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8256,7 +8361,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{86} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{87} } func (x *BusEvent) GetId() string { @@ -8882,6 +8987,13 @@ func (x *BusEvent) GetTimeWeightedNotionalPositionUpdated() *TimeWeightedNotiona return nil } +func (x *BusEvent) GetCancelledOrders() *CancelledOrders { + if x, ok := x.GetEvent().(*BusEvent_CancelledOrders); ok { + return x.CancelledOrders + } + return nil +} + func (x *BusEvent) GetMarket() *MarketEvent { if x, ok := x.GetEvent().(*BusEvent_Market); ok { return x.Market @@ -9346,6 +9458,11 @@ type BusEvent_TimeWeightedNotionalPositionUpdated struct { TimeWeightedNotionalPositionUpdated *TimeWeightedNotionalPositionUpdated `protobuf:"bytes,186,opt,name=time_weighted_notional_position_updated,json=timeWeightedNotionalPositionUpdated,proto3,oneof"` } +type BusEvent_CancelledOrders struct { + // Event notifying of multiple orders being cancelled for a given party, on a given market. + CancelledOrders *CancelledOrders `protobuf:"bytes,187,opt,name=cancelled_orders,json=cancelledOrders,proto3,oneof"` +} + type BusEvent_Market struct { // Market tick events Market *MarketEvent `protobuf:"bytes,1001,opt,name=market,proto3,oneof"` @@ -9526,6 +9643,8 @@ func (*BusEvent_TeamsStatsUpdated) isBusEvent_Event() {} func (*BusEvent_TimeWeightedNotionalPositionUpdated) isBusEvent_Event() {} +func (*BusEvent_CancelledOrders) isBusEvent_Event() {} + func (*BusEvent_Market) isBusEvent_Event() {} func (*BusEvent_TxErrEvent) isBusEvent_Event() {} @@ -9539,7 +9658,7 @@ type TransactionResult_SuccessDetails struct { func (x *TransactionResult_SuccessDetails) Reset() { *x = TransactionResult_SuccessDetails{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[87] + mi := &file_vega_events_v1_events_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9552,7 +9671,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[87] + mi := &file_vega_events_v1_events_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9580,7 +9699,7 @@ type TransactionResult_FailureDetails struct { func (x *TransactionResult_FailureDetails) Reset() { *x = TransactionResult_FailureDetails{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[88] + mi := &file_vega_events_v1_events_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9593,7 +9712,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[88] + 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 { @@ -9867,7 +9986,7 @@ var file_vega_events_v1_events_proto_rawDesc = []byte{ 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, 0xee, 0x01, 0x0a, 0x18, 0x45, 0x52, 0x43, 0x32, + 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, @@ -9882,404 +10001,411 @@ var file_vega_events_v1_events_proto_rawDesc = []byte{ 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, 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, 0x97, 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, 0x22, 0xf6, 0x06, 0x0a, 0x08, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x3d, 0x0a, 0x11, 0x66, - 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x66, 0x72, 0x6f, 0x6d, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x39, 0x0a, 0x0f, 0x74, 0x6f, - 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x18, 0x65, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x12, 0x41, - 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x66, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, - 0x67, 0x12, 0x58, 0x0a, 0x12, 0x6f, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x5f, 0x67, 0x6f, 0x76, - 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x6f, 0x6e, 0x65, 0x4f, 0x66, - 0x66, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x60, 0x0a, 0x14, 0x72, - 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, - 0x6e, 0x63, 0x65, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x75, 0x72, - 0x72, 0x69, 0x6e, 0x67, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x13, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, - 0x69, 0x6e, 0x67, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x84, 0x01, - 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, - 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, - 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x04, 0x12, 0x14, - 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, - 0x45, 0x44, 0x10, 0x05, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x67, 0x61, 0x6d, 0x65, - 0x5f, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x18, 0x4f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x47, 0x6f, 0x76, - 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, - 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x4f, 0x6e, 0x22, 0x2f, - 0x0a, 0x0e, 0x4f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x4f, 0x6e, 0x22, - 0xc1, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x08, 0x65, 0x6e, 0x64, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x63, 0x74, - 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, - 0x12, 0x43, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, - 0x65, 0x67, 0x79, 0x52, 0x10, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, - 0x67, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x01, 0x52, 0x10, 0x64, 0x69, 0x73, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, - 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x14, - 0x0a, 0x12, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x61, - 0x74, 0x65, 0x67, 0x79, 0x22, 0xb4, 0x04, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, - 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, - 0x67, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6b, - 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x66, - 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, - 0x61, 0x73, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3c, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x02, 0x22, 0x5e, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, - 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, - 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x43, 0x43, 0x45, - 0x50, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x22, 0xd3, 0x02, 0x0a, 0x18, + 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, 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, 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, 0xe3, 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, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x66, 0x0a, 0x14, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, + 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x64, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x52, 0x13, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x6c, 0x64, 0x53, 0x69, 0x67, 0x6e, + 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, + 0x22, 0xf6, 0x06, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, + 0x6d, 0x12, 0x3d, 0x0a, 0x11, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0f, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, + 0x12, 0x39, 0x0a, 0x0f, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x74, 0x6f, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, + 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, + 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x67, + 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, + 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x6e, 0x65, + 0x5f, 0x6f, 0x66, 0x66, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x6e, 0x65, 0x4f, + 0x66, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x6e, + 0x65, 0x4f, 0x66, 0x66, 0x12, 0x41, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, + 0x67, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, + 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, + 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x58, 0x0a, 0x12, 0x6f, 0x6e, 0x65, 0x5f, 0x6f, + 0x66, 0x66, 0x5f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x67, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x47, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, + 0x10, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x12, 0x60, 0x0a, 0x14, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x67, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x13, + 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, + 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, + 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, + 0x45, 0x44, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, + 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, + 0x08, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x18, 0x4f, 0x6e, 0x65, + 0x4f, 0x66, 0x66, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x5f, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x4f, 0x6e, 0x22, 0x2f, 0x0a, 0x0e, 0x4f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x5f, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x4f, 0x6e, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, + 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x09, + 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, + 0x00, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x16, + 0x0a, 0x06, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, + 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x10, 0x64, 0x69, 0x73, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, + 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x52, 0x65, + 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x6e, + 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, + 0x08, 0x65, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x11, + 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, + 0x01, 0x52, 0x10, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, + 0x68, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0xb4, 0x04, 0x0a, 0x0c, 0x53, + 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, + 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, + 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, + 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x22, 0x3c, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x01, + 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4c, 0x49, 0x4e, 0x4b, 0x10, + 0x02, 0x22, 0x5e, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x50, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, + 0x03, 0x22, 0xee, 0x02, 0x0a, 0x18, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x41, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x52, + 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x17, - 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 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, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, + 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, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 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, + 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, 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, 0xf4, 0x16, 0x0a, 0x11, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x4e, 0x0a, 0x10, 0x6f, 0x72, 0x64, 0x65, - 0x72, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x65, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x75, - 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x0f, 0x6f, 0x72, 0x64, 0x65, - 0x72, 0x5f, 0x61, 0x6d, 0x65, 0x6e, 0x64, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x41, 0x6d, 0x65, 0x6e, 0x64, 0x6d, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x41, 0x6d, 0x65, 0x6e, - 0x64, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x12, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x67, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x43, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 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, + 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, 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, 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, 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, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, - 0x4e, 0x0a, 0x10, 0x69, 0x73, 0x73, 0x75, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x18, 0x76, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x73, - 0x75, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0f, - 0x69, 0x73, 0x73, 0x75, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, - 0x67, 0x0a, 0x19, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, - 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x77, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, - 0x17, 0x62, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5b, 0x0a, 0x15, 0x6b, 0x65, 0x79, 0x5f, - 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x78, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x6f, - 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, - 0x52, 0x13, 0x6b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x74, 0x0a, 0x1e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x5f, 0x6b, 0x65, 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, + 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, 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, 0x5c, 0x0a, 0x15, 0x73, - 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 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, 0x13, 0x73, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x62, 0x0a, 0x17, 0x73, 0x74, 0x6f, - 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 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, 0x15, 0x73, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, + 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x53, + 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x57, 0x0a, 0x13, 0x64, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x6c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, + 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x15, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, + 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x6d, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, + 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x14, 0x75, 0x6e, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x7c, 0x0a, 0x20, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, + 0x1e, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x73, 0x0a, 0x1d, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6d, 0x65, 0x6e, 0x64, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x70, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x6d, 0x65, 0x6e, + 0x64, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1b, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x6d, 0x65, 0x6e, 0x64, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x4b, + 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x18, 0x72, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x61, 0x6e, + 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0d, 0x61, + 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x73, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x5e, 0x0a, 0x16, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x74, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x14, 0x6f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x67, 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, + 0x75, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x48, 0x00, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x4e, 0x0a, 0x10, 0x69, + 0x73, 0x73, 0x75, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, + 0x76, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x69, 0x73, 0x73, 0x75, + 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x67, 0x0a, 0x19, 0x62, + 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x77, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x17, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5b, 0x0a, 0x15, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, + 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 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, @@ -10668,900 +10794,914 @@ var file_vega_events_v1_events_proto_rawDesc = []byte{ 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, 0xa7, 0x02, 0x0a, 0x0b, 0x54, 0x65, - 0x61, 0x6d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, + 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, 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, 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, + 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, 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, + 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, 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, 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, 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, 0xe7, 0x36, 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, 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, + 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, - 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, + 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, 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, + 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, + 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, 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, + 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, 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, 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, + 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, 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, 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, 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, + 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, + 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, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x48, 0x00, 0x52, 0x14, 0x72, 0x65, + 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, 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, 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, + 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0xac, + 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, 0x55, 0x70, 0x64, 0x61, + 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, 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, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 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, + 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, - 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, - 0x36, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x74, 0x78, 0x5f, 0x65, 0x72, - 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0xd1, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, - 0x74, 0x78, 0x45, 0x72, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x2a, 0xdd, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, - 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x2c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, - 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2c, 0x0a, 0x28, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, - 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, - 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, - 0x47, 0x10, 0x01, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, - 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x52, 0x4f, 0x56, 0x45, 0x44, - 0x10, 0x02, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, - 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, - 0x03, 0x2a, 0x88, 0x1b, 0x0a, 0x0c, 0x42, 0x75, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, - 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x49, 0x4d, - 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x55, - 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x45, 0x44, - 0x47, 0x45, 0x52, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x10, 0x03, 0x12, - 0x26, 0x0a, 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x4c, - 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14, 0x42, 0x55, 0x53, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, - 0x05, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x06, 0x12, 0x18, 0x0a, - 0x14, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x42, 0x55, 0x53, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x45, 0x10, - 0x08, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, - 0x53, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x10, 0x0a, - 0x12, 0x17, 0x0a, 0x13, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x54, 0x45, 0x10, 0x0b, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, - 0x45, 0x54, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x0c, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, - 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x10, 0x0d, 0x12, 0x25, 0x0a, 0x21, - 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, - 0x4f, 0x53, 0x53, 0x5f, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x0e, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x5f, 0x50, 0x4f, 0x53, - 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0f, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x55, 0x53, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, - 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, 0x53, 0x53, 0x45, 0x44, 0x10, 0x10, 0x12, 0x21, 0x0a, - 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x11, - 0x12, 0x18, 0x0a, 0x14, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x10, 0x12, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, - 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, - 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x49, 0x43, 0x4b, 0x10, 0x13, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x55, - 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x54, - 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x10, 0x14, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4f, - 0x53, 0x49, 0x54, 0x10, 0x15, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, - 0x16, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x52, 0x49, 0x53, 0x4b, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x10, - 0x17, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, - 0x4d, 0x45, 0x54, 0x45, 0x52, 0x10, 0x18, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, - 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x19, 0x12, + 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, 0x36, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x41, + 0x0a, 0x0c, 0x74, 0x78, 0x5f, 0x65, 0x72, 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0xd1, + 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x78, 0x45, 0x72, 0x72, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x42, + 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2a, 0xdd, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x2c, 0x50, 0x52, + 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, + 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2c, 0x0a, 0x28, + 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, + 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, + 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, + 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, + 0x50, 0x50, 0x52, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x02, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, 0x4f, + 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, 0x52, + 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, + 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x2a, 0xad, 0x1b, 0x0a, 0x0c, 0x42, 0x75, 0x73, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x55, 0x53, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x10, + 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, + 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x4d, + 0x45, 0x4e, 0x54, 0x53, 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x18, + 0x0a, 0x14, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x53, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, + 0x4e, 0x54, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x07, 0x12, 0x18, + 0x0a, 0x14, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x54, 0x52, 0x41, 0x44, 0x45, 0x10, 0x08, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x55, 0x53, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, + 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x53, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x55, + 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, + 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x10, 0x0a, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x55, 0x53, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x54, 0x45, 0x10, 0x0b, + 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x0c, + 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, + 0x45, 0x10, 0x0d, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x53, 0x53, 0x5f, 0x53, 0x4f, 0x43, 0x49, 0x41, + 0x4c, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0e, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, + 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x54, + 0x54, 0x4c, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0f, 0x12, 0x24, + 0x0a, 0x20, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, 0x53, 0x53, + 0x45, 0x44, 0x10, 0x10, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x52, + 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x11, 0x12, 0x18, 0x0a, 0x14, 0x42, 0x55, 0x53, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x10, + 0x12, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x49, 0x43, 0x4b, 0x10, + 0x13, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x10, 0x14, + 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x10, 0x15, 0x12, 0x1a, 0x0a, 0x16, + 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, + 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x16, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x49, 0x53, 0x4b, 0x5f, + 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x17, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x55, 0x53, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, + 0x52, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x10, 0x18, 0x12, 0x26, + 0x0a, 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, + 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x19, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, + 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x1a, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x41, 0x43, + 0x4c, 0x45, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x10, 0x1b, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x41, 0x43, + 0x4c, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x1c, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, + 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x1d, + 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x43, 0x4f, + 0x52, 0x45, 0x10, 0x1e, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x50, 0x4f, 0x43, 0x48, 0x5f, 0x55, 0x50, 0x44, + 0x41, 0x54, 0x45, 0x10, 0x1f, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, + 0x52, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x20, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x55, + 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, + 0x4b, 0x45, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x21, 0x12, 0x26, 0x0a, 0x22, + 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, + 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4f, 0x55, 0x54, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x10, 0x22, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, + 0x54, 0x10, 0x23, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x53, 0x54, 0x41, + 0x52, 0x54, 0x10, 0x24, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x52, 0x4f, 0x54, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x25, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x41, + 0x52, 0x10, 0x26, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x4c, 0x49, + 0x4d, 0x49, 0x54, 0x53, 0x10, 0x27, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, + 0x52, 0x10, 0x28, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, + 0x52, 0x41, 0x4e, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x29, 0x12, 0x2f, 0x0a, 0x2b, 0x42, 0x55, 0x53, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x52, 0x43, 0x32, + 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x53, 0x49, 0x47, 0x5f, 0x53, 0x49, 0x47, 0x4e, + 0x45, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x2a, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x55, + 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x52, 0x43, + 0x32, 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x53, 0x49, 0x47, 0x5f, 0x53, 0x45, 0x54, + 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x10, 0x2b, 0x12, 0x2f, 0x0a, 0x2b, + 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, + 0x52, 0x43, 0x32, 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x53, 0x49, 0x47, 0x5f, 0x53, + 0x49, 0x47, 0x4e, 0x45, 0x52, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x2c, 0x12, 0x31, 0x0a, + 0x2d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x53, 0x49, 0x47, 0x5f, + 0x53, 0x49, 0x47, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x2d, + 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x10, 0x2e, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, 0x4d, 0x5f, 0x4b, + 0x45, 0x59, 0x5f, 0x52, 0x4f, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x2f, 0x12, 0x2c, 0x0a, + 0x28, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, + 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x10, 0x30, 0x12, 0x1e, 0x0a, 0x1a, 0x42, + 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x45, + 0x47, 0x49, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x31, 0x12, 0x1c, 0x0a, 0x18, 0x42, + 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, + 0x44, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x32, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x54, + 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, + 0x52, 0x54, 0x45, 0x44, 0x10, 0x33, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x5f, + 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x34, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, + 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x10, 0x35, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, - 0x10, 0x1a, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x41, 0x43, 0x4c, 0x45, 0x5f, 0x53, 0x50, 0x45, 0x43, - 0x10, 0x1b, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x41, 0x43, 0x4c, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, - 0x10, 0x1c, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x1d, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x43, 0x4f, 0x52, 0x45, 0x10, 0x1e, 0x12, 0x1f, 0x0a, - 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x45, 0x50, 0x4f, 0x43, 0x48, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x1f, 0x12, 0x23, - 0x0a, 0x1f, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, - 0x45, 0x10, 0x20, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x4b, 0x45, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, - 0x49, 0x4e, 0x47, 0x10, 0x21, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x50, - 0x41, 0x59, 0x4f, 0x55, 0x54, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x22, 0x12, 0x1d, 0x0a, + 0x45, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x54, 0x41, 0x4b, 0x45, 0x4e, + 0x10, 0x36, 0x12, 0x33, 0x0a, 0x2f, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, + 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, + 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x37, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, + 0x53, 0x53, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x5f, 0x43, 0x4c, 0x4f, 0x53, + 0x45, 0x44, 0x10, 0x38, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x4f, + 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x39, 0x12, 0x27, 0x0a, 0x23, 0x42, 0x55, 0x53, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, + 0x53, 0x53, 0x45, 0x44, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x3a, + 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, + 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x3b, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x23, 0x12, 0x1f, 0x0a, 0x1b, - 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, - 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x24, 0x12, 0x1f, 0x0a, + 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x3c, 0x12, 0x21, 0x0a, 0x1d, + 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, + 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x10, 0x3d, 0x12, + 0x2c, 0x0a, 0x28, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, + 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x3e, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x4b, 0x45, 0x59, 0x5f, 0x52, 0x4f, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x25, 0x12, 0x1c, - 0x0a, 0x18, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x41, 0x52, 0x10, 0x26, 0x12, 0x21, 0x0a, 0x1d, - 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, - 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x53, 0x10, 0x27, 0x12, - 0x1b, 0x0a, 0x17, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x10, 0x28, 0x12, 0x24, 0x0a, 0x20, + 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x3f, 0x12, 0x1f, + 0x0a, 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x40, 0x12, + 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x45, 0x5f, 0x53, 0x57, 0x49, 0x54, 0x43, 0x48, + 0x45, 0x44, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x41, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x55, 0x53, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, + 0x52, 0x45, 0x45, 0x5f, 0x4a, 0x4f, 0x49, 0x4e, 0x45, 0x44, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, + 0x42, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, + 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x43, 0x12, 0x2b, + 0x0a, 0x27, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, + 0x4d, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x44, 0x12, 0x29, 0x0a, 0x25, 0x42, + 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, + 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x45, + 0x4e, 0x44, 0x45, 0x44, 0x10, 0x45, 0x12, 0x27, 0x0a, 0x23, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, + 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x46, 0x12, + 0x2e, 0x0a, 0x2a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x45, 0x5f, 0x4a, 0x4f, 0x49, 0x4e, 0x45, 0x44, + 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x47, 0x12, + 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, + 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4b, 0x10, 0x48, 0x12, 0x32, 0x0a, 0x2e, 0x42, 0x55, 0x53, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, + 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x47, + 0x52, 0x41, 0x4d, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x49, 0x12, 0x32, 0x0a, + 0x2e, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, + 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, + 0x4a, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, + 0x55, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x45, 0x4e, 0x44, 0x45, + 0x44, 0x10, 0x4b, 0x12, 0x2d, 0x0a, 0x29, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x53, + 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, + 0x10, 0x4c, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x4d, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x49, 0x4e, 0x47, - 0x10, 0x29, 0x12, 0x2f, 0x0a, 0x2b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, - 0x5f, 0x53, 0x49, 0x47, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x10, 0x2a, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, - 0x49, 0x5f, 0x53, 0x49, 0x47, 0x5f, 0x53, 0x45, 0x54, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, - 0x4f, 0x4c, 0x44, 0x10, 0x2b, 0x12, 0x2f, 0x0a, 0x2b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x4d, 0x55, - 0x4c, 0x54, 0x49, 0x5f, 0x53, 0x49, 0x47, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x52, 0x5f, 0x41, - 0x44, 0x44, 0x45, 0x44, 0x10, 0x2c, 0x12, 0x31, 0x0a, 0x2d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x4d, - 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x53, 0x49, 0x47, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x52, 0x5f, - 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x2d, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x2e, 0x12, 0x28, 0x0a, 0x24, - 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, - 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, 0x4d, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x52, 0x4f, 0x54, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x2f, 0x12, 0x2c, 0x0a, 0x28, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, - 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, - 0x41, 0x4c, 0x10, 0x30, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, - 0x43, 0x4b, 0x10, 0x31, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x44, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, - 0x10, 0x32, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, - 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x33, 0x12, - 0x20, 0x0a, 0x1c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, - 0x34, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x10, 0x35, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, - 0x48, 0x4f, 0x54, 0x5f, 0x54, 0x41, 0x4b, 0x45, 0x4e, 0x10, 0x36, 0x12, 0x33, 0x0a, 0x2f, 0x42, - 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, - 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x44, - 0x41, 0x54, 0x41, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x37, - 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, 0x53, 0x53, 0x45, 0x44, 0x5f, 0x4f, 0x52, - 0x44, 0x45, 0x52, 0x53, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x38, 0x12, 0x21, 0x0a, - 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x39, - 0x12, 0x27, 0x0a, 0x23, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, 0x53, 0x53, 0x45, 0x44, 0x5f, 0x50, 0x4f, - 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x3a, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x50, 0x4f, 0x54, - 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, - 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x3b, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, - 0x44, 0x45, 0x52, 0x10, 0x3c, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, + 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x4e, 0x12, 0x25, + 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, + 0x54, 0x45, 0x44, 0x10, 0x4f, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, - 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x10, 0x3d, 0x12, 0x2c, 0x0a, 0x28, 0x42, 0x55, 0x53, 0x5f, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x49, - 0x4e, 0x47, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x50, - 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x3e, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x43, 0x52, - 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x3f, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x55, - 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x40, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, 0x5f, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, - 0x45, 0x45, 0x5f, 0x53, 0x57, 0x49, 0x54, 0x43, 0x48, 0x45, 0x44, 0x5f, 0x54, 0x45, 0x41, 0x4d, - 0x10, 0x41, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x45, 0x5f, 0x4a, 0x4f, 0x49, - 0x4e, 0x45, 0x44, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x42, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, - 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, - 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x53, 0x54, - 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x43, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, - 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, - 0x45, 0x44, 0x10, 0x44, 0x12, 0x29, 0x0a, 0x25, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, - 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x45, 0x12, - 0x27, 0x0a, 0x23, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x5f, 0x43, - 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x46, 0x12, 0x2e, 0x0a, 0x2a, 0x42, 0x55, 0x53, 0x5f, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, - 0x45, 0x45, 0x5f, 0x4a, 0x4f, 0x49, 0x4e, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, - 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x47, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, 0x5f, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, - 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4b, - 0x10, 0x48, 0x12, 0x32, 0x0a, 0x2e, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, - 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x53, 0x54, 0x41, - 0x52, 0x54, 0x45, 0x44, 0x10, 0x49, 0x12, 0x32, 0x0a, 0x2e, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, - 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, - 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x4a, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x55, - 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x4c, - 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, - 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x4b, 0x12, 0x2d, 0x0a, 0x29, - 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, - 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x4c, 0x12, 0x28, 0x0a, 0x24, 0x42, - 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x45, - 0x53, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, - 0x54, 0x45, 0x44, 0x10, 0x4d, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, - 0x49, 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, - 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x4e, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x4f, 0x12, 0x23, - 0x0a, 0x1f, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x41, 0x59, 0x4d, 0x45, 0x4e, 0x54, - 0x53, 0x10, 0x50, 0x12, 0x34, 0x0a, 0x30, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x49, 0x44, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, - 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, - 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x51, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x45, 0x53, 0x54, - 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59, 0x10, 0x52, 0x12, 0x25, 0x0a, - 0x21, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x50, 0x41, - 0x49, 0x44, 0x10, 0x53, 0x12, 0x31, 0x0a, 0x2d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x50, 0x41, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x10, 0x50, 0x12, 0x34, 0x0a, 0x30, 0x42, 0x55, + 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x49, + 0x44, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x53, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x51, + 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x56, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x55, 0x4d, 0x4d, 0x41, + 0x52, 0x59, 0x10, 0x52, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, - 0x46, 0x45, 0x45, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x55, 0x50, - 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x54, 0x12, 0x2c, 0x0a, 0x28, 0x42, 0x55, 0x53, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, - 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, - 0x54, 0x45, 0x44, 0x10, 0x55, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x50, 0x52, - 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x56, 0x12, - 0x26, 0x0a, 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, - 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x57, 0x12, 0x3a, 0x0a, 0x36, 0x42, 0x55, 0x53, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x57, - 0x45, 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, - 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, - 0x44, 0x10, 0x58, 0x12, 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, + 0x46, 0x45, 0x45, 0x53, 0x5f, 0x50, 0x41, 0x49, 0x44, 0x10, 0x53, 0x12, 0x31, 0x0a, 0x2d, 0x42, + 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, + 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x54, 0x12, 0x2c, + 0x0a, 0x28, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x4f, + 0x44, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x55, 0x12, 0x28, 0x0a, 0x24, + 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, + 0x41, 0x52, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x55, 0x50, 0x44, + 0x41, 0x54, 0x45, 0x44, 0x10, 0x56, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x53, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x57, 0x12, 0x3a, + 0x0a, 0x36, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x57, 0x45, 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x5f, 0x4e, + 0x4f, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x58, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x55, + 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4e, + 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x59, 0x12, + 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 ( @@ -11577,7 +11717,7 @@ func file_vega_events_v1_events_proto_rawDescGZIP() []byte { } var file_vega_events_v1_events_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_vega_events_v1_events_proto_msgTypes = make([]protoimpl.MessageInfo, 89) +var file_vega_events_v1_events_proto_msgTypes = make([]protoimpl.MessageInfo, 90) var file_vega_events_v1_events_proto_goTypes = []interface{}{ (ProtocolUpgradeProposalStatus)(0), // 0: vega.events.v1.ProtocolUpgradeProposalStatus (BusEventType)(0), // 1: vega.events.v1.BusEventType @@ -11652,87 +11792,88 @@ var file_vega_events_v1_events_proto_goTypes = []interface{}{ (*ProtocolUpgradeDataNodeReady)(nil), // 70: vega.events.v1.ProtocolUpgradeDataNodeReady (*CoreSnapshotData)(nil), // 71: vega.events.v1.CoreSnapshotData (*ExpiredOrders)(nil), // 72: vega.events.v1.ExpiredOrders - (*TeamCreated)(nil), // 73: vega.events.v1.TeamCreated - (*TeamUpdated)(nil), // 74: vega.events.v1.TeamUpdated - (*RefereeSwitchedTeam)(nil), // 75: vega.events.v1.RefereeSwitchedTeam - (*RefereeJoinedTeam)(nil), // 76: vega.events.v1.RefereeJoinedTeam - (*ReferralSetCreated)(nil), // 77: vega.events.v1.ReferralSetCreated - (*ReferralSetStatsUpdated)(nil), // 78: vega.events.v1.ReferralSetStatsUpdated - (*RefereeStats)(nil), // 79: vega.events.v1.RefereeStats - (*RefereeJoinedReferralSet)(nil), // 80: vega.events.v1.RefereeJoinedReferralSet - (*ReferralProgramStarted)(nil), // 81: vega.events.v1.ReferralProgramStarted - (*ReferralProgramUpdated)(nil), // 82: vega.events.v1.ReferralProgramUpdated - (*ReferralProgramEnded)(nil), // 83: vega.events.v1.ReferralProgramEnded - (*VolumeDiscountProgramStarted)(nil), // 84: vega.events.v1.VolumeDiscountProgramStarted - (*VolumeDiscountProgramUpdated)(nil), // 85: vega.events.v1.VolumeDiscountProgramUpdated - (*VolumeDiscountProgramEnded)(nil), // 86: vega.events.v1.VolumeDiscountProgramEnded - (*PaidLiquidityFeesStats)(nil), // 87: vega.events.v1.PaidLiquidityFeesStats - (*PartyMarginModeUpdated)(nil), // 88: vega.events.v1.PartyMarginModeUpdated - (*PartyProfileUpdated)(nil), // 89: vega.events.v1.PartyProfileUpdated - (*TeamsStatsUpdated)(nil), // 90: vega.events.v1.TeamsStatsUpdated - (*TeamStats)(nil), // 91: vega.events.v1.TeamStats - (*TeamMemberStats)(nil), // 92: vega.events.v1.TeamMemberStats - (*BusEvent)(nil), // 93: vega.events.v1.BusEvent - (*TransactionResult_SuccessDetails)(nil), // 94: vega.events.v1.TransactionResult.SuccessDetails - (*TransactionResult_FailureDetails)(nil), // 95: vega.events.v1.TransactionResult.FailureDetails - (*v1.OrderSubmission)(nil), // 96: vega.commands.v1.OrderSubmission - (*vega.StopOrder)(nil), // 97: vega.StopOrder - (vega.AccountType)(0), // 98: vega.AccountType - (*vega.DispatchStrategy)(nil), // 99: vega.DispatchStrategy - (*v1.OrderAmendment)(nil), // 100: vega.commands.v1.OrderAmendment - (*v1.OrderCancellation)(nil), // 101: vega.commands.v1.OrderCancellation - (*v1.ProposalSubmission)(nil), // 102: vega.commands.v1.ProposalSubmission - (*v1.VoteSubmission)(nil), // 103: vega.commands.v1.VoteSubmission - (*v1.LiquidityProvisionSubmission)(nil), // 104: vega.commands.v1.LiquidityProvisionSubmission - (*v1.WithdrawSubmission)(nil), // 105: vega.commands.v1.WithdrawSubmission - (*v1.DelegateSubmission)(nil), // 106: vega.commands.v1.DelegateSubmission - (*v1.UndelegateSubmission)(nil), // 107: vega.commands.v1.UndelegateSubmission - (*v1.LiquidityProvisionCancellation)(nil), // 108: vega.commands.v1.LiquidityProvisionCancellation - (*v1.LiquidityProvisionAmendment)(nil), // 109: vega.commands.v1.LiquidityProvisionAmendment - (*v1.Transfer)(nil), // 110: vega.commands.v1.Transfer - (*v1.CancelTransfer)(nil), // 111: vega.commands.v1.CancelTransfer - (*v1.AnnounceNode)(nil), // 112: vega.commands.v1.AnnounceNode - (*v1.OracleDataSubmission)(nil), // 113: vega.commands.v1.OracleDataSubmission - (*v1.ProtocolUpgradeProposal)(nil), // 114: vega.commands.v1.ProtocolUpgradeProposal - (*v1.IssueSignatures)(nil), // 115: vega.commands.v1.IssueSignatures - (*v1.BatchMarketInstructions)(nil), // 116: vega.commands.v1.BatchMarketInstructions - (*v1.KeyRotateSubmission)(nil), // 117: vega.commands.v1.KeyRotateSubmission - (*v1.EthereumKeyRotateSubmission)(nil), // 118: vega.commands.v1.EthereumKeyRotateSubmission - (*v1.StopOrdersSubmission)(nil), // 119: vega.commands.v1.StopOrdersSubmission - (*v1.StopOrdersCancellation)(nil), // 120: vega.commands.v1.StopOrdersCancellation - (*v1.CreateReferralSet)(nil), // 121: vega.commands.v1.CreateReferralSet - (*v1.UpdateReferralSet)(nil), // 122: vega.commands.v1.UpdateReferralSet - (*v1.ApplyReferralCode)(nil), // 123: vega.commands.v1.ApplyReferralCode - (*v1.UpdateMarginMode)(nil), // 124: vega.commands.v1.UpdateMarginMode - (*v1.JoinTeam)(nil), // 125: vega.commands.v1.JoinTeam - (*v1.BatchProposalSubmission)(nil), // 126: vega.commands.v1.BatchProposalSubmission - (*v1.UpdatePartyProfile)(nil), // 127: vega.commands.v1.UpdatePartyProfile - (vega.EpochAction)(0), // 128: vega.EpochAction - (*vega.LedgerMovement)(nil), // 129: vega.LedgerMovement - (vega.AuctionTrigger)(0), // 130: vega.AuctionTrigger - (*vega.ReferralProgram)(nil), // 131: vega.ReferralProgram - (*vega.VolumeDiscountProgram)(nil), // 132: vega.VolumeDiscountProgram - (vega.MarginMode)(0), // 133: vega.MarginMode - (*vega.PartyProfile)(nil), // 134: vega.PartyProfile - (*vega.Order)(nil), // 135: vega.Order - (*vega.Account)(nil), // 136: vega.Account - (*vega.Party)(nil), // 137: vega.Party - (*vega.Trade)(nil), // 138: vega.Trade - (*vega.MarginLevels)(nil), // 139: vega.MarginLevels - (*vega.Proposal)(nil), // 140: vega.Proposal - (*vega.Vote)(nil), // 141: vega.Vote - (*vega.MarketData)(nil), // 142: vega.MarketData - (*v1.NodeSignature)(nil), // 143: vega.commands.v1.NodeSignature - (*vega.Market)(nil), // 144: vega.Market - (*vega.Asset)(nil), // 145: vega.Asset - (*vega.Withdrawal)(nil), // 146: vega.Withdrawal - (*vega.Deposit)(nil), // 147: vega.Deposit - (*vega.RiskFactor)(nil), // 148: vega.RiskFactor - (*vega.NetworkParameter)(nil), // 149: vega.NetworkParameter - (*vega.LiquidityProvision)(nil), // 150: vega.LiquidityProvision - (*vega.OracleSpec)(nil), // 151: vega.OracleSpec - (*vega.OracleData)(nil), // 152: vega.OracleData - (*vega.NetworkLimits)(nil), // 153: vega.NetworkLimits + (*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 } var file_vega_events_v1_events_proto_depIdxs = []int32{ 9, // 0: vega.events.v1.VestingBalancesSummary.parties_vesting_summary:type_name -> vega.events.v1.PartyVestingSummary @@ -11751,114 +11892,114 @@ var file_vega_events_v1_events_proto_depIdxs = []int32{ 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 - 96, // 16: vega.events.v1.StopOrderEvent.submission:type_name -> vega.commands.v1.OrderSubmission - 97, // 17: vega.events.v1.StopOrderEvent.stop_order:type_name -> vega.StopOrder + 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 - 98, // 19: vega.events.v1.Transfer.from_account_type:type_name -> vega.AccountType - 98, // 20: vega.events.v1.Transfer.to_account_type:type_name -> vega.AccountType + 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 - 99, // 26: vega.events.v1.RecurringTransfer.dispatch_strategy:type_name -> vega.DispatchStrategy - 99, // 27: vega.events.v1.RecurringGovernanceTransfer.dispatch_strategy:type_name -> vega.DispatchStrategy + 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 - 96, // 31: vega.events.v1.TransactionResult.order_submission:type_name -> vega.commands.v1.OrderSubmission - 100, // 32: vega.events.v1.TransactionResult.order_amendment:type_name -> vega.commands.v1.OrderAmendment - 101, // 33: vega.events.v1.TransactionResult.order_cancellation:type_name -> vega.commands.v1.OrderCancellation - 102, // 34: vega.events.v1.TransactionResult.proposal:type_name -> vega.commands.v1.ProposalSubmission - 103, // 35: vega.events.v1.TransactionResult.vote_submission:type_name -> vega.commands.v1.VoteSubmission - 104, // 36: vega.events.v1.TransactionResult.liquidity_provision_submission:type_name -> vega.commands.v1.LiquidityProvisionSubmission - 105, // 37: vega.events.v1.TransactionResult.withdraw_submission:type_name -> vega.commands.v1.WithdrawSubmission - 106, // 38: vega.events.v1.TransactionResult.delegate_submission:type_name -> vega.commands.v1.DelegateSubmission - 107, // 39: vega.events.v1.TransactionResult.undelegate_submission:type_name -> vega.commands.v1.UndelegateSubmission - 108, // 40: vega.events.v1.TransactionResult.liquidity_provision_cancellation:type_name -> vega.commands.v1.LiquidityProvisionCancellation - 109, // 41: vega.events.v1.TransactionResult.liquidity_provision_amendment:type_name -> vega.commands.v1.LiquidityProvisionAmendment - 110, // 42: vega.events.v1.TransactionResult.transfer:type_name -> vega.commands.v1.Transfer - 111, // 43: vega.events.v1.TransactionResult.cancel_transfer:type_name -> vega.commands.v1.CancelTransfer - 112, // 44: vega.events.v1.TransactionResult.announce_node:type_name -> vega.commands.v1.AnnounceNode - 113, // 45: vega.events.v1.TransactionResult.oracle_data_submission:type_name -> vega.commands.v1.OracleDataSubmission - 114, // 46: vega.events.v1.TransactionResult.protocol_upgrade_proposal:type_name -> vega.commands.v1.ProtocolUpgradeProposal - 115, // 47: vega.events.v1.TransactionResult.issue_signatures:type_name -> vega.commands.v1.IssueSignatures - 116, // 48: vega.events.v1.TransactionResult.batch_market_instructions:type_name -> vega.commands.v1.BatchMarketInstructions - 117, // 49: vega.events.v1.TransactionResult.key_rotate_submission:type_name -> vega.commands.v1.KeyRotateSubmission - 118, // 50: vega.events.v1.TransactionResult.ethereum_key_rotate_submission:type_name -> vega.commands.v1.EthereumKeyRotateSubmission - 119, // 51: vega.events.v1.TransactionResult.stop_order_submission:type_name -> vega.commands.v1.StopOrdersSubmission - 120, // 52: vega.events.v1.TransactionResult.stop_order_cancellation:type_name -> vega.commands.v1.StopOrdersCancellation - 121, // 53: vega.events.v1.TransactionResult.create_referral_set:type_name -> vega.commands.v1.CreateReferralSet - 122, // 54: vega.events.v1.TransactionResult.update_referral_set:type_name -> vega.commands.v1.UpdateReferralSet - 123, // 55: vega.events.v1.TransactionResult.apply_referral_code:type_name -> vega.commands.v1.ApplyReferralCode - 124, // 56: vega.events.v1.TransactionResult.update_margin_mode:type_name -> vega.commands.v1.UpdateMarginMode - 125, // 57: vega.events.v1.TransactionResult.join_team:type_name -> vega.commands.v1.JoinTeam - 126, // 58: vega.events.v1.TransactionResult.batch_proposal:type_name -> vega.commands.v1.BatchProposalSubmission - 127, // 59: vega.events.v1.TransactionResult.update_party_profile:type_name -> vega.commands.v1.UpdatePartyProfile - 94, // 60: vega.events.v1.TransactionResult.success:type_name -> vega.events.v1.TransactionResult.SuccessDetails - 95, // 61: vega.events.v1.TransactionResult.failure:type_name -> vega.events.v1.TransactionResult.FailureDetails - 96, // 62: vega.events.v1.TxErrorEvent.order_submission:type_name -> vega.commands.v1.OrderSubmission - 100, // 63: vega.events.v1.TxErrorEvent.order_amendment:type_name -> vega.commands.v1.OrderAmendment - 101, // 64: vega.events.v1.TxErrorEvent.order_cancellation:type_name -> vega.commands.v1.OrderCancellation - 102, // 65: vega.events.v1.TxErrorEvent.proposal:type_name -> vega.commands.v1.ProposalSubmission - 103, // 66: vega.events.v1.TxErrorEvent.vote_submission:type_name -> vega.commands.v1.VoteSubmission - 104, // 67: vega.events.v1.TxErrorEvent.liquidity_provision_submission:type_name -> vega.commands.v1.LiquidityProvisionSubmission - 105, // 68: vega.events.v1.TxErrorEvent.withdraw_submission:type_name -> vega.commands.v1.WithdrawSubmission - 106, // 69: vega.events.v1.TxErrorEvent.delegate_submission:type_name -> vega.commands.v1.DelegateSubmission - 107, // 70: vega.events.v1.TxErrorEvent.undelegate_submission:type_name -> vega.commands.v1.UndelegateSubmission - 108, // 71: vega.events.v1.TxErrorEvent.liquidity_provision_cancellation:type_name -> vega.commands.v1.LiquidityProvisionCancellation - 109, // 72: vega.events.v1.TxErrorEvent.liquidity_provision_amendment:type_name -> vega.commands.v1.LiquidityProvisionAmendment - 110, // 73: vega.events.v1.TxErrorEvent.transfer:type_name -> vega.commands.v1.Transfer - 111, // 74: vega.events.v1.TxErrorEvent.cancel_transfer:type_name -> vega.commands.v1.CancelTransfer - 112, // 75: vega.events.v1.TxErrorEvent.announce_node:type_name -> vega.commands.v1.AnnounceNode - 113, // 76: vega.events.v1.TxErrorEvent.oracle_data_submission:type_name -> vega.commands.v1.OracleDataSubmission - 114, // 77: vega.events.v1.TxErrorEvent.protocol_upgrade_proposal:type_name -> vega.commands.v1.ProtocolUpgradeProposal - 115, // 78: vega.events.v1.TxErrorEvent.issue_signatures:type_name -> vega.commands.v1.IssueSignatures - 116, // 79: vega.events.v1.TxErrorEvent.batch_market_instructions:type_name -> vega.commands.v1.BatchMarketInstructions - 128, // 80: vega.events.v1.EpochEvent.action:type_name -> vega.EpochAction - 129, // 81: vega.events.v1.LedgerMovements.ledger_movements:type_name -> vega.LedgerMovement + 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 - 130, // 83: vega.events.v1.AuctionEvent.trigger:type_name -> vega.AuctionTrigger - 130, // 84: vega.events.v1.AuctionEvent.extension_trigger:type_name -> vega.AuctionTrigger + 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 - 79, // 86: vega.events.v1.ReferralSetStatsUpdated.referees_stats:type_name -> vega.events.v1.RefereeStats - 131, // 87: vega.events.v1.ReferralProgramStarted.program:type_name -> vega.ReferralProgram - 131, // 88: vega.events.v1.ReferralProgramUpdated.program:type_name -> vega.ReferralProgram - 132, // 89: vega.events.v1.VolumeDiscountProgramStarted.program:type_name -> vega.VolumeDiscountProgram - 132, // 90: vega.events.v1.VolumeDiscountProgramUpdated.program:type_name -> vega.VolumeDiscountProgram + 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 - 133, // 92: vega.events.v1.PartyMarginModeUpdated.margin_mode:type_name -> vega.MarginMode - 134, // 93: vega.events.v1.PartyProfileUpdated.updated_profile:type_name -> vega.PartyProfile - 91, // 94: vega.events.v1.TeamsStatsUpdated.stats:type_name -> vega.events.v1.TeamStats - 92, // 95: vega.events.v1.TeamStats.members_stats:type_name -> vega.events.v1.TeamMemberStats + 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 - 135, // 100: vega.events.v1.BusEvent.order:type_name -> vega.Order - 136, // 101: vega.events.v1.BusEvent.account:type_name -> vega.Account - 137, // 102: vega.events.v1.BusEvent.party:type_name -> vega.Party - 138, // 103: vega.events.v1.BusEvent.trade:type_name -> vega.Trade - 139, // 104: vega.events.v1.BusEvent.margin_levels:type_name -> vega.MarginLevels - 140, // 105: vega.events.v1.BusEvent.proposal:type_name -> vega.Proposal - 141, // 106: vega.events.v1.BusEvent.vote:type_name -> vega.Vote - 142, // 107: vega.events.v1.BusEvent.market_data:type_name -> vega.MarketData - 143, // 108: vega.events.v1.BusEvent.node_signature:type_name -> vega.commands.v1.NodeSignature + 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 - 144, // 112: vega.events.v1.BusEvent.market_created:type_name -> vega.Market - 145, // 113: vega.events.v1.BusEvent.asset:type_name -> vega.Asset + 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 - 146, // 115: vega.events.v1.BusEvent.withdrawal:type_name -> vega.Withdrawal - 147, // 116: vega.events.v1.BusEvent.deposit:type_name -> vega.Deposit + 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 - 148, // 118: vega.events.v1.BusEvent.risk_factor:type_name -> vega.RiskFactor - 149, // 119: vega.events.v1.BusEvent.network_parameter:type_name -> vega.NetworkParameter - 150, // 120: vega.events.v1.BusEvent.liquidity_provision:type_name -> vega.LiquidityProvision - 144, // 121: vega.events.v1.BusEvent.market_updated:type_name -> vega.Market - 151, // 122: vega.events.v1.BusEvent.oracle_spec:type_name -> vega.OracleSpec - 152, // 123: vega.events.v1.BusEvent.oracle_data:type_name -> vega.OracleData + 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 @@ -11868,7 +12009,7 @@ var file_vega_events_v1_events_proto_depIdxs = []int32{ 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 - 153, // 133: vega.events.v1.BusEvent.network_limits:type_name -> vega.NetworkLimits + 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 @@ -11891,39 +12032,40 @@ var file_vega_events_v1_events_proto_depIdxs = []int32{ 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 - 73, // 156: vega.events.v1.BusEvent.team_created:type_name -> vega.events.v1.TeamCreated - 74, // 157: vega.events.v1.BusEvent.team_updated:type_name -> vega.events.v1.TeamUpdated - 75, // 158: vega.events.v1.BusEvent.referee_switched_team:type_name -> vega.events.v1.RefereeSwitchedTeam - 76, // 159: vega.events.v1.BusEvent.referee_joined_team:type_name -> vega.events.v1.RefereeJoinedTeam - 81, // 160: vega.events.v1.BusEvent.referral_program_started:type_name -> vega.events.v1.ReferralProgramStarted - 82, // 161: vega.events.v1.BusEvent.referral_program_updated:type_name -> vega.events.v1.ReferralProgramUpdated - 83, // 162: vega.events.v1.BusEvent.referral_program_ended:type_name -> vega.events.v1.ReferralProgramEnded - 77, // 163: vega.events.v1.BusEvent.referral_set_created:type_name -> vega.events.v1.ReferralSetCreated - 80, // 164: vega.events.v1.BusEvent.referee_joined_referral_set:type_name -> vega.events.v1.RefereeJoinedReferralSet + 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 - 84, // 166: vega.events.v1.BusEvent.volume_discount_program_started:type_name -> vega.events.v1.VolumeDiscountProgramStarted - 85, // 167: vega.events.v1.BusEvent.volume_discount_program_updated:type_name -> vega.events.v1.VolumeDiscountProgramUpdated - 86, // 168: vega.events.v1.BusEvent.volume_discount_program_ended:type_name -> vega.events.v1.VolumeDiscountProgramEnded - 78, // 169: vega.events.v1.BusEvent.referral_set_stats_updated:type_name -> vega.events.v1.ReferralSetStatsUpdated + 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 - 87, // 174: vega.events.v1.BusEvent.paid_liquidity_fees_stats:type_name -> vega.events.v1.PaidLiquidityFeesStats + 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 - 88, // 178: vega.events.v1.BusEvent.party_margin_mode_updated:type_name -> vega.events.v1.PartyMarginModeUpdated - 89, // 179: vega.events.v1.BusEvent.party_profile_updated:type_name -> vega.events.v1.PartyProfileUpdated - 90, // 180: vega.events.v1.BusEvent.teams_stats_updated:type_name -> vega.events.v1.TeamsStatsUpdated + 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 - 42, // 182: vega.events.v1.BusEvent.market:type_name -> vega.events.v1.MarketEvent - 46, // 183: vega.events.v1.BusEvent.tx_err_event:type_name -> vega.events.v1.TxErrorEvent - 184, // [184:184] is the sub-list for method output_type - 184, // [184:184] is the sub-list for method input_type - 184, // [184:184] is the sub-list for extension type_name - 184, // [184:184] is the sub-list for extension extendee - 0, // [0:184] is the sub-list for field type_name + 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 } func init() { file_vega_events_v1_events_proto_init() } @@ -12725,7 +12867,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.(*TeamCreated); i { + switch v := v.(*CancelledOrders); i { case 0: return &v.state case 1: @@ -12737,7 +12879,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.(*TeamUpdated); i { + switch v := v.(*TeamCreated); i { case 0: return &v.state case 1: @@ -12749,7 +12891,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.(*RefereeSwitchedTeam); i { + switch v := v.(*TeamUpdated); i { case 0: return &v.state case 1: @@ -12761,7 +12903,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.(*RefereeJoinedTeam); i { + switch v := v.(*RefereeSwitchedTeam); i { case 0: return &v.state case 1: @@ -12773,7 +12915,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.(*ReferralSetCreated); i { + switch v := v.(*RefereeJoinedTeam); i { case 0: return &v.state case 1: @@ -12785,7 +12927,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.(*ReferralSetStatsUpdated); i { + switch v := v.(*ReferralSetCreated); i { case 0: return &v.state case 1: @@ -12797,7 +12939,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.(*RefereeStats); i { + switch v := v.(*ReferralSetStatsUpdated); i { case 0: return &v.state case 1: @@ -12809,7 +12951,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.(*RefereeJoinedReferralSet); i { + switch v := v.(*RefereeStats); i { case 0: return &v.state case 1: @@ -12821,7 +12963,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.(*ReferralProgramStarted); i { + switch v := v.(*RefereeJoinedReferralSet); i { case 0: return &v.state case 1: @@ -12833,7 +12975,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.(*ReferralProgramUpdated); i { + switch v := v.(*ReferralProgramStarted); i { case 0: return &v.state case 1: @@ -12845,7 +12987,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.(*ReferralProgramEnded); i { + switch v := v.(*ReferralProgramUpdated); i { case 0: return &v.state case 1: @@ -12857,7 +12999,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.(*VolumeDiscountProgramStarted); i { + switch v := v.(*ReferralProgramEnded); i { case 0: return &v.state case 1: @@ -12869,7 +13011,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.(*VolumeDiscountProgramUpdated); i { + switch v := v.(*VolumeDiscountProgramStarted); i { case 0: return &v.state case 1: @@ -12881,7 +13023,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.(*VolumeDiscountProgramEnded); i { + switch v := v.(*VolumeDiscountProgramUpdated); i { case 0: return &v.state case 1: @@ -12893,7 +13035,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.(*PaidLiquidityFeesStats); i { + switch v := v.(*VolumeDiscountProgramEnded); i { case 0: return &v.state case 1: @@ -12905,7 +13047,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.(*PartyMarginModeUpdated); i { + switch v := v.(*PaidLiquidityFeesStats); i { case 0: return &v.state case 1: @@ -12917,7 +13059,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.(*PartyProfileUpdated); i { + switch v := v.(*PartyMarginModeUpdated); i { case 0: return &v.state case 1: @@ -12929,7 +13071,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.(*TeamsStatsUpdated); i { + switch v := v.(*PartyProfileUpdated); i { case 0: return &v.state case 1: @@ -12941,7 +13083,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.(*TeamStats); i { + switch v := v.(*TeamsStatsUpdated); i { case 0: return &v.state case 1: @@ -12953,7 +13095,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.(*TeamMemberStats); i { + switch v := v.(*TeamStats); i { case 0: return &v.state case 1: @@ -12965,7 +13107,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.(*BusEvent); i { + switch v := v.(*TeamMemberStats); i { case 0: return &v.state case 1: @@ -12977,7 +13119,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.(*TransactionResult_SuccessDetails); i { + switch v := v.(*BusEvent); i { case 0: return &v.state case 1: @@ -12989,6 +13131,18 @@ 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 { + 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[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionResult_FailureDetails); i { case 0: return &v.state @@ -13032,8 +13186,8 @@ func file_vega_events_v1_events_proto_init() { (*TransactionResult_BatchMarketInstructions)(nil), (*TransactionResult_KeyRotateSubmission)(nil), (*TransactionResult_EthereumKeyRotateSubmission)(nil), - (*TransactionResult_StopOrderSubmission)(nil), - (*TransactionResult_StopOrderCancellation)(nil), + (*TransactionResult_StopOrdersSubmission)(nil), + (*TransactionResult_StopOrdersCancellation)(nil), (*TransactionResult_CreateReferralSet)(nil), (*TransactionResult_UpdateReferralSet)(nil), (*TransactionResult_ApplyReferralCode)(nil), @@ -13064,10 +13218,10 @@ func file_vega_events_v1_events_proto_init() { (*TxErrorEvent_IssueSignatures)(nil), (*TxErrorEvent_BatchMarketInstructions)(nil), } - file_vega_events_v1_events_proto_msgTypes[66].OneofWrappers = []interface{}{} file_vega_events_v1_events_proto_msgTypes[67].OneofWrappers = []interface{}{} - file_vega_events_v1_events_proto_msgTypes[81].OneofWrappers = []interface{}{} - file_vega_events_v1_events_proto_msgTypes[86].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{}{ (*BusEvent_TimeUpdate)(nil), (*BusEvent_LedgerMovements)(nil), (*BusEvent_PositionResolution)(nil), @@ -13153,6 +13307,7 @@ func file_vega_events_v1_events_proto_init() { (*BusEvent_PartyProfileUpdated)(nil), (*BusEvent_TeamsStatsUpdated)(nil), (*BusEvent_TimeWeightedNotionalPositionUpdated)(nil), + (*BusEvent_CancelledOrders)(nil), (*BusEvent_Market)(nil), (*BusEvent_TxErrEvent)(nil), } @@ -13162,7 +13317,7 @@ func file_vega_events_v1_events_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vega_events_v1_events_proto_rawDesc, NumEnums: 7, - NumMessages: 89, + NumMessages: 90, NumExtensions: 0, NumServices: 0, }, diff --git a/protos/vega/governance.pb.go b/protos/vega/governance.pb.go index 26bfbad03e..59335ffcc4 100644 --- a/protos/vega/governance.pb.go +++ b/protos/vega/governance.pb.go @@ -133,6 +133,8 @@ const ( ProposalError_PROPOSAL_ERROR_PROPOSAL_IN_BATCH_REJECTED ProposalError = 58 // One or more proposals in a batch has been declined ProposalError_PROPOSAL_ERROR_PROPOSAL_IN_BATCH_DECLINED ProposalError = 59 + // Spot market decimal places cannot be greater than the base asset’s decimal places + ProposalError_PROPOSAL_ERROR_INVALID_SIZE_DECIMAL_PLACES ProposalError = 60 ) // Enum value maps for ProposalError. @@ -192,6 +194,7 @@ var ( 57: "PROPOSAL_ERROR_INVALID_VOLUME_DISCOUNT_PROGRAM", 58: "PROPOSAL_ERROR_PROPOSAL_IN_BATCH_REJECTED", 59: "PROPOSAL_ERROR_PROPOSAL_IN_BATCH_DECLINED", + 60: "PROPOSAL_ERROR_INVALID_SIZE_DECIMAL_PLACES", } ProposalError_value = map[string]int32{ "PROPOSAL_ERROR_UNSPECIFIED": 0, @@ -248,6 +251,7 @@ var ( "PROPOSAL_ERROR_INVALID_VOLUME_DISCOUNT_PROGRAM": 57, "PROPOSAL_ERROR_PROPOSAL_IN_BATCH_REJECTED": 58, "PROPOSAL_ERROR_PROPOSAL_IN_BATCH_DECLINED": 59, + "PROPOSAL_ERROR_INVALID_SIZE_DECIMAL_PLACES": 60, } ) @@ -429,7 +433,7 @@ func (x GovernanceData_Type) Number() protoreflect.EnumNumber { // Deprecated: Use GovernanceData_Type.Descriptor instead. func (GovernanceData_Type) EnumDescriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{25, 0} + return file_vega_governance_proto_rawDescGZIP(), []int{26, 0} } // Proposal state transition: @@ -509,7 +513,7 @@ func (x Proposal_State) Number() protoreflect.EnumNumber { // Deprecated: Use Proposal_State.Descriptor instead. func (Proposal_State) EnumDescriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{26, 0} + return file_vega_governance_proto_rawDescGZIP(), []int{27, 0} } // Vote value @@ -562,7 +566,7 @@ func (x Vote_Value) Number() protoreflect.EnumNumber { // Deprecated: Use Vote_Value.Descriptor instead. func (Vote_Value) EnumDescriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{27, 0} + return file_vega_governance_proto_rawDescGZIP(), []int{28, 0} } // Spot product configuration @@ -575,8 +579,6 @@ type SpotProduct struct { BaseAsset string `protobuf:"bytes,1,opt,name=base_asset,json=baseAsset,proto3" json:"base_asset,omitempty"` // Quote asset ID. QuoteAsset string `protobuf:"bytes,2,opt,name=quote_asset,json=quoteAsset,proto3" json:"quote_asset,omitempty"` - // Product name. - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` } func (x *SpotProduct) Reset() { @@ -625,13 +627,6 @@ func (x *SpotProduct) GetQuoteAsset() string { return "" } -func (x *SpotProduct) GetName() string { - if x != nil { - return x.Name - } - return "" -} - // Future product configuration type FutureProduct struct { state protoimpl.MessageState @@ -1002,7 +997,7 @@ type NewSpotMarketConfiguration struct { // New spot market instrument configuration. Instrument *InstrumentConfiguration `protobuf:"bytes,1,opt,name=instrument,proto3" json:"instrument,omitempty"` // Decimal places used for the new spot market, sets the smallest price increment on the book. - DecimalPlaces uint64 `protobuf:"varint,2,opt,name=decimal_places,json=decimalPlaces,proto3" json:"decimal_places,omitempty"` + PriceDecimalPlaces uint64 `protobuf:"varint,2,opt,name=price_decimal_places,json=priceDecimalPlaces,proto3" json:"price_decimal_places,omitempty"` // Optional new spot market metadata, tags. Metadata []string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty"` // Price monitoring parameters. @@ -1017,7 +1012,7 @@ type NewSpotMarketConfiguration struct { // *NewSpotMarketConfiguration_LogNormal RiskParameters isNewSpotMarketConfiguration_RiskParameters `protobuf_oneof:"risk_parameters"` // Decimal places for order sizes, sets what size the smallest order / position on the spot market can be. - PositionDecimalPlaces int64 `protobuf:"varint,6,opt,name=position_decimal_places,json=positionDecimalPlaces,proto3" json:"position_decimal_places,omitempty"` + SizeDecimalPlaces int64 `protobuf:"varint,6,opt,name=size_decimal_places,json=sizeDecimalPlaces,proto3" json:"size_decimal_places,omitempty"` // Specifies the liquidity provision SLA parameters. SlaParams *LiquiditySLAParameters `protobuf:"bytes,7,opt,name=sla_params,json=slaParams,proto3" json:"sla_params,omitempty"` // Specifies how the liquidity fee for the market will be calculated. @@ -1065,9 +1060,9 @@ func (x *NewSpotMarketConfiguration) GetInstrument() *InstrumentConfiguration { return nil } -func (x *NewSpotMarketConfiguration) GetDecimalPlaces() uint64 { +func (x *NewSpotMarketConfiguration) GetPriceDecimalPlaces() uint64 { if x != nil { - return x.DecimalPlaces + return x.PriceDecimalPlaces } return 0 } @@ -1114,9 +1109,9 @@ func (x *NewSpotMarketConfiguration) GetLogNormal() *LogNormalRiskModel { return nil } -func (x *NewSpotMarketConfiguration) GetPositionDecimalPlaces() int64 { +func (x *NewSpotMarketConfiguration) GetSizeDecimalPlaces() int64 { if x != nil { - return x.PositionDecimalPlaces + return x.SizeDecimalPlaces } return 0 } @@ -1882,6 +1877,8 @@ type UpdateSpotMarketConfiguration struct { LiquidityFeeSettings *LiquidityFeeSettings `protobuf:"bytes,5,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,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"` } func (x *UpdateSpotMarketConfiguration) Reset() { @@ -1979,6 +1976,13 @@ func (x *UpdateSpotMarketConfiguration) GetTickSize() string { return "" } +func (x *UpdateSpotMarketConfiguration) GetInstrument() *UpdateSpotInstrumentConfiguration { + if x != nil { + return x.Instrument + } + return nil +} + type isUpdateSpotMarketConfiguration_RiskParameters interface { isUpdateSpotMarketConfiguration_RiskParameters() } @@ -1997,6 +2001,63 @@ func (*UpdateSpotMarketConfiguration_Simple) isUpdateSpotMarketConfiguration_Ris func (*UpdateSpotMarketConfiguration_LogNormal) isUpdateSpotMarketConfiguration_RiskParameters() {} +type UpdateSpotInstrumentConfiguration struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Instrument code, human-readable shortcode used to describe the instrument. + Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` + // Instrument name + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *UpdateSpotInstrumentConfiguration) Reset() { + *x = UpdateSpotInstrumentConfiguration{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_governance_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSpotInstrumentConfiguration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSpotInstrumentConfiguration) ProtoMessage() {} + +func (x *UpdateSpotInstrumentConfiguration) ProtoReflect() protoreflect.Message { + mi := &file_vega_governance_proto_msgTypes[13] + 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 UpdateSpotInstrumentConfiguration.ProtoReflect.Descriptor instead. +func (*UpdateSpotInstrumentConfiguration) Descriptor() ([]byte, []int) { + return file_vega_governance_proto_rawDescGZIP(), []int{13} +} + +func (x *UpdateSpotInstrumentConfiguration) GetCode() string { + if x != nil { + return x.Code + } + return "" +} + +func (x *UpdateSpotInstrumentConfiguration) GetName() string { + if x != nil { + return x.Name + } + return "" +} + // Instrument configuration type UpdateInstrumentConfiguration struct { state protoimpl.MessageState @@ -2019,7 +2080,7 @@ type UpdateInstrumentConfiguration struct { func (x *UpdateInstrumentConfiguration) Reset() { *x = UpdateInstrumentConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[13] + mi := &file_vega_governance_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2032,7 +2093,7 @@ func (x *UpdateInstrumentConfiguration) String() string { func (*UpdateInstrumentConfiguration) ProtoMessage() {} func (x *UpdateInstrumentConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[13] + mi := &file_vega_governance_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2045,7 +2106,7 @@ func (x *UpdateInstrumentConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateInstrumentConfiguration.ProtoReflect.Descriptor instead. func (*UpdateInstrumentConfiguration) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{13} + return file_vega_governance_proto_rawDescGZIP(), []int{14} } func (x *UpdateInstrumentConfiguration) GetCode() string { @@ -2120,7 +2181,7 @@ type UpdateFutureProduct struct { func (x *UpdateFutureProduct) Reset() { *x = UpdateFutureProduct{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[14] + mi := &file_vega_governance_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2133,7 +2194,7 @@ func (x *UpdateFutureProduct) String() string { func (*UpdateFutureProduct) ProtoMessage() {} func (x *UpdateFutureProduct) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[14] + mi := &file_vega_governance_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2146,7 +2207,7 @@ func (x *UpdateFutureProduct) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateFutureProduct.ProtoReflect.Descriptor instead. func (*UpdateFutureProduct) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{14} + return file_vega_governance_proto_rawDescGZIP(), []int{15} } func (x *UpdateFutureProduct) GetQuoteName() string { @@ -2212,7 +2273,7 @@ type UpdatePerpetualProduct struct { func (x *UpdatePerpetualProduct) Reset() { *x = UpdatePerpetualProduct{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[15] + mi := &file_vega_governance_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2225,7 +2286,7 @@ func (x *UpdatePerpetualProduct) String() string { func (*UpdatePerpetualProduct) ProtoMessage() {} func (x *UpdatePerpetualProduct) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[15] + mi := &file_vega_governance_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2238,7 +2299,7 @@ func (x *UpdatePerpetualProduct) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdatePerpetualProduct.ProtoReflect.Descriptor instead. func (*UpdatePerpetualProduct) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{15} + return file_vega_governance_proto_rawDescGZIP(), []int{16} } func (x *UpdatePerpetualProduct) GetQuoteName() string { @@ -2338,7 +2399,7 @@ type UpdateNetworkParameter struct { func (x *UpdateNetworkParameter) Reset() { *x = UpdateNetworkParameter{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[16] + mi := &file_vega_governance_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2351,7 +2412,7 @@ func (x *UpdateNetworkParameter) String() string { func (*UpdateNetworkParameter) ProtoMessage() {} func (x *UpdateNetworkParameter) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[16] + mi := &file_vega_governance_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2364,7 +2425,7 @@ func (x *UpdateNetworkParameter) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateNetworkParameter.ProtoReflect.Descriptor instead. func (*UpdateNetworkParameter) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{16} + return file_vega_governance_proto_rawDescGZIP(), []int{17} } func (x *UpdateNetworkParameter) GetChanges() *NetworkParameter { @@ -2387,7 +2448,7 @@ type NewAsset struct { func (x *NewAsset) Reset() { *x = NewAsset{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[17] + mi := &file_vega_governance_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2400,7 +2461,7 @@ func (x *NewAsset) String() string { func (*NewAsset) ProtoMessage() {} func (x *NewAsset) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[17] + mi := &file_vega_governance_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2413,7 +2474,7 @@ func (x *NewAsset) ProtoReflect() protoreflect.Message { // Deprecated: Use NewAsset.ProtoReflect.Descriptor instead. func (*NewAsset) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{17} + return file_vega_governance_proto_rawDescGZIP(), []int{18} } func (x *NewAsset) GetChanges() *AssetDetails { @@ -2438,7 +2499,7 @@ type UpdateAsset struct { func (x *UpdateAsset) Reset() { *x = UpdateAsset{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[18] + mi := &file_vega_governance_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2451,7 +2512,7 @@ func (x *UpdateAsset) String() string { func (*UpdateAsset) ProtoMessage() {} func (x *UpdateAsset) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[18] + mi := &file_vega_governance_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2464,7 +2525,7 @@ func (x *UpdateAsset) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateAsset.ProtoReflect.Descriptor instead. func (*UpdateAsset) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{18} + return file_vega_governance_proto_rawDescGZIP(), []int{19} } func (x *UpdateAsset) GetAssetId() string { @@ -2493,7 +2554,7 @@ type NewFreeform struct { func (x *NewFreeform) Reset() { *x = NewFreeform{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[19] + mi := &file_vega_governance_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2506,7 +2567,7 @@ func (x *NewFreeform) String() string { func (*NewFreeform) ProtoMessage() {} func (x *NewFreeform) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[19] + mi := &file_vega_governance_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2519,7 +2580,7 @@ func (x *NewFreeform) ProtoReflect() protoreflect.Message { // Deprecated: Use NewFreeform.ProtoReflect.Descriptor instead. func (*NewFreeform) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{19} + return file_vega_governance_proto_rawDescGZIP(), []int{20} } // Terms for a governance proposal on Vega @@ -2559,7 +2620,7 @@ type ProposalTerms struct { func (x *ProposalTerms) Reset() { *x = ProposalTerms{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[20] + mi := &file_vega_governance_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2572,7 +2633,7 @@ func (x *ProposalTerms) String() string { func (*ProposalTerms) ProtoMessage() {} func (x *ProposalTerms) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[20] + mi := &file_vega_governance_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2585,7 +2646,7 @@ func (x *ProposalTerms) ProtoReflect() protoreflect.Message { // Deprecated: Use ProposalTerms.ProtoReflect.Descriptor instead. func (*ProposalTerms) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{20} + return file_vega_governance_proto_rawDescGZIP(), []int{21} } func (x *ProposalTerms) GetClosingTimestamp() int64 { @@ -2812,6 +2873,8 @@ type BatchProposalTermsChange struct { // Timestamp as Unix time in seconds when proposal terms gets enacted if proposal passed the vote, // constrained by `minEnact` and `maxEnact` network parameters. EnactmentTimestamp int64 `protobuf:"varint,1,opt,name=enactment_timestamp,json=enactmentTimestamp,proto3" json:"enactment_timestamp,omitempty"` + // Validation timestamp as Unix time in seconds. + ValidationTimestamp int64 `protobuf:"varint,2,opt,name=validation_timestamp,json=validationTimestamp,proto3" json:"validation_timestamp,omitempty"` // Changes being proposed. // // Types that are assignable to Change: @@ -2828,13 +2891,14 @@ type BatchProposalTermsChange struct { // *BatchProposalTermsChange_UpdateMarketState // *BatchProposalTermsChange_UpdateReferralProgram // *BatchProposalTermsChange_UpdateVolumeDiscountProgram + // *BatchProposalTermsChange_NewAsset Change isBatchProposalTermsChange_Change `protobuf_oneof:"change"` } func (x *BatchProposalTermsChange) Reset() { *x = BatchProposalTermsChange{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[21] + mi := &file_vega_governance_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2847,7 +2911,7 @@ func (x *BatchProposalTermsChange) String() string { func (*BatchProposalTermsChange) ProtoMessage() {} func (x *BatchProposalTermsChange) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[21] + mi := &file_vega_governance_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2860,7 +2924,7 @@ func (x *BatchProposalTermsChange) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchProposalTermsChange.ProtoReflect.Descriptor instead. func (*BatchProposalTermsChange) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{21} + return file_vega_governance_proto_rawDescGZIP(), []int{22} } func (x *BatchProposalTermsChange) GetEnactmentTimestamp() int64 { @@ -2870,6 +2934,13 @@ func (x *BatchProposalTermsChange) GetEnactmentTimestamp() int64 { return 0 } +func (x *BatchProposalTermsChange) GetValidationTimestamp() int64 { + if x != nil { + return x.ValidationTimestamp + } + return 0 +} + func (m *BatchProposalTermsChange) GetChange() isBatchProposalTermsChange_Change { if m != nil { return m.Change @@ -2961,6 +3032,13 @@ func (x *BatchProposalTermsChange) GetUpdateVolumeDiscountProgram() *UpdateVolum return nil } +func (x *BatchProposalTermsChange) GetNewAsset() *NewAsset { + if x, ok := x.GetChange().(*BatchProposalTermsChange_NewAsset); ok { + return x.NewAsset + } + return nil +} + type isBatchProposalTermsChange_Change interface { isBatchProposalTermsChange_Change() } @@ -3026,6 +3104,11 @@ type BatchProposalTermsChange_UpdateVolumeDiscountProgram struct { UpdateVolumeDiscountProgram *UpdateVolumeDiscountProgram `protobuf:"bytes,112,opt,name=update_volume_discount_program,json=updateVolumeDiscountProgram,proto3,oneof"` } +type BatchProposalTermsChange_NewAsset struct { + // Proposal change for adding a new asset. + NewAsset *NewAsset `protobuf:"bytes,113,opt,name=new_asset,json=newAsset,proto3,oneof"` +} + func (*BatchProposalTermsChange_UpdateMarket) isBatchProposalTermsChange_Change() {} func (*BatchProposalTermsChange_NewMarket) isBatchProposalTermsChange_Change() {} @@ -3050,6 +3133,8 @@ func (*BatchProposalTermsChange_UpdateReferralProgram) isBatchProposalTermsChang func (*BatchProposalTermsChange_UpdateVolumeDiscountProgram) isBatchProposalTermsChange_Change() {} +func (*BatchProposalTermsChange_NewAsset) isBatchProposalTermsChange_Change() {} + type ProposalParameters struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3082,7 +3167,7 @@ type ProposalParameters struct { func (x *ProposalParameters) Reset() { *x = ProposalParameters{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[22] + mi := &file_vega_governance_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3095,7 +3180,7 @@ func (x *ProposalParameters) String() string { func (*ProposalParameters) ProtoMessage() {} func (x *ProposalParameters) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[22] + mi := &file_vega_governance_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3108,7 +3193,7 @@ func (x *ProposalParameters) ProtoReflect() protoreflect.Message { // Deprecated: Use ProposalParameters.ProtoReflect.Descriptor instead. func (*ProposalParameters) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{22} + return file_vega_governance_proto_rawDescGZIP(), []int{23} } func (x *ProposalParameters) GetMinClose() int64 { @@ -3205,7 +3290,7 @@ type BatchProposalTerms struct { func (x *BatchProposalTerms) Reset() { *x = BatchProposalTerms{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[23] + mi := &file_vega_governance_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3218,7 +3303,7 @@ func (x *BatchProposalTerms) String() string { func (*BatchProposalTerms) ProtoMessage() {} func (x *BatchProposalTerms) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[23] + mi := &file_vega_governance_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3231,7 +3316,7 @@ func (x *BatchProposalTerms) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchProposalTerms.ProtoReflect.Descriptor instead. func (*BatchProposalTerms) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{23} + return file_vega_governance_proto_rawDescGZIP(), []int{24} } func (x *BatchProposalTerms) GetClosingTimestamp() int64 { @@ -3274,7 +3359,7 @@ type ProposalRationale struct { func (x *ProposalRationale) Reset() { *x = ProposalRationale{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[24] + mi := &file_vega_governance_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3287,7 +3372,7 @@ func (x *ProposalRationale) String() string { func (*ProposalRationale) ProtoMessage() {} func (x *ProposalRationale) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[24] + mi := &file_vega_governance_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3300,7 +3385,7 @@ func (x *ProposalRationale) ProtoReflect() protoreflect.Message { // Deprecated: Use ProposalRationale.ProtoReflect.Descriptor instead. func (*ProposalRationale) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{24} + return file_vega_governance_proto_rawDescGZIP(), []int{25} } func (x *ProposalRationale) GetDescription() string { @@ -3346,7 +3431,7 @@ type GovernanceData struct { func (x *GovernanceData) Reset() { *x = GovernanceData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[25] + mi := &file_vega_governance_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3359,7 +3444,7 @@ func (x *GovernanceData) String() string { func (*GovernanceData) ProtoMessage() {} func (x *GovernanceData) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[25] + mi := &file_vega_governance_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3372,7 +3457,7 @@ func (x *GovernanceData) ProtoReflect() protoreflect.Message { // Deprecated: Use GovernanceData.ProtoReflect.Descriptor instead. func (*GovernanceData) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{25} + return file_vega_governance_proto_rawDescGZIP(), []int{26} } func (x *GovernanceData) GetProposal() *Proposal { @@ -3466,7 +3551,7 @@ type Proposal struct { func (x *Proposal) Reset() { *x = Proposal{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[26] + mi := &file_vega_governance_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3479,7 +3564,7 @@ func (x *Proposal) String() string { func (*Proposal) ProtoMessage() {} func (x *Proposal) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[26] + mi := &file_vega_governance_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3492,7 +3577,7 @@ func (x *Proposal) ProtoReflect() protoreflect.Message { // Deprecated: Use Proposal.ProtoReflect.Descriptor instead. func (*Proposal) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{26} + return file_vega_governance_proto_rawDescGZIP(), []int{27} } func (x *Proposal) GetId() string { @@ -3627,7 +3712,7 @@ type Vote struct { func (x *Vote) Reset() { *x = Vote{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[27] + mi := &file_vega_governance_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3640,7 +3725,7 @@ func (x *Vote) String() string { func (*Vote) ProtoMessage() {} func (x *Vote) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[27] + mi := &file_vega_governance_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3653,7 +3738,7 @@ func (x *Vote) ProtoReflect() protoreflect.Message { // Deprecated: Use Vote.ProtoReflect.Descriptor instead. func (*Vote) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{27} + return file_vega_governance_proto_rawDescGZIP(), []int{28} } func (x *Vote) GetPartyId() string { @@ -3726,7 +3811,7 @@ type VoteELSPair struct { func (x *VoteELSPair) Reset() { *x = VoteELSPair{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[28] + mi := &file_vega_governance_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3739,7 +3824,7 @@ func (x *VoteELSPair) String() string { func (*VoteELSPair) ProtoMessage() {} func (x *VoteELSPair) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[28] + mi := &file_vega_governance_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3752,7 +3837,7 @@ func (x *VoteELSPair) ProtoReflect() protoreflect.Message { // Deprecated: Use VoteELSPair.ProtoReflect.Descriptor instead. func (*VoteELSPair) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{28} + return file_vega_governance_proto_rawDescGZIP(), []int{29} } func (x *VoteELSPair) GetMarketId() string { @@ -3781,7 +3866,7 @@ type UpdateVolumeDiscountProgram struct { func (x *UpdateVolumeDiscountProgram) Reset() { *x = UpdateVolumeDiscountProgram{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[29] + mi := &file_vega_governance_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3794,7 +3879,7 @@ func (x *UpdateVolumeDiscountProgram) String() string { func (*UpdateVolumeDiscountProgram) ProtoMessage() {} func (x *UpdateVolumeDiscountProgram) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[29] + mi := &file_vega_governance_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3807,7 +3892,7 @@ func (x *UpdateVolumeDiscountProgram) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateVolumeDiscountProgram.ProtoReflect.Descriptor instead. func (*UpdateVolumeDiscountProgram) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{29} + return file_vega_governance_proto_rawDescGZIP(), []int{30} } func (x *UpdateVolumeDiscountProgram) GetChanges() *VolumeDiscountProgramChanges { @@ -3836,7 +3921,7 @@ type VolumeDiscountProgramChanges struct { func (x *VolumeDiscountProgramChanges) Reset() { *x = VolumeDiscountProgramChanges{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[30] + mi := &file_vega_governance_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3849,7 +3934,7 @@ func (x *VolumeDiscountProgramChanges) String() string { func (*VolumeDiscountProgramChanges) ProtoMessage() {} func (x *VolumeDiscountProgramChanges) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[30] + mi := &file_vega_governance_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3862,7 +3947,7 @@ func (x *VolumeDiscountProgramChanges) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountProgramChanges.ProtoReflect.Descriptor instead. func (*VolumeDiscountProgramChanges) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{30} + return file_vega_governance_proto_rawDescGZIP(), []int{31} } func (x *VolumeDiscountProgramChanges) GetBenefitTiers() []*VolumeBenefitTier { @@ -3898,7 +3983,7 @@ type UpdateReferralProgram struct { func (x *UpdateReferralProgram) Reset() { *x = UpdateReferralProgram{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[31] + mi := &file_vega_governance_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3911,7 +3996,7 @@ func (x *UpdateReferralProgram) String() string { func (*UpdateReferralProgram) ProtoMessage() {} func (x *UpdateReferralProgram) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[31] + mi := &file_vega_governance_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3924,7 +4009,7 @@ func (x *UpdateReferralProgram) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateReferralProgram.ProtoReflect.Descriptor instead. func (*UpdateReferralProgram) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{31} + return file_vega_governance_proto_rawDescGZIP(), []int{32} } func (x *UpdateReferralProgram) GetChanges() *ReferralProgramChanges { @@ -3957,7 +4042,7 @@ type ReferralProgramChanges struct { func (x *ReferralProgramChanges) Reset() { *x = ReferralProgramChanges{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[32] + mi := &file_vega_governance_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3970,7 +4055,7 @@ func (x *ReferralProgramChanges) String() string { func (*ReferralProgramChanges) ProtoMessage() {} func (x *ReferralProgramChanges) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[32] + mi := &file_vega_governance_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3983,7 +4068,7 @@ func (x *ReferralProgramChanges) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralProgramChanges.ProtoReflect.Descriptor instead. func (*ReferralProgramChanges) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{32} + return file_vega_governance_proto_rawDescGZIP(), []int{33} } func (x *ReferralProgramChanges) GetBenefitTiers() []*BenefitTier { @@ -4026,7 +4111,7 @@ type UpdateMarketState struct { func (x *UpdateMarketState) Reset() { *x = UpdateMarketState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[33] + mi := &file_vega_governance_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4039,7 +4124,7 @@ func (x *UpdateMarketState) String() string { func (*UpdateMarketState) ProtoMessage() {} func (x *UpdateMarketState) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[33] + mi := &file_vega_governance_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4052,7 +4137,7 @@ func (x *UpdateMarketState) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateMarketState.ProtoReflect.Descriptor instead. func (*UpdateMarketState) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{33} + return file_vega_governance_proto_rawDescGZIP(), []int{34} } func (x *UpdateMarketState) GetChanges() *UpdateMarketStateConfiguration { @@ -4078,7 +4163,7 @@ type UpdateMarketStateConfiguration struct { func (x *UpdateMarketStateConfiguration) Reset() { *x = UpdateMarketStateConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[34] + mi := &file_vega_governance_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4091,7 +4176,7 @@ func (x *UpdateMarketStateConfiguration) String() string { func (*UpdateMarketStateConfiguration) ProtoMessage() {} func (x *UpdateMarketStateConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[34] + mi := &file_vega_governance_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4104,7 +4189,7 @@ func (x *UpdateMarketStateConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateMarketStateConfiguration.ProtoReflect.Descriptor instead. func (*UpdateMarketStateConfiguration) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{34} + return file_vega_governance_proto_rawDescGZIP(), []int{35} } func (x *UpdateMarketStateConfiguration) GetMarketId() string { @@ -4140,7 +4225,7 @@ type CancelTransfer struct { func (x *CancelTransfer) Reset() { *x = CancelTransfer{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[35] + mi := &file_vega_governance_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4153,7 +4238,7 @@ func (x *CancelTransfer) String() string { func (*CancelTransfer) ProtoMessage() {} func (x *CancelTransfer) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[35] + mi := &file_vega_governance_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4166,7 +4251,7 @@ func (x *CancelTransfer) ProtoReflect() protoreflect.Message { // Deprecated: Use CancelTransfer.ProtoReflect.Descriptor instead. func (*CancelTransfer) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{35} + return file_vega_governance_proto_rawDescGZIP(), []int{36} } func (x *CancelTransfer) GetChanges() *CancelTransferConfiguration { @@ -4188,7 +4273,7 @@ type CancelTransferConfiguration struct { func (x *CancelTransferConfiguration) Reset() { *x = CancelTransferConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[36] + mi := &file_vega_governance_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4201,7 +4286,7 @@ func (x *CancelTransferConfiguration) String() string { func (*CancelTransferConfiguration) ProtoMessage() {} func (x *CancelTransferConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[36] + mi := &file_vega_governance_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4214,7 +4299,7 @@ func (x *CancelTransferConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use CancelTransferConfiguration.ProtoReflect.Descriptor instead. func (*CancelTransferConfiguration) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{36} + return file_vega_governance_proto_rawDescGZIP(), []int{37} } func (x *CancelTransferConfiguration) GetTransferId() string { @@ -4237,7 +4322,7 @@ type NewTransfer struct { func (x *NewTransfer) Reset() { *x = NewTransfer{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[37] + mi := &file_vega_governance_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4250,7 +4335,7 @@ func (x *NewTransfer) String() string { func (*NewTransfer) ProtoMessage() {} func (x *NewTransfer) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[37] + mi := &file_vega_governance_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4263,7 +4348,7 @@ func (x *NewTransfer) ProtoReflect() protoreflect.Message { // Deprecated: Use NewTransfer.ProtoReflect.Descriptor instead. func (*NewTransfer) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{37} + return file_vega_governance_proto_rawDescGZIP(), []int{38} } func (x *NewTransfer) GetChanges() *NewTransferConfiguration { @@ -4311,7 +4396,7 @@ type NewTransferConfiguration struct { func (x *NewTransferConfiguration) Reset() { *x = NewTransferConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[38] + mi := &file_vega_governance_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4324,7 +4409,7 @@ func (x *NewTransferConfiguration) String() string { func (*NewTransferConfiguration) ProtoMessage() {} func (x *NewTransferConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[38] + mi := &file_vega_governance_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4337,7 +4422,7 @@ func (x *NewTransferConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use NewTransferConfiguration.ProtoReflect.Descriptor instead. func (*NewTransferConfiguration) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{38} + return file_vega_governance_proto_rawDescGZIP(), []int{39} } func (x *NewTransferConfiguration) GetSourceType() AccountType { @@ -4446,7 +4531,7 @@ type OneOffTransfer struct { func (x *OneOffTransfer) Reset() { *x = OneOffTransfer{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[39] + mi := &file_vega_governance_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4459,7 +4544,7 @@ func (x *OneOffTransfer) String() string { func (*OneOffTransfer) ProtoMessage() {} func (x *OneOffTransfer) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[39] + mi := &file_vega_governance_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4472,7 +4557,7 @@ func (x *OneOffTransfer) ProtoReflect() protoreflect.Message { // Deprecated: Use OneOffTransfer.ProtoReflect.Descriptor instead. func (*OneOffTransfer) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{39} + return file_vega_governance_proto_rawDescGZIP(), []int{40} } func (x *OneOffTransfer) GetDeliverOn() int64 { @@ -4498,7 +4583,7 @@ type RecurringTransfer struct { func (x *RecurringTransfer) Reset() { *x = RecurringTransfer{} if protoimpl.UnsafeEnabled { - mi := &file_vega_governance_proto_msgTypes[40] + mi := &file_vega_governance_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4511,7 +4596,7 @@ func (x *RecurringTransfer) String() string { func (*RecurringTransfer) ProtoMessage() {} func (x *RecurringTransfer) ProtoReflect() protoreflect.Message { - mi := &file_vega_governance_proto_msgTypes[40] + mi := &file_vega_governance_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4524,7 +4609,7 @@ func (x *RecurringTransfer) ProtoReflect() protoreflect.Message { // Deprecated: Use RecurringTransfer.ProtoReflect.Descriptor instead. func (*RecurringTransfer) Descriptor() ([]byte, []int) { - return file_vega_governance_proto_rawDescGZIP(), []int{40} + return file_vega_governance_proto_rawDescGZIP(), []int{41} } func (x *RecurringTransfer) GetStartEpoch() uint64 { @@ -4557,180 +4642,281 @@ var file_vega_governance_proto_rawDesc = []byte{ 0x1a, 0x16, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 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, 0x61, 0x0a, + 0x67, 0x61, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x4d, 0x0a, 0x0b, 0x53, 0x70, 0x6f, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 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, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x95, 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, 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, 0x69, 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, 0x03, 0x20, 0x01, 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, 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, 0x71, 0x0a, 0x28, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x66, 0x6f, 0x72, 0x5f, - 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 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, 0x23, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x53, 0x70, 0x65, 0x63, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 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, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, - 0x65, 0x67, 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, 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, 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, 0x71, 0x0a, 0x28, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x22, 0x95, 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, + 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, 0x69, 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, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 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, 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, 0x69, 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, 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, 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, + 0x5f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x03, 0x20, 0x01, 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, 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, 0x71, 0x0a, 0x28, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 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, 0x23, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, + 0x63, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 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, + 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 0x7b, 0x0a, 0x26, 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, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 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, 0x23, 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, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 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, 0x29, - 0x0a, 0x27, 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, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xdc, 0x01, 0x0a, 0x17, 0x49, 0x6e, - 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x2d, 0x0a, - 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x48, 0x00, 0x52, 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x12, 0x27, 0x0a, 0x04, - 0x73, 0x70, 0x6f, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x53, 0x70, 0x6f, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, - 0x04, 0x73, 0x70, 0x6f, 0x74, 0x12, 0x36, 0x0a, 0x09, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, - 0x61, 0x6c, 0x18, 0x66, 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, 0xb9, 0x05, 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, 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, + 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, + 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, + 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, 0x71, 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, 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, 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, 0x69, 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, 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, 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, 0x7b, 0x0a, 0x26, 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, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x23, 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, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x29, 0x0a, 0x27, 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, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xdc, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x2d, 0x0a, 0x06, 0x66, 0x75, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x48, 0x00, + 0x52, 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x73, 0x70, 0x6f, 0x74, + 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x70, + 0x6f, 0x74, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, 0x04, 0x73, 0x70, 0x6f, + 0x74, 0x12, 0x36, 0x0a, 0x09, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x18, 0x66, + 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, + 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, 0x30, 0x0a, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x63, 0x69, + 0x6d, 0x61, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x12, 0x70, 0x72, 0x69, 0x63, 0x65, 0x44, 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, 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, 0x05, 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, 0x2e, 0x0a, 0x13, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x64, 0x65, 0x63, + 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x11, 0x73, 0x69, 0x7a, 0x65, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x50, 0x6c, + 0x61, 0x63, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x73, 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x07, 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, 0x08, 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, 0x09, 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, 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, + 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, - 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, 0x05, 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, 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, 0x3b, 0x0a, 0x0a, 0x73, 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x18, 0x07, 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, 0x08, 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, 0x09, 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, 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, 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, + 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, 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, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, + 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, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, + 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, @@ -4741,890 +4927,807 @@ var file_vega_governance_proto_rawDesc = []byte{ 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, 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, 0x9e, 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, + 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, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, + 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, 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, 0x42, 0x11, 0x0a, 0x0f, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x1d, 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, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x18, 0x64, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, - 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x12, 0x3c, 0x0a, 0x09, 0x70, 0x65, 0x72, 0x70, 0x65, - 0x74, 0x75, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 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, 0xf0, 0x02, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x75, 0x74, 0x75, 0x72, - 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x71, 0x75, 0x6f, 0x74, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x71, 0x75, - 0x6f, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x69, 0x0a, 0x24, 0x64, 0x61, 0x74, 0x61, 0x5f, + 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, + 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, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc5, 0x01, + 0x0a, 0x1d, 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, 0x12, + 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, + 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, + 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x48, 0x00, 0x52, 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x12, 0x3c, 0x0a, 0x09, + 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 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, 0xf0, 0x02, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x69, 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, 0x02, 0x20, 0x01, 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, 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, 0x71, 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, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 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, 0x23, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x53, 0x70, 0x65, 0x63, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x54, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 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, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, + 0x65, 0x67, 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, 0xe9, 0x07, 0x0a, 0x16, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 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, 0x02, 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, 0x03, 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, 0x04, 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, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x12, 0x71, 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, + 0x06, 0x20, 0x01, 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, 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, 0x71, 0x0a, 0x28, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x6e, 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, 0x69, 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, 0x07, 0x20, 0x01, 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, 0x23, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, - 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 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, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 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, 0xe9, 0x07, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, - 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 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, 0x02, 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, 0x03, 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, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, - 0x6c, 0x61, 0x6d, 0x70, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x71, - 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, 0x06, 0x20, 0x01, 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, 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, 0x69, 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, 0x07, 0x20, 0x01, 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, 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, 0x08, 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, 0x09, 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, 0x0a, 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, 0x0b, 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, 0x7b, 0x0a, - 0x26, 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, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x23, 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, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x29, 0x0a, 0x27, 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, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x4a, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 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, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x38, 0x0a, 0x08, 0x4e, - 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x07, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x5c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, - 0x73, 0x73, 0x65, 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, - 0x32, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x22, 0x0d, 0x0a, 0x0b, 0x4e, 0x65, 0x77, 0x46, 0x72, 0x65, 0x65, 0x66, 0x6f, - 0x72, 0x6d, 0x22, 0x9c, 0x08, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, - 0x65, 0x72, 0x6d, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x10, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x2f, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, - 0x65, 0x6e, 0x61, 0x63, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x12, 0x31, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x39, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x48, 0x00, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x12, 0x30, 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x66, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x12, 0x58, 0x0a, 0x18, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x67, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x16, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x09, - 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, - 0x00, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x36, 0x0a, 0x0c, 0x6e, - 0x65, 0x77, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x69, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x46, 0x72, 0x65, 0x65, - 0x66, 0x6f, 0x72, 0x6d, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x46, 0x72, 0x65, 0x65, 0x66, - 0x6f, 0x72, 0x6d, 0x12, 0x36, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0b, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x3d, 0x0a, 0x0f, 0x6e, - 0x65, 0x77, 0x5f, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x6b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x53, - 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x6e, 0x65, 0x77, - 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x46, 0x0a, 0x12, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x18, 0x6c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, - 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x12, 0x36, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x4e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x6e, - 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0f, 0x63, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x6e, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 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, 0x49, 0x0a, 0x13, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 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, 0x08, 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, 0x09, 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, 0x0a, 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, 0x0b, 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, 0x7b, 0x0a, 0x26, 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, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x23, 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, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x29, 0x0a, 0x27, 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, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x30, + 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 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, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x22, 0x38, 0x0a, 0x08, 0x4e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x2c, 0x0a, 0x07, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x5c, 0x0a, 0x0b, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 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, 0x32, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x0d, 0x0a, 0x0b, 0x4e, 0x65, 0x77, 0x46, + 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x9c, 0x08, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6c, 0x6f, + 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x12, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x31, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x39, 0x0a, 0x0d, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x4e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x65, + 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x58, 0x0a, 0x18, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x16, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x68, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x12, 0x36, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, + 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, + 0x77, 0x46, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, + 0x46, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x36, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x12, 0x3d, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x4e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, + 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, + 0x46, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, + 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x36, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, + 0x3f, 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 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, 0x49, 0x0a, 0x13, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x55, 0x0a, 0x17, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x70, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x15, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x12, 0x68, 0x0a, 0x1e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 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, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, + 0x1b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x42, 0x08, 0x0a, 0x06, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xfa, 0x07, 0x0a, 0x18, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x12, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x31, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x39, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, + 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x12, 0x58, 0x0a, 0x18, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x16, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x36, + 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x68, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x46, + 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x46, 0x72, + 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x36, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, + 0x00, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x3d, + 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, + 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0d, + 0x6e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x46, 0x0a, + 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x48, 0x00, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x36, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, + 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x3f, 0x0a, + 0x0f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x18, 0x6d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 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, 0x49, + 0x0a, 0x13, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x55, 0x0a, 0x17, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x15, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x12, 0x68, 0x0a, 0x1e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 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, 0x70, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x1b, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x65, + 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, + 0x08, 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x22, 0xeb, 0x03, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, + 0x6e, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, + 0x69, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, + 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x63, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x45, 0x6e, 0x61, 0x63, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x45, 0x6e, 0x61, 0x63, 0x74, 0x12, 0x35, + 0x0a, 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x65, 0x72, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x12, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x6f, 0x74, 0x65, + 0x72, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x6d, 0x69, 0x6e, 0x56, 0x6f, 0x74, 0x65, 0x72, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x70, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x70, 0x12, 0x30, 0x0a, 0x14, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x5f, 0x6c, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x70, 0x12, 0x31, + 0x0a, 0x15, 0x6d, 0x69, 0x6e, 0x5f, 0x65, 0x71, 0x75, 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x69, 0x6b, + 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, + 0x69, 0x6e, 0x45, 0x71, 0x75, 0x69, 0x74, 0x79, 0x4c, 0x69, 0x6b, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x65, 0x22, 0xbe, 0x01, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x73, + 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x41, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x38, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x65, + 0x72, 0x6d, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x22, 0x57, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x4a, + 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xac, 0x04, 0x0a, 0x0e, + 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 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, 0x3f, 0x0a, 0x09, 0x79, 0x65, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x59, 0x65, + 0x73, 0x50, 0x61, 0x72, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x79, 0x65, 0x73, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x08, 0x6e, 0x6f, 0x5f, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4e, 0x6f, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6e, 0x6f, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, + 0x18, 0x07, 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, 0x1a, 0x47, 0x0a, 0x0d, 0x59, 0x65, 0x73, 0x50, 0x61, 0x72, 0x74, 0x79, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x46, 0x0a, 0x0c, 0x4e, 0x6f, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x36, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x10, 0x01, 0x22, 0xa6, 0x08, 0x0a, 0x08, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 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, 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, 0x2a, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 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, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 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, 0x2e, 0x0a, 0x05, 0x74, 0x65, + 0x72, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x48, 0x00, + 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x06, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, + 0x01, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x65, 0x52, 0x09, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x12, 0x35, 0x0a, + 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x12, 0x5e, 0x0a, 0x29, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x26, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x12, 0x54, 0x0a, 0x24, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x04, 0x52, 0x21, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x6a, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0b, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x48, 0x05, 0x52, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x54, + 0x65, 0x72, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x5f, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x07, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x49, 0x64, 0x88, 0x01, 0x01, 0x22, 0xae, 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, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x04, + 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x43, 0x4c, 0x49, 0x4e, + 0x45, 0x44, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, + 0x41, 0x43, 0x54, 0x45, 0x44, 0x10, 0x06, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, + 0x45, 0x5f, 0x56, 0x4f, 0x54, 0x45, 0x10, 0x07, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x74, 0x65, 0x72, + 0x6d, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x10, 0x0a, + 0x0e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, + 0x2c, 0x0a, 0x2a, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x27, 0x0a, + 0x25, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x61, + 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x5f, 0x69, 0x64, 0x22, 0xca, 0x03, 0x0a, 0x04, 0x56, 0x6f, 0x74, 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, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, + 0x74, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, + 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, 0x43, + 0x0a, 0x1e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x47, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x1d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x77, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x42, 0x0a, 0x1e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x65, 0x71, 0x75, 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x69, 0x6b, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, + 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x45, 0x71, 0x75, 0x69, 0x74, 0x79, 0x4c, 0x69, 0x6b, 0x65, 0x53, + 0x68, 0x61, 0x72, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x37, 0x0a, 0x0e, 0x65, 0x6c, + 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x45, 0x4c, + 0x53, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0c, 0x65, 0x6c, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x22, 0x3b, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x15, 0x0a, 0x11, + 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x4e, 0x4f, 0x10, + 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x59, 0x45, 0x53, 0x10, 0x02, + 0x22, 0x3c, 0x0a, 0x0b, 0x56, 0x6f, 0x74, 0x65, 0x45, 0x4c, 0x53, 0x50, 0x61, 0x69, 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, 0x10, 0x0a, 0x03, + 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6c, 0x73, 0x22, 0x5b, + 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x3c, 0x0a, + 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 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, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xba, 0x01, 0x0a, 0x1c, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0d, + 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 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, 0x02, 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, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x4f, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 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, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x16, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x0d, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x5f, + 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 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, 0x02, 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, 0x03, 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, 0x04, 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, 0x53, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x48, 0x00, 0x52, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x55, 0x0a, 0x17, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x18, 0x70, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x15, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x68, 0x0a, - 0x1e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 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, - 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x1b, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x22, 0x98, 0x07, 0x0a, 0x18, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2f, - 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x65, 0x6e, 0x61, - 0x63, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0x39, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x6e, 0x65, - 0x77, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, - 0x00, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x58, 0x0a, 0x18, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x16, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x66, 0x72, - 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x46, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x48, - 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x46, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x36, - 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x69, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x3d, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x70, - 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x46, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, - 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, - 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x10, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x36, 0x0a, - 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x6c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x76, 0x65, 0x67, 0x61, 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, 0x49, 0x0a, 0x13, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x6e, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x11, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x55, 0x0a, 0x17, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x6f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, - 0x00, 0x52, 0x15, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, - 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x68, 0x0a, 0x1e, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 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, 0x70, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x1b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xeb, 0x03, 0x0a, - 0x12, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, - 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x45, 0x6e, 0x61, 0x63, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, - 0x78, 0x5f, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, - 0x61, 0x78, 0x45, 0x6e, 0x61, 0x63, 0x74, 0x12, 0x35, 0x0a, 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, - 0x0a, 0x11, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, - 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x6d, - 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x69, 0x6e, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, - 0x11, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x56, 0x6f, 0x74, - 0x65, 0x72, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x70, 0x12, 0x30, 0x0a, 0x14, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x70, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x6a, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x70, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x69, 0x6e, 0x5f, 0x65, - 0x71, 0x75, 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x69, 0x6b, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x69, 0x6e, 0x45, 0x71, 0x75, 0x69, 0x74, - 0x79, 0x4c, 0x69, 0x6b, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x22, 0xbe, 0x01, 0x0a, 0x12, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, - 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x6c, - 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x41, - 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x38, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x57, 0x0a, 0x11, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, - 0x08, 0x03, 0x10, 0x04, 0x22, 0xac, 0x04, 0x0a, 0x0e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, - 0x6e, 0x63, 0x65, 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, 0x3f, 0x0a, - 0x09, 0x79, 0x65, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, - 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x59, 0x65, 0x73, 0x50, 0x61, 0x72, 0x74, 0x79, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x79, 0x65, 0x73, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x3c, - 0x0a, 0x08, 0x6e, 0x6f, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, - 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4e, 0x6f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x07, 0x6e, 0x6f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0d, - 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, - 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, - 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x09, - 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x18, 0x07, 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, 0x1a, 0x47, 0x0a, 0x0d, 0x59, 0x65, - 0x73, 0x50, 0x61, 0x72, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x20, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x46, 0x0a, 0x0c, 0x4e, 0x6f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x36, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x47, - 0x4c, 0x45, 0x5f, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x54, 0x43, - 0x48, 0x10, 0x01, 0x22, 0xa6, 0x08, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 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, 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, 0x2a, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x04, 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, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 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, 0x2e, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x35, 0x0a, 0x09, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x52, 0x09, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, - 0x11, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x64, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x5e, 0x0a, 0x29, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, - 0x26, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x24, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x21, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x88, 0x01, 0x01, - 0x12, 0x3e, 0x0a, 0x0b, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x48, - 0x05, 0x52, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x88, 0x01, 0x01, - 0x12, 0x1e, 0x0a, 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x06, 0x52, 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x88, 0x01, 0x01, - 0x22, 0xae, 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, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, - 0x44, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x50, 0x45, - 0x4e, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x41, 0x53, - 0x53, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, - 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x44, 0x45, 0x43, 0x4c, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x12, 0x11, 0x0a, - 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x41, 0x43, 0x54, 0x45, 0x44, 0x10, 0x06, - 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, - 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x4f, 0x54, 0x45, 0x10, - 0x07, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, - 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x2c, 0x0a, 0x2a, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x27, 0x0a, 0x25, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x42, - 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x42, - 0x0b, 0x0a, 0x09, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x22, 0xca, 0x03, 0x0a, - 0x04, 0x56, 0x6f, 0x74, 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, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 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, 0x43, 0x0a, 0x1e, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x1b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x1d, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x1a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, - 0x61, 0x6e, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, - 0x42, 0x0a, 0x1e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x71, 0x75, 0x69, 0x74, 0x79, 0x5f, - 0x6c, 0x69, 0x6b, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x45, 0x71, - 0x75, 0x69, 0x74, 0x79, 0x4c, 0x69, 0x6b, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x57, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x37, 0x0a, 0x0e, 0x65, 0x6c, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x45, 0x4c, 0x53, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0c, - 0x65, 0x6c, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x22, 0x3b, 0x0a, 0x05, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, - 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x4e, 0x4f, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x56, 0x41, - 0x4c, 0x55, 0x45, 0x5f, 0x59, 0x45, 0x53, 0x10, 0x02, 0x22, 0x3c, 0x0a, 0x0b, 0x56, 0x6f, 0x74, - 0x65, 0x45, 0x4c, 0x53, 0x50, 0x61, 0x69, 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, 0x10, 0x0a, 0x03, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x65, 0x6c, 0x73, 0x22, 0x5b, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x3c, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 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, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x07, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x22, 0xba, 0x01, 0x0a, 0x1c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, - 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 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, - 0x02, 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, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x22, 0x4f, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 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, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, - 0x0d, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, - 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, 0x02, 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, - 0x03, 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, 0x04, 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, 0x53, 0x0a, 0x11, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x3e, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x22, 0xa0, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 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, 0x3c, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, - 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x22, 0x4d, 0x0a, 0x0e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 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, 0x3c, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x88, 0x01, 0x01, + 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x4d, 0x0a, 0x0e, 0x43, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x07, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x1b, 0x43, 0x61, 0x6e, + 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x47, 0x0a, 0x0b, 0x4e, 0x65, 0x77, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x18, 0x01, 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, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x1b, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 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, 0x47, 0x0a, 0x0b, 0x4e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x12, 0x38, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 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, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xd9, 0x03, 0x0a, 0x18, - 0x4e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 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, 0x79, 0x70, 0x65, - 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 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, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 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, 0x2e, 0x0a, 0x13, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6f, 0x66, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 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, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, - 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 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, 0x37, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, - 0x69, 0x6e, 0x67, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, - 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, 0xc4, 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, 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, 0x2a, - 0xb4, 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, 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, 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, + 0x65, 0x73, 0x22, 0xd9, 0x03, 0x0a, 0x18, 0x4e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x32, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 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, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 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, 0x16, + 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x61, 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, 0x2e, 0x0a, 0x13, + 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x66, 0x5f, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x72, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x10, + 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x07, + 0x6f, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x76, 0x65, 0x67, 0x61, 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, 0x37, 0x0a, + 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 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, + 0xc4, 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, 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, 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, + 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, + 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, 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, + 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, + 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, + 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, - 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, + 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, 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, 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, + 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, } var ( @@ -5640,200 +5743,203 @@ func file_vega_governance_proto_rawDescGZIP() []byte { } var file_vega_governance_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_vega_governance_proto_msgTypes = make([]protoimpl.MessageInfo, 43) +var file_vega_governance_proto_msgTypes = make([]protoimpl.MessageInfo, 44) var file_vega_governance_proto_goTypes = []interface{}{ - (ProposalError)(0), // 0: vega.ProposalError - (MarketStateUpdateType)(0), // 1: vega.MarketStateUpdateType - (GovernanceTransferType)(0), // 2: vega.GovernanceTransferType - (GovernanceData_Type)(0), // 3: vega.GovernanceData.Type - (Proposal_State)(0), // 4: vega.Proposal.State - (Vote_Value)(0), // 5: vega.Vote.Value - (*SpotProduct)(nil), // 6: vega.SpotProduct - (*FutureProduct)(nil), // 7: vega.FutureProduct - (*PerpetualProduct)(nil), // 8: vega.PerpetualProduct - (*InstrumentConfiguration)(nil), // 9: vega.InstrumentConfiguration - (*NewSpotMarketConfiguration)(nil), // 10: vega.NewSpotMarketConfiguration - (*NewMarketConfiguration)(nil), // 11: vega.NewMarketConfiguration - (*NewSpotMarket)(nil), // 12: vega.NewSpotMarket - (*SuccessorConfiguration)(nil), // 13: vega.SuccessorConfiguration - (*NewMarket)(nil), // 14: vega.NewMarket - (*UpdateMarket)(nil), // 15: vega.UpdateMarket - (*UpdateSpotMarket)(nil), // 16: vega.UpdateSpotMarket - (*UpdateMarketConfiguration)(nil), // 17: vega.UpdateMarketConfiguration - (*UpdateSpotMarketConfiguration)(nil), // 18: vega.UpdateSpotMarketConfiguration - (*UpdateInstrumentConfiguration)(nil), // 19: vega.UpdateInstrumentConfiguration - (*UpdateFutureProduct)(nil), // 20: vega.UpdateFutureProduct - (*UpdatePerpetualProduct)(nil), // 21: vega.UpdatePerpetualProduct - (*UpdateNetworkParameter)(nil), // 22: vega.UpdateNetworkParameter - (*NewAsset)(nil), // 23: vega.NewAsset - (*UpdateAsset)(nil), // 24: vega.UpdateAsset - (*NewFreeform)(nil), // 25: vega.NewFreeform - (*ProposalTerms)(nil), // 26: vega.ProposalTerms - (*BatchProposalTermsChange)(nil), // 27: vega.BatchProposalTermsChange - (*ProposalParameters)(nil), // 28: vega.ProposalParameters - (*BatchProposalTerms)(nil), // 29: vega.BatchProposalTerms - (*ProposalRationale)(nil), // 30: vega.ProposalRationale - (*GovernanceData)(nil), // 31: vega.GovernanceData - (*Proposal)(nil), // 32: vega.Proposal - (*Vote)(nil), // 33: vega.Vote - (*VoteELSPair)(nil), // 34: vega.VoteELSPair - (*UpdateVolumeDiscountProgram)(nil), // 35: vega.UpdateVolumeDiscountProgram - (*VolumeDiscountProgramChanges)(nil), // 36: vega.VolumeDiscountProgramChanges - (*UpdateReferralProgram)(nil), // 37: vega.UpdateReferralProgram - (*ReferralProgramChanges)(nil), // 38: vega.ReferralProgramChanges - (*UpdateMarketState)(nil), // 39: vega.UpdateMarketState - (*UpdateMarketStateConfiguration)(nil), // 40: vega.UpdateMarketStateConfiguration - (*CancelTransfer)(nil), // 41: vega.CancelTransfer - (*CancelTransferConfiguration)(nil), // 42: vega.CancelTransferConfiguration - (*NewTransfer)(nil), // 43: vega.NewTransfer - (*NewTransferConfiguration)(nil), // 44: vega.NewTransferConfiguration - (*OneOffTransfer)(nil), // 45: vega.OneOffTransfer - (*RecurringTransfer)(nil), // 46: vega.RecurringTransfer - nil, // 47: vega.GovernanceData.YesPartyEntry - nil, // 48: vega.GovernanceData.NoPartyEntry - (*DataSourceDefinition)(nil), // 49: vega.DataSourceDefinition - (*DataSourceSpecToFutureBinding)(nil), // 50: vega.DataSourceSpecToFutureBinding - (*DataSourceSpecToPerpetualBinding)(nil), // 51: vega.DataSourceSpecToPerpetualBinding - (*CompositePriceConfiguration)(nil), // 52: vega.CompositePriceConfiguration - (*PriceMonitoringParameters)(nil), // 53: vega.PriceMonitoringParameters - (*TargetStakeParameters)(nil), // 54: vega.TargetStakeParameters - (*SimpleModelParams)(nil), // 55: vega.SimpleModelParams - (*LogNormalRiskModel)(nil), // 56: vega.LogNormalRiskModel - (*LiquiditySLAParameters)(nil), // 57: vega.LiquiditySLAParameters - (*LiquidityFeeSettings)(nil), // 58: vega.LiquidityFeeSettings - (*LiquidityMonitoringParameters)(nil), // 59: vega.LiquidityMonitoringParameters - (*LiquidationStrategy)(nil), // 60: vega.LiquidationStrategy - (*NetworkParameter)(nil), // 61: vega.NetworkParameter - (*AssetDetails)(nil), // 62: vega.AssetDetails - (*AssetDetailsUpdate)(nil), // 63: vega.AssetDetailsUpdate - (*VolumeBenefitTier)(nil), // 64: vega.VolumeBenefitTier - (*BenefitTier)(nil), // 65: vega.BenefitTier - (*StakingTier)(nil), // 66: vega.StakingTier - (AccountType)(0), // 67: vega.AccountType - (*DispatchStrategy)(nil), // 68: vega.DispatchStrategy + (ProposalError)(0), // 0: vega.ProposalError + (MarketStateUpdateType)(0), // 1: vega.MarketStateUpdateType + (GovernanceTransferType)(0), // 2: vega.GovernanceTransferType + (GovernanceData_Type)(0), // 3: vega.GovernanceData.Type + (Proposal_State)(0), // 4: vega.Proposal.State + (Vote_Value)(0), // 5: vega.Vote.Value + (*SpotProduct)(nil), // 6: vega.SpotProduct + (*FutureProduct)(nil), // 7: vega.FutureProduct + (*PerpetualProduct)(nil), // 8: vega.PerpetualProduct + (*InstrumentConfiguration)(nil), // 9: vega.InstrumentConfiguration + (*NewSpotMarketConfiguration)(nil), // 10: vega.NewSpotMarketConfiguration + (*NewMarketConfiguration)(nil), // 11: vega.NewMarketConfiguration + (*NewSpotMarket)(nil), // 12: vega.NewSpotMarket + (*SuccessorConfiguration)(nil), // 13: vega.SuccessorConfiguration + (*NewMarket)(nil), // 14: vega.NewMarket + (*UpdateMarket)(nil), // 15: vega.UpdateMarket + (*UpdateSpotMarket)(nil), // 16: vega.UpdateSpotMarket + (*UpdateMarketConfiguration)(nil), // 17: vega.UpdateMarketConfiguration + (*UpdateSpotMarketConfiguration)(nil), // 18: vega.UpdateSpotMarketConfiguration + (*UpdateSpotInstrumentConfiguration)(nil), // 19: vega.UpdateSpotInstrumentConfiguration + (*UpdateInstrumentConfiguration)(nil), // 20: vega.UpdateInstrumentConfiguration + (*UpdateFutureProduct)(nil), // 21: vega.UpdateFutureProduct + (*UpdatePerpetualProduct)(nil), // 22: vega.UpdatePerpetualProduct + (*UpdateNetworkParameter)(nil), // 23: vega.UpdateNetworkParameter + (*NewAsset)(nil), // 24: vega.NewAsset + (*UpdateAsset)(nil), // 25: vega.UpdateAsset + (*NewFreeform)(nil), // 26: vega.NewFreeform + (*ProposalTerms)(nil), // 27: vega.ProposalTerms + (*BatchProposalTermsChange)(nil), // 28: vega.BatchProposalTermsChange + (*ProposalParameters)(nil), // 29: vega.ProposalParameters + (*BatchProposalTerms)(nil), // 30: vega.BatchProposalTerms + (*ProposalRationale)(nil), // 31: vega.ProposalRationale + (*GovernanceData)(nil), // 32: vega.GovernanceData + (*Proposal)(nil), // 33: vega.Proposal + (*Vote)(nil), // 34: vega.Vote + (*VoteELSPair)(nil), // 35: vega.VoteELSPair + (*UpdateVolumeDiscountProgram)(nil), // 36: vega.UpdateVolumeDiscountProgram + (*VolumeDiscountProgramChanges)(nil), // 37: vega.VolumeDiscountProgramChanges + (*UpdateReferralProgram)(nil), // 38: vega.UpdateReferralProgram + (*ReferralProgramChanges)(nil), // 39: vega.ReferralProgramChanges + (*UpdateMarketState)(nil), // 40: vega.UpdateMarketState + (*UpdateMarketStateConfiguration)(nil), // 41: vega.UpdateMarketStateConfiguration + (*CancelTransfer)(nil), // 42: vega.CancelTransfer + (*CancelTransferConfiguration)(nil), // 43: vega.CancelTransferConfiguration + (*NewTransfer)(nil), // 44: vega.NewTransfer + (*NewTransferConfiguration)(nil), // 45: vega.NewTransferConfiguration + (*OneOffTransfer)(nil), // 46: vega.OneOffTransfer + (*RecurringTransfer)(nil), // 47: vega.RecurringTransfer + nil, // 48: vega.GovernanceData.YesPartyEntry + 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 } var file_vega_governance_proto_depIdxs = []int32{ - 49, // 0: vega.FutureProduct.data_source_spec_for_settlement_data:type_name -> vega.DataSourceDefinition - 49, // 1: vega.FutureProduct.data_source_spec_for_trading_termination:type_name -> vega.DataSourceDefinition - 50, // 2: vega.FutureProduct.data_source_spec_binding:type_name -> vega.DataSourceSpecToFutureBinding - 49, // 3: vega.PerpetualProduct.data_source_spec_for_settlement_schedule:type_name -> vega.DataSourceDefinition - 49, // 4: vega.PerpetualProduct.data_source_spec_for_settlement_data:type_name -> vega.DataSourceDefinition - 51, // 5: vega.PerpetualProduct.data_source_spec_binding:type_name -> vega.DataSourceSpecToPerpetualBinding - 52, // 6: vega.PerpetualProduct.internal_composite_price_configuration:type_name -> vega.CompositePriceConfiguration + 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 - 53, // 11: vega.NewSpotMarketConfiguration.price_monitoring_parameters:type_name -> vega.PriceMonitoringParameters - 54, // 12: vega.NewSpotMarketConfiguration.target_stake_parameters:type_name -> vega.TargetStakeParameters - 55, // 13: vega.NewSpotMarketConfiguration.simple:type_name -> vega.SimpleModelParams - 56, // 14: vega.NewSpotMarketConfiguration.log_normal:type_name -> vega.LogNormalRiskModel - 57, // 15: vega.NewSpotMarketConfiguration.sla_params:type_name -> vega.LiquiditySLAParameters - 58, // 16: vega.NewSpotMarketConfiguration.liquidity_fee_settings:type_name -> vega.LiquidityFeeSettings + 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 - 53, // 18: vega.NewMarketConfiguration.price_monitoring_parameters:type_name -> vega.PriceMonitoringParameters - 59, // 19: vega.NewMarketConfiguration.liquidity_monitoring_parameters:type_name -> vega.LiquidityMonitoringParameters - 55, // 20: vega.NewMarketConfiguration.simple:type_name -> vega.SimpleModelParams - 56, // 21: vega.NewMarketConfiguration.log_normal:type_name -> vega.LogNormalRiskModel + 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 - 57, // 23: vega.NewMarketConfiguration.liquidity_sla_parameters:type_name -> vega.LiquiditySLAParameters - 58, // 24: vega.NewMarketConfiguration.liquidity_fee_settings:type_name -> vega.LiquidityFeeSettings - 60, // 25: vega.NewMarketConfiguration.liquidation_strategy:type_name -> vega.LiquidationStrategy - 52, // 26: vega.NewMarketConfiguration.mark_price_configuration:type_name -> vega.CompositePriceConfiguration + 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 - 19, // 31: vega.UpdateMarketConfiguration.instrument:type_name -> vega.UpdateInstrumentConfiguration - 53, // 32: vega.UpdateMarketConfiguration.price_monitoring_parameters:type_name -> vega.PriceMonitoringParameters - 59, // 33: vega.UpdateMarketConfiguration.liquidity_monitoring_parameters:type_name -> vega.LiquidityMonitoringParameters - 55, // 34: vega.UpdateMarketConfiguration.simple:type_name -> vega.SimpleModelParams - 56, // 35: vega.UpdateMarketConfiguration.log_normal:type_name -> vega.LogNormalRiskModel - 57, // 36: vega.UpdateMarketConfiguration.liquidity_sla_parameters:type_name -> vega.LiquiditySLAParameters - 58, // 37: vega.UpdateMarketConfiguration.liquidity_fee_settings:type_name -> vega.LiquidityFeeSettings - 60, // 38: vega.UpdateMarketConfiguration.liquidation_strategy:type_name -> vega.LiquidationStrategy - 52, // 39: vega.UpdateMarketConfiguration.mark_price_configuration:type_name -> vega.CompositePriceConfiguration - 53, // 40: vega.UpdateSpotMarketConfiguration.price_monitoring_parameters:type_name -> vega.PriceMonitoringParameters - 54, // 41: vega.UpdateSpotMarketConfiguration.target_stake_parameters:type_name -> vega.TargetStakeParameters - 55, // 42: vega.UpdateSpotMarketConfiguration.simple:type_name -> vega.SimpleModelParams - 56, // 43: vega.UpdateSpotMarketConfiguration.log_normal:type_name -> vega.LogNormalRiskModel - 57, // 44: vega.UpdateSpotMarketConfiguration.sla_params:type_name -> vega.LiquiditySLAParameters - 58, // 45: vega.UpdateSpotMarketConfiguration.liquidity_fee_settings:type_name -> vega.LiquidityFeeSettings - 20, // 46: vega.UpdateInstrumentConfiguration.future:type_name -> vega.UpdateFutureProduct - 21, // 47: vega.UpdateInstrumentConfiguration.perpetual:type_name -> vega.UpdatePerpetualProduct - 49, // 48: vega.UpdateFutureProduct.data_source_spec_for_settlement_data:type_name -> vega.DataSourceDefinition - 49, // 49: vega.UpdateFutureProduct.data_source_spec_for_trading_termination:type_name -> vega.DataSourceDefinition - 50, // 50: vega.UpdateFutureProduct.data_source_spec_binding:type_name -> vega.DataSourceSpecToFutureBinding - 49, // 51: vega.UpdatePerpetualProduct.data_source_spec_for_settlement_schedule:type_name -> vega.DataSourceDefinition - 49, // 52: vega.UpdatePerpetualProduct.data_source_spec_for_settlement_data:type_name -> vega.DataSourceDefinition - 51, // 53: vega.UpdatePerpetualProduct.data_source_spec_binding:type_name -> vega.DataSourceSpecToPerpetualBinding - 52, // 54: vega.UpdatePerpetualProduct.internal_composite_price_configuration:type_name -> vega.CompositePriceConfiguration - 61, // 55: vega.UpdateNetworkParameter.changes:type_name -> vega.NetworkParameter - 62, // 56: vega.NewAsset.changes:type_name -> vega.AssetDetails - 63, // 57: vega.UpdateAsset.changes:type_name -> vega.AssetDetailsUpdate - 15, // 58: vega.ProposalTerms.update_market:type_name -> vega.UpdateMarket - 14, // 59: vega.ProposalTerms.new_market:type_name -> vega.NewMarket - 22, // 60: vega.ProposalTerms.update_network_parameter:type_name -> vega.UpdateNetworkParameter - 23, // 61: vega.ProposalTerms.new_asset:type_name -> vega.NewAsset - 25, // 62: vega.ProposalTerms.new_freeform:type_name -> vega.NewFreeform - 24, // 63: vega.ProposalTerms.update_asset:type_name -> vega.UpdateAsset - 12, // 64: vega.ProposalTerms.new_spot_market:type_name -> vega.NewSpotMarket - 16, // 65: vega.ProposalTerms.update_spot_market:type_name -> vega.UpdateSpotMarket - 43, // 66: vega.ProposalTerms.new_transfer:type_name -> vega.NewTransfer - 41, // 67: vega.ProposalTerms.cancel_transfer:type_name -> vega.CancelTransfer - 39, // 68: vega.ProposalTerms.update_market_state:type_name -> vega.UpdateMarketState - 37, // 69: vega.ProposalTerms.update_referral_program:type_name -> vega.UpdateReferralProgram - 35, // 70: vega.ProposalTerms.update_volume_discount_program:type_name -> vega.UpdateVolumeDiscountProgram - 15, // 71: vega.BatchProposalTermsChange.update_market:type_name -> vega.UpdateMarket - 14, // 72: vega.BatchProposalTermsChange.new_market:type_name -> vega.NewMarket - 22, // 73: vega.BatchProposalTermsChange.update_network_parameter:type_name -> vega.UpdateNetworkParameter - 25, // 74: vega.BatchProposalTermsChange.new_freeform:type_name -> vega.NewFreeform - 24, // 75: vega.BatchProposalTermsChange.update_asset:type_name -> vega.UpdateAsset - 12, // 76: vega.BatchProposalTermsChange.new_spot_market:type_name -> vega.NewSpotMarket - 16, // 77: vega.BatchProposalTermsChange.update_spot_market:type_name -> vega.UpdateSpotMarket - 43, // 78: vega.BatchProposalTermsChange.new_transfer:type_name -> vega.NewTransfer - 41, // 79: vega.BatchProposalTermsChange.cancel_transfer:type_name -> vega.CancelTransfer - 39, // 80: vega.BatchProposalTermsChange.update_market_state:type_name -> vega.UpdateMarketState - 37, // 81: vega.BatchProposalTermsChange.update_referral_program:type_name -> vega.UpdateReferralProgram - 35, // 82: vega.BatchProposalTermsChange.update_volume_discount_program:type_name -> vega.UpdateVolumeDiscountProgram - 28, // 83: vega.BatchProposalTerms.proposal_params:type_name -> vega.ProposalParameters - 27, // 84: vega.BatchProposalTerms.changes:type_name -> vega.BatchProposalTermsChange - 32, // 85: vega.GovernanceData.proposal:type_name -> vega.Proposal - 33, // 86: vega.GovernanceData.yes:type_name -> vega.Vote - 33, // 87: vega.GovernanceData.no:type_name -> vega.Vote - 47, // 88: vega.GovernanceData.yes_party:type_name -> vega.GovernanceData.YesPartyEntry - 48, // 89: vega.GovernanceData.no_party:type_name -> vega.GovernanceData.NoPartyEntry - 3, // 90: vega.GovernanceData.proposal_type:type_name -> vega.GovernanceData.Type - 32, // 91: vega.GovernanceData.proposals:type_name -> vega.Proposal - 4, // 92: vega.Proposal.state:type_name -> vega.Proposal.State - 26, // 93: vega.Proposal.terms:type_name -> vega.ProposalTerms - 0, // 94: vega.Proposal.reason:type_name -> vega.ProposalError - 30, // 95: vega.Proposal.rationale:type_name -> vega.ProposalRationale - 29, // 96: vega.Proposal.batch_terms:type_name -> vega.BatchProposalTerms - 5, // 97: vega.Vote.value:type_name -> vega.Vote.Value - 34, // 98: vega.Vote.els_per_market:type_name -> vega.VoteELSPair - 36, // 99: vega.UpdateVolumeDiscountProgram.changes:type_name -> vega.VolumeDiscountProgramChanges - 64, // 100: vega.VolumeDiscountProgramChanges.benefit_tiers:type_name -> vega.VolumeBenefitTier - 38, // 101: vega.UpdateReferralProgram.changes:type_name -> vega.ReferralProgramChanges - 65, // 102: vega.ReferralProgramChanges.benefit_tiers:type_name -> vega.BenefitTier - 66, // 103: vega.ReferralProgramChanges.staking_tiers:type_name -> vega.StakingTier - 40, // 104: vega.UpdateMarketState.changes:type_name -> vega.UpdateMarketStateConfiguration - 1, // 105: vega.UpdateMarketStateConfiguration.update_type:type_name -> vega.MarketStateUpdateType - 42, // 106: vega.CancelTransfer.changes:type_name -> vega.CancelTransferConfiguration - 44, // 107: vega.NewTransfer.changes:type_name -> vega.NewTransferConfiguration - 67, // 108: vega.NewTransferConfiguration.source_type:type_name -> vega.AccountType - 2, // 109: vega.NewTransferConfiguration.transfer_type:type_name -> vega.GovernanceTransferType - 67, // 110: vega.NewTransferConfiguration.destination_type:type_name -> vega.AccountType - 45, // 111: vega.NewTransferConfiguration.one_off:type_name -> vega.OneOffTransfer - 46, // 112: vega.NewTransferConfiguration.recurring:type_name -> vega.RecurringTransfer - 68, // 113: vega.RecurringTransfer.dispatch_strategy:type_name -> vega.DispatchStrategy - 33, // 114: vega.GovernanceData.YesPartyEntry.value:type_name -> vega.Vote - 33, // 115: vega.GovernanceData.NoPartyEntry.value:type_name -> vega.Vote - 116, // [116:116] is the sub-list for method output_type - 116, // [116:116] is the sub-list for method input_type - 116, // [116:116] is the sub-list for extension type_name - 116, // [116:116] is the sub-list for extension extendee - 0, // [0:116] is the sub-list for field type_name + 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 } func init() { file_vega_governance_proto_init() } @@ -6003,7 +6109,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateInstrumentConfiguration); i { + switch v := v.(*UpdateSpotInstrumentConfiguration); i { case 0: return &v.state case 1: @@ -6015,7 +6121,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateFutureProduct); i { + switch v := v.(*UpdateInstrumentConfiguration); i { case 0: return &v.state case 1: @@ -6027,7 +6133,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdatePerpetualProduct); i { + switch v := v.(*UpdateFutureProduct); i { case 0: return &v.state case 1: @@ -6039,7 +6145,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNetworkParameter); i { + switch v := v.(*UpdatePerpetualProduct); i { case 0: return &v.state case 1: @@ -6051,7 +6157,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewAsset); i { + switch v := v.(*UpdateNetworkParameter); i { case 0: return &v.state case 1: @@ -6063,7 +6169,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateAsset); i { + switch v := v.(*NewAsset); i { case 0: return &v.state case 1: @@ -6075,7 +6181,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewFreeform); i { + switch v := v.(*UpdateAsset); i { case 0: return &v.state case 1: @@ -6087,7 +6193,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProposalTerms); i { + switch v := v.(*NewFreeform); i { case 0: return &v.state case 1: @@ -6099,7 +6205,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchProposalTermsChange); i { + switch v := v.(*ProposalTerms); i { case 0: return &v.state case 1: @@ -6111,7 +6217,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProposalParameters); i { + switch v := v.(*BatchProposalTermsChange); i { case 0: return &v.state case 1: @@ -6123,7 +6229,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchProposalTerms); i { + switch v := v.(*ProposalParameters); i { case 0: return &v.state case 1: @@ -6135,7 +6241,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProposalRationale); i { + switch v := v.(*BatchProposalTerms); i { case 0: return &v.state case 1: @@ -6147,7 +6253,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GovernanceData); i { + switch v := v.(*ProposalRationale); i { case 0: return &v.state case 1: @@ -6159,7 +6265,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Proposal); i { + switch v := v.(*GovernanceData); i { case 0: return &v.state case 1: @@ -6171,7 +6277,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Vote); i { + switch v := v.(*Proposal); i { case 0: return &v.state case 1: @@ -6183,7 +6289,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VoteELSPair); i { + switch v := v.(*Vote); i { case 0: return &v.state case 1: @@ -6195,7 +6301,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateVolumeDiscountProgram); i { + switch v := v.(*VoteELSPair); i { case 0: return &v.state case 1: @@ -6207,7 +6313,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeDiscountProgramChanges); i { + switch v := v.(*UpdateVolumeDiscountProgram); i { case 0: return &v.state case 1: @@ -6219,7 +6325,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateReferralProgram); i { + switch v := v.(*VolumeDiscountProgramChanges); i { case 0: return &v.state case 1: @@ -6231,7 +6337,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReferralProgramChanges); i { + switch v := v.(*UpdateReferralProgram); i { case 0: return &v.state case 1: @@ -6243,7 +6349,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateMarketState); i { + switch v := v.(*ReferralProgramChanges); i { case 0: return &v.state case 1: @@ -6255,7 +6361,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateMarketStateConfiguration); i { + switch v := v.(*UpdateMarketState); i { case 0: return &v.state case 1: @@ -6267,7 +6373,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CancelTransfer); i { + switch v := v.(*UpdateMarketStateConfiguration); i { case 0: return &v.state case 1: @@ -6279,7 +6385,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CancelTransferConfiguration); i { + switch v := v.(*CancelTransfer); i { case 0: return &v.state case 1: @@ -6291,7 +6397,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewTransfer); i { + switch v := v.(*CancelTransferConfiguration); i { case 0: return &v.state case 1: @@ -6303,7 +6409,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewTransferConfiguration); i { + switch v := v.(*NewTransfer); i { case 0: return &v.state case 1: @@ -6315,7 +6421,7 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OneOffTransfer); i { + switch v := v.(*NewTransferConfiguration); i { case 0: return &v.state case 1: @@ -6327,6 +6433,18 @@ func file_vega_governance_proto_init() { } } file_vega_governance_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OneOffTransfer); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_governance_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RecurringTransfer); i { case 0: return &v.state @@ -6361,12 +6479,12 @@ func file_vega_governance_proto_init() { (*UpdateSpotMarketConfiguration_Simple)(nil), (*UpdateSpotMarketConfiguration_LogNormal)(nil), } - file_vega_governance_proto_msgTypes[13].OneofWrappers = []interface{}{ + file_vega_governance_proto_msgTypes[14].OneofWrappers = []interface{}{ (*UpdateInstrumentConfiguration_Future)(nil), (*UpdateInstrumentConfiguration_Perpetual)(nil), } - file_vega_governance_proto_msgTypes[15].OneofWrappers = []interface{}{} - file_vega_governance_proto_msgTypes[20].OneofWrappers = []interface{}{ + file_vega_governance_proto_msgTypes[16].OneofWrappers = []interface{}{} + file_vega_governance_proto_msgTypes[21].OneofWrappers = []interface{}{ (*ProposalTerms_UpdateMarket)(nil), (*ProposalTerms_NewMarket)(nil), (*ProposalTerms_UpdateNetworkParameter)(nil), @@ -6381,7 +6499,7 @@ func file_vega_governance_proto_init() { (*ProposalTerms_UpdateReferralProgram)(nil), (*ProposalTerms_UpdateVolumeDiscountProgram)(nil), } - file_vega_governance_proto_msgTypes[21].OneofWrappers = []interface{}{ + file_vega_governance_proto_msgTypes[22].OneofWrappers = []interface{}{ (*BatchProposalTermsChange_UpdateMarket)(nil), (*BatchProposalTermsChange_NewMarket)(nil), (*BatchProposalTermsChange_UpdateNetworkParameter)(nil), @@ -6394,21 +6512,22 @@ func file_vega_governance_proto_init() { (*BatchProposalTermsChange_UpdateMarketState)(nil), (*BatchProposalTermsChange_UpdateReferralProgram)(nil), (*BatchProposalTermsChange_UpdateVolumeDiscountProgram)(nil), + (*BatchProposalTermsChange_NewAsset)(nil), } - file_vega_governance_proto_msgTypes[26].OneofWrappers = []interface{}{} - file_vega_governance_proto_msgTypes[34].OneofWrappers = []interface{}{} - file_vega_governance_proto_msgTypes[38].OneofWrappers = []interface{}{ + file_vega_governance_proto_msgTypes[27].OneofWrappers = []interface{}{} + file_vega_governance_proto_msgTypes[35].OneofWrappers = []interface{}{} + file_vega_governance_proto_msgTypes[39].OneofWrappers = []interface{}{ (*NewTransferConfiguration_OneOff)(nil), (*NewTransferConfiguration_Recurring)(nil), } - file_vega_governance_proto_msgTypes[40].OneofWrappers = []interface{}{} + file_vega_governance_proto_msgTypes[41].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vega_governance_proto_rawDesc, NumEnums: 6, - NumMessages: 43, + NumMessages: 44, NumExtensions: 0, NumServices: 0, }, diff --git a/protos/vega/market_ext.go b/protos/vega/market_ext.go index fdbbaee3c0..dfd2e2c100 100644 --- a/protos/vega/market_ext.go +++ b/protos/vega/market_ext.go @@ -29,6 +29,8 @@ func (m *Market) GetAsset() (string, error) { return pimpl.Future.SettlementAsset, nil case *Instrument_Perpetual: return pimpl.Perpetual.SettlementAsset, nil + case *Instrument_Spot: + return pimpl.Spot.QuoteAsset, nil default: return "", ErrUnknownAsset } diff --git a/protos/vega/markets.pb.go b/protos/vega/markets.pb.go index a62d7f5ddd..880f8d2fd6 100644 --- a/protos/vega/markets.pb.go +++ b/protos/vega/markets.pb.go @@ -360,8 +360,6 @@ type Spot struct { BaseAsset string `protobuf:"bytes,1,opt,name=base_asset,json=baseAsset,proto3" json:"base_asset,omitempty"` // Asset ID of the underlying quote asset for the spot product. QuoteAsset string `protobuf:"bytes,2,opt,name=quote_asset,json=quoteAsset,proto3" json:"quote_asset,omitempty"` - // Name of the instrument. - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` } func (x *Spot) Reset() { @@ -410,13 +408,6 @@ func (x *Spot) GetQuoteAsset() string { return "" } -func (x *Spot) GetName() string { - if x != nil { - return x.Name - } - return "" -} - // Future product definition type Future struct { state protoimpl.MessageState @@ -2021,7 +2012,7 @@ type Market struct { TradableInstrument *TradableInstrument `protobuf:"bytes,2,opt,name=tradable_instrument,json=tradableInstrument,proto3" json:"tradable_instrument,omitempty"` // Number of decimal places that a price must be shifted by in order to get a // correct price denominated in the currency of the market, for example: - // `realPrice = price / 10^decimalPlaces`. + // `realPrice = price / 10^decimalPlaces`. On spot markets, also called 'size decimal places'. DecimalPlaces uint64 `protobuf:"varint,3,opt,name=decimal_places,json=decimalPlaces,proto3" json:"decimal_places,omitempty"` // Fees configuration that apply to the market. Fees *Fees `protobuf:"bytes,4,opt,name=fees,proto3" json:"fees,omitempty"` @@ -2039,6 +2030,7 @@ type Market struct { // Timestamps for when the market state changes. MarketTimestamps *MarketTimestamps `protobuf:"bytes,10,opt,name=market_timestamps,json=marketTimestamps,proto3" json:"market_timestamps,omitempty"` // The number of decimal places for a position. + // On spot markets, used for order size, also known as 'size decimal places'. PositionDecimalPlaces int64 `protobuf:"varint,11,opt,name=position_decimal_places,json=positionDecimalPlaces,proto3" json:"position_decimal_places,omitempty"` // Percentage move up and down from the mid price which specifies the range of // price levels over which automated liquidity provisions will be deployed. @@ -2332,6 +2324,9 @@ type LiquidationStrategy struct { FullDisposalSize uint64 `protobuf:"varint,3,opt,name=full_disposal_size,json=fullDisposalSize,proto3" json:"full_disposal_size,omitempty"` // Max fraction of the total volume of the orderbook, within liquidity bounds, that the network can use to close its position; range 0 through 1. MaxFractionConsumed string `protobuf:"bytes,4,opt,name=max_fraction_consumed,json=maxFractionConsumed,proto3" json:"max_fraction_consumed,omitempty"` + // Decimal > 0 specifying the range range above and below the mid price within which the network will trade to dispose of its position. + // The value can be > 1. For example, if set to 1.5, the minimum price will be 0, ie max(0, mid_price * (1 - 1.5)), and the maximum price will be mid_price * (1 + 1.5). + DisposalSlippageRange string `protobuf:"bytes,5,opt,name=disposal_slippage_range,json=disposalSlippageRange,proto3" json:"disposal_slippage_range,omitempty"` } func (x *LiquidationStrategy) Reset() { @@ -2394,6 +2389,13 @@ func (x *LiquidationStrategy) GetMaxFractionConsumed() string { return "" } +func (x *LiquidationStrategy) GetDisposalSlippageRange() string { + if x != nil { + return x.DisposalSlippageRange + } + return "" +} + // Mark price configuration parameters. type CompositePriceConfiguration struct { state protoimpl.MessageState @@ -2518,470 +2520,472 @@ var file_vega_markets_proto_rawDesc = []byte{ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x5a, 0x0a, 0x04, 0x53, 0x70, 0x6f, + 0x04, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x46, 0x0a, 0x04, 0x53, 0x70, 0x6f, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 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, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x82, 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, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x4e, 0x61, 0x6d, 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, 0x03, 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, + 0x74, 0x22, 0x82, 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, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x71, 0x75, 0x6f, + 0x74, 0x65, 0x4e, 0x61, 0x6d, 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, 0x03, + 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, 0x6b, 0x0a, 0x28, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, + 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 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, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, + 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, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, - 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 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, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, - 0x67, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x18, + 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, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x76, 0x65, 0x67, 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, 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, + 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, 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, 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, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x43, 0x0a, 0x11, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x6c, 0x63, 0x75, - 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x10, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x6c, 0x63, 0x75, - 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x15, 0x6c, 0x6f, 0x67, 0x5f, 0x6e, 0x6f, 0x72, - 0x6d, 0x61, 0x6c, 0x5f, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x64, - 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, 0x12, 0x6c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x52, 0x69, 0x73, 0x6b, 0x4d, - 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x43, 0x0a, 0x11, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x72, - 0x69, 0x73, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x69, 0x73, - 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, - 0x52, 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x42, 0x0c, 0x0a, 0x0a, 0x72, 0x69, 0x73, - 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x7d, 0x0a, 0x0a, 0x46, 0x65, 0x65, 0x46, 0x61, - 0x63, 0x74, 0x6f, 0x72, 0x73, 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, 0x22, 0x84, 0x01, 0x0a, 0x04, 0x46, 0x65, 0x65, 0x73, 0x12, - 0x2a, 0x0a, 0x07, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x46, 0x65, 0x65, 0x46, 0x61, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x52, 0x07, 0x66, 0x61, 0x63, 0x74, 0x6f, 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, 0x02, 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, 0x22, 0x81, 0x01, - 0x0a, 0x16, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, - 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x6f, 0x6e, 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, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x10, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x55, 0x0a, 0x19, 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, 0x12, 0x38, - 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 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, 0x08, - 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x22, 0x5a, 0x0a, 0x17, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x3f, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x18, 0x01, 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, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1d, 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, 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, 0x01, 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, 0x29, 0x0a, 0x10, 0x74, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x10, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0xfa, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x53, 0x4c, 0x41, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 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, - 0x3f, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x69, - 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x4d, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x42, 0x0a, 0x1d, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1b, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x6e, 0x63, 0x65, 0x48, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x6c, 0x61, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x65, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x6c, 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x65, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, - 0x22, 0xf8, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x6d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 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, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x12, 0x26, 0x0a, 0x0c, 0x66, 0x65, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x66, 0x65, - 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x22, 0x6c, 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, 0x18, - 0x0a, 0x14, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x41, - 0x4c, 0x5f, 0x43, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x4d, 0x45, 0x54, 0x48, - 0x4f, 0x44, 0x5f, 0x57, 0x45, 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x5f, 0x41, 0x56, 0x45, 0x52, - 0x41, 0x47, 0x45, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, - 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x10, 0x03, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x66, - 0x65, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x22, 0x5f, 0x0a, 0x15, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x18, 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, 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, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x64, - 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x12, - 0x74, 0x72, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x49, 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, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x64, 0x65, 0x63, 0x69, - 0x6d, 0x61, 0x6c, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x04, 0x66, 0x65, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x46, - 0x65, 0x65, 0x73, 0x52, 0x04, 0x66, 0x65, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0f, 0x6f, 0x70, 0x65, - 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x69, - 0x6e, 0x67, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x19, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, + 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, + 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, + 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x11, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x52, + 0x10, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, + 0x72, 0x12, 0x4d, 0x0a, 0x15, 0x6c, 0x6f, 0x67, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x5f, + 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x64, 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, 0x12, 0x6c, 0x6f, + 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x52, 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x12, 0x43, 0x0a, 0x11, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x72, 0x69, 0x73, 0x6b, 0x5f, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x69, 0x73, 0x6b, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x42, 0x0c, 0x0a, 0x0a, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x22, 0x7d, 0x0a, 0x0a, 0x46, 0x65, 0x65, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, + 0x73, 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, 0x22, 0x84, 0x01, 0x0a, 0x04, 0x46, 0x65, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x46, 0x65, 0x65, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x07, + 0x66, 0x61, 0x63, 0x74, 0x6f, 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, 0x02, 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, 0x22, 0x81, 0x01, 0x0a, 0x16, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 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, + 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x61, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, + 0x19, 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, 0x12, 0x38, 0x0a, 0x08, 0x74, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 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, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x17, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 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, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4d, 0x6f, + 0x69, 0x6e, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x73, 0x22, 0x5a, 0x0a, 0x17, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, + 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x3f, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 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, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0xcc, 0x01, 0x0a, 0x1d, 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, 0x3b, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x08, 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, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x28, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 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, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x11, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x52, 0x10, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 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, 0x0b, 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, 0x24, 0x0a, 0x0e, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, - 0x70, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 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, 0x0d, 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, 0x3a, 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, 0x0e, - 0x20, 0x01, 0x28, 0x09, 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, 0x2d, 0x0a, - 0x10, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 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, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, - 0x15, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x46, 0x72, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x73, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x11, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x53, - 0x0a, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x6c, 0x61, 0x5f, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x12, 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, 0x48, 0x03, 0x52, 0x12, 0x6c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x6c, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x88, 0x01, 0x01, 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, 0x13, 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, 0x14, 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, 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, 0xd2, 0x01, 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, 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, + 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, 0x01, 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, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, + 0x69, 0x6f, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x61, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0xfa, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x4c, 0x41, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 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, 0x3f, 0x0a, 0x1c, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, + 0x54, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x1d, + 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x68, 0x79, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x1b, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, + 0x48, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, + 0x12, 0x34, 0x0a, 0x16, 0x73, 0x6c, 0x61, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x65, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x14, 0x73, 0x6c, 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x65, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xf8, 0x01, 0x0a, + 0x14, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 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, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x12, 0x26, 0x0a, 0x0c, 0x66, 0x65, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x66, 0x65, 0x65, 0x43, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x22, 0x6c, 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, 0x18, 0x0a, 0x14, 0x4d, 0x45, + 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x41, 0x4c, 0x5f, 0x43, 0x4f, + 0x53, 0x54, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x57, + 0x45, 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x5f, 0x41, 0x56, 0x45, 0x52, 0x41, 0x47, 0x45, 0x10, + 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x53, + 0x54, 0x41, 0x4e, 0x54, 0x10, 0x03, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x22, 0x5f, 0x0a, 0x15, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, + 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, + 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, + 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x12, 0x74, 0x72, 0x61, 0x64, + 0x61, 0x62, 0x6c, 0x65, 0x49, 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, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x50, + 0x6c, 0x61, 0x63, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x04, 0x66, 0x65, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x46, 0x65, 0x65, 0x73, 0x52, + 0x04, 0x66, 0x65, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, + 0x5f, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x19, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6d, + 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x17, 0x70, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 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, 0x07, 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, 0x3b, 0x0a, + 0x0c, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 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, 0x74, + 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x09, 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, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x11, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x52, 0x10, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 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, 0x0b, 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, 0x24, 0x0a, 0x0e, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x70, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 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, 0x0d, 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, 0x3a, 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, 0x0e, 0x20, 0x01, 0x28, 0x09, + 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, 0x2d, 0x0a, 0x10, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 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, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x15, 0x69, 0x6e, 0x73, + 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x02, 0x52, 0x11, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x53, 0x0a, 0x14, 0x6c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x12, 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, 0x48, 0x03, 0x52, 0x12, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x53, 0x6c, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 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, 0x13, 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, 0x14, 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, 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, } var ( diff --git a/protos/vega/snapshot/v1/snapshot.pb.go b/protos/vega/snapshot/v1/snapshot.pb.go index b20851be96..0c2bd030d7 100644 --- a/protos/vega/snapshot/v1/snapshot.pb.go +++ b/protos/vega/snapshot/v1/snapshot.pb.go @@ -449,7 +449,7 @@ type Payload struct { // *Payload_ProofOfWork // *Payload_PendingAssetUpdates // *Payload_ProtocolUpgradeProposals - // *Payload_BankingBridgeState + // *Payload_BankingPrimaryBridgeState // *Payload_SettlementState // *Payload_LiquidityScores // *Payload_SpotLiquidityTarget @@ -477,6 +477,8 @@ type Payload struct { // *Payload_Parties // *Payload_L2EthOracles // *Payload_EthOracleVerifierMisc + // *Payload_BankingEvmBridgeStates + // *Payload_EvmMultisigTopologies Data isPayload_Data `protobuf_oneof:"data"` } @@ -869,9 +871,9 @@ func (x *Payload) GetProtocolUpgradeProposals() *ProtocolUpgradeProposals { return nil } -func (x *Payload) GetBankingBridgeState() *BankingBridgeState { - if x, ok := x.GetData().(*Payload_BankingBridgeState); ok { - return x.BankingBridgeState +func (x *Payload) GetBankingPrimaryBridgeState() *BankingBridgeState { + if x, ok := x.GetData().(*Payload_BankingPrimaryBridgeState); ok { + return x.BankingPrimaryBridgeState } return nil } @@ -1065,6 +1067,20 @@ func (x *Payload) GetEthOracleVerifierMisc() *EthOracleVerifierMisc { return nil } +func (x *Payload) GetBankingEvmBridgeStates() *BankingEVMBridgeStates { + if x, ok := x.GetData().(*Payload_BankingEvmBridgeStates); ok { + return x.BankingEvmBridgeStates + } + return nil +} + +func (x *Payload) GetEvmMultisigTopologies() *EVMMultisigTopologies { + if x, ok := x.GetData().(*Payload_EvmMultisigTopologies); ok { + return x.EvmMultisigTopologies + } + return nil +} + type isPayload_Data interface { isPayload_Data() } @@ -1269,8 +1285,8 @@ type Payload_ProtocolUpgradeProposals struct { ProtocolUpgradeProposals *ProtocolUpgradeProposals `protobuf:"bytes,55,opt,name=protocol_upgrade_proposals,json=protocolUpgradeProposals,proto3,oneof"` } -type Payload_BankingBridgeState struct { - BankingBridgeState *BankingBridgeState `protobuf:"bytes,56,opt,name=banking_bridge_state,json=bankingBridgeState,proto3,oneof"` +type Payload_BankingPrimaryBridgeState struct { + BankingPrimaryBridgeState *BankingBridgeState `protobuf:"bytes,56,opt,name=banking_primary_bridge_state,json=bankingPrimaryBridgeState,proto3,oneof"` } type Payload_SettlementState struct { @@ -1381,6 +1397,14 @@ type Payload_EthOracleVerifierMisc struct { EthOracleVerifierMisc *EthOracleVerifierMisc `protobuf:"bytes,85,opt,name=eth_oracle_verifier_misc,json=ethOracleVerifierMisc,proto3,oneof"` } +type Payload_BankingEvmBridgeStates struct { + BankingEvmBridgeStates *BankingEVMBridgeStates `protobuf:"bytes,86,opt,name=banking_evm_bridge_states,json=bankingEvmBridgeStates,proto3,oneof"` +} + +type Payload_EvmMultisigTopologies struct { + EvmMultisigTopologies *EVMMultisigTopologies `protobuf:"bytes,87,opt,name=evm_multisig_topologies,json=evmMultisigTopologies,proto3,oneof"` +} + func (*Payload_ActiveAssets) isPayload_Data() {} func (*Payload_PendingAssets) isPayload_Data() {} @@ -1481,7 +1505,7 @@ func (*Payload_PendingAssetUpdates) isPayload_Data() {} func (*Payload_ProtocolUpgradeProposals) isPayload_Data() {} -func (*Payload_BankingBridgeState) isPayload_Data() {} +func (*Payload_BankingPrimaryBridgeState) isPayload_Data() {} func (*Payload_SettlementState) isPayload_Data() {} @@ -1537,6 +1561,10 @@ func (*Payload_L2EthOracles) isPayload_Data() {} func (*Payload_EthOracleVerifierMisc) isPayload_Data() {} +func (*Payload_BankingEvmBridgeStates) isPayload_Data() {} + +func (*Payload_EvmMultisigTopologies) isPayload_Data() {} + type OrderHoldingQuantities struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2411,6 +2439,7 @@ type EventForwarder struct { // this is deprecated, use the other one now AckedEvents []string `protobuf:"bytes,1,rep,name=acked_events,json=ackedEvents,proto3" json:"acked_events,omitempty"` Buckets []*EventForwarderBucket `protobuf:"bytes,2,rep,name=buckets,proto3" json:"buckets,omitempty"` + ChainId string `protobuf:"bytes,3,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (x *EventForwarder) Reset() { @@ -2459,6 +2488,13 @@ func (x *EventForwarder) GetBuckets() []*EventForwarderBucket { return nil } +func (x *EventForwarder) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + type CollateralAccounts struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2821,6 +2857,7 @@ type TxRef struct { BlockNr uint64 `protobuf:"varint,2,opt,name=block_nr,json=blockNr,proto3" json:"block_nr,omitempty"` Hash string `protobuf:"bytes,3,opt,name=hash,proto3" json:"hash,omitempty"` LogIndex uint64 `protobuf:"varint,4,opt,name=log_index,json=logIndex,proto3" json:"log_index,omitempty"` + ChainId string `protobuf:"bytes,5,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (x *TxRef) Reset() { @@ -2883,6 +2920,13 @@ func (x *TxRef) GetLogIndex() uint64 { return 0 } +func (x *TxRef) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + type BankingWithdrawals struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2982,8 +3026,9 @@ type BankingSeen struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Refs []string `protobuf:"bytes,1,rep,name=refs,proto3" json:"refs,omitempty"` - LastSeenEthBlock uint64 `protobuf:"varint,2,opt,name=last_seen_eth_block,json=lastSeenEthBlock,proto3" json:"last_seen_eth_block,omitempty"` + Refs []string `protobuf:"bytes,1,rep,name=refs,proto3" json:"refs,omitempty"` + LastSeenPrimaryEthBlock uint64 `protobuf:"varint,2,opt,name=last_seen_primary_eth_block,json=lastSeenPrimaryEthBlock,proto3" json:"last_seen_primary_eth_block,omitempty"` + LastSeenSecondaryEthBlock uint64 `protobuf:"varint,3,opt,name=last_seen_secondary_eth_block,json=lastSeenSecondaryEthBlock,proto3" json:"last_seen_secondary_eth_block,omitempty"` } func (x *BankingSeen) Reset() { @@ -3025,9 +3070,16 @@ func (x *BankingSeen) GetRefs() []string { return nil } -func (x *BankingSeen) GetLastSeenEthBlock() uint64 { +func (x *BankingSeen) GetLastSeenPrimaryEthBlock() uint64 { + if x != nil { + return x.LastSeenPrimaryEthBlock + } + return 0 +} + +func (x *BankingSeen) GetLastSeenSecondaryEthBlock() uint64 { if x != nil { - return x.LastSeenEthBlock + return x.LastSeenSecondaryEthBlock } return 0 } @@ -3314,6 +3366,53 @@ func (x *BankingBridgeState) GetBridgeState() *v11.BridgeState { return nil } +type BankingEVMBridgeStates struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BridgeStates []*v11.BridgeState `protobuf:"bytes,1,rep,name=bridge_states,json=bridgeStates,proto3" json:"bridge_states,omitempty"` +} + +func (x *BankingEVMBridgeStates) Reset() { + *x = BankingEVMBridgeStates{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BankingEVMBridgeStates) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BankingEVMBridgeStates) ProtoMessage() {} + +func (x *BankingEVMBridgeStates) ProtoReflect() protoreflect.Message { + mi := &file_vega_snapshot_v1_snapshot_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 BankingEVMBridgeStates.ProtoReflect.Descriptor instead. +func (*BankingEVMBridgeStates) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{37} +} + +func (x *BankingEVMBridgeStates) GetBridgeStates() []*v11.BridgeState { + if x != nil { + return x.BridgeStates + } + return nil +} + type Checkpoint struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3325,7 +3424,7 @@ type Checkpoint struct { func (x *Checkpoint) Reset() { *x = Checkpoint{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[37] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3338,7 +3437,7 @@ func (x *Checkpoint) String() string { func (*Checkpoint) ProtoMessage() {} func (x *Checkpoint) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[37] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3351,7 +3450,7 @@ func (x *Checkpoint) ProtoReflect() protoreflect.Message { // Deprecated: Use Checkpoint.ProtoReflect.Descriptor instead. func (*Checkpoint) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{37} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{38} } func (x *Checkpoint) GetNextCp() int64 { @@ -3372,7 +3471,7 @@ type DelegationLastReconciliationTime struct { func (x *DelegationLastReconciliationTime) Reset() { *x = DelegationLastReconciliationTime{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[38] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3385,7 +3484,7 @@ func (x *DelegationLastReconciliationTime) String() string { func (*DelegationLastReconciliationTime) ProtoMessage() {} func (x *DelegationLastReconciliationTime) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[38] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3398,7 +3497,7 @@ func (x *DelegationLastReconciliationTime) ProtoReflect() protoreflect.Message { // Deprecated: Use DelegationLastReconciliationTime.ProtoReflect.Descriptor instead. func (*DelegationLastReconciliationTime) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{38} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{39} } func (x *DelegationLastReconciliationTime) GetLastReconciliationTime() int64 { @@ -3419,7 +3518,7 @@ type DelegationActive struct { func (x *DelegationActive) Reset() { *x = DelegationActive{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[39] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3432,7 +3531,7 @@ func (x *DelegationActive) String() string { func (*DelegationActive) ProtoMessage() {} func (x *DelegationActive) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[39] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3445,7 +3544,7 @@ func (x *DelegationActive) ProtoReflect() protoreflect.Message { // Deprecated: Use DelegationActive.ProtoReflect.Descriptor instead. func (*DelegationActive) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{39} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{40} } func (x *DelegationActive) GetDelegations() []*vega.Delegation { @@ -3467,7 +3566,7 @@ type DelegationPending struct { func (x *DelegationPending) Reset() { *x = DelegationPending{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[40] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3480,7 +3579,7 @@ func (x *DelegationPending) String() string { func (*DelegationPending) ProtoMessage() {} func (x *DelegationPending) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[40] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3493,7 +3592,7 @@ func (x *DelegationPending) ProtoReflect() protoreflect.Message { // Deprecated: Use DelegationPending.ProtoReflect.Descriptor instead. func (*DelegationPending) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{40} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{41} } func (x *DelegationPending) GetDelegations() []*vega.Delegation { @@ -3521,7 +3620,7 @@ type DelegationAuto struct { func (x *DelegationAuto) Reset() { *x = DelegationAuto{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[41] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3534,7 +3633,7 @@ func (x *DelegationAuto) String() string { func (*DelegationAuto) ProtoMessage() {} func (x *DelegationAuto) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[41] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3547,7 +3646,7 @@ func (x *DelegationAuto) ProtoReflect() protoreflect.Message { // Deprecated: Use DelegationAuto.ProtoReflect.Descriptor instead. func (*DelegationAuto) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{41} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{42} } func (x *DelegationAuto) GetParties() []string { @@ -3571,7 +3670,7 @@ type ProposalData struct { func (x *ProposalData) Reset() { *x = ProposalData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[42] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3584,7 +3683,7 @@ func (x *ProposalData) String() string { func (*ProposalData) ProtoMessage() {} func (x *ProposalData) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[42] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3597,7 +3696,7 @@ func (x *ProposalData) ProtoReflect() protoreflect.Message { // Deprecated: Use ProposalData.ProtoReflect.Descriptor instead. func (*ProposalData) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{42} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{43} } func (x *ProposalData) GetProposal() *vega.Proposal { @@ -3639,7 +3738,7 @@ type GovernanceEnacted struct { func (x *GovernanceEnacted) Reset() { *x = GovernanceEnacted{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[43] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3652,7 +3751,7 @@ func (x *GovernanceEnacted) String() string { func (*GovernanceEnacted) ProtoMessage() {} func (x *GovernanceEnacted) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[43] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3665,7 +3764,7 @@ func (x *GovernanceEnacted) ProtoReflect() protoreflect.Message { // Deprecated: Use GovernanceEnacted.ProtoReflect.Descriptor instead. func (*GovernanceEnacted) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{43} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{44} } func (x *GovernanceEnacted) GetProposals() []*ProposalData { @@ -3686,7 +3785,7 @@ type GovernanceActive struct { func (x *GovernanceActive) Reset() { *x = GovernanceActive{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[44] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3699,7 +3798,7 @@ func (x *GovernanceActive) String() string { func (*GovernanceActive) ProtoMessage() {} func (x *GovernanceActive) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[44] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3712,7 +3811,7 @@ func (x *GovernanceActive) ProtoReflect() protoreflect.Message { // Deprecated: Use GovernanceActive.ProtoReflect.Descriptor instead. func (*GovernanceActive) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{44} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{45} } func (x *GovernanceActive) GetProposals() []*ProposalData { @@ -3734,7 +3833,7 @@ type BatchProposalData struct { func (x *BatchProposalData) Reset() { *x = BatchProposalData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[45] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3747,7 +3846,7 @@ func (x *BatchProposalData) String() string { func (*BatchProposalData) ProtoMessage() {} func (x *BatchProposalData) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[45] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3760,7 +3859,7 @@ func (x *BatchProposalData) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchProposalData.ProtoReflect.Descriptor instead. func (*BatchProposalData) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{45} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{46} } func (x *BatchProposalData) GetBatchProposal() *ProposalData { @@ -3788,7 +3887,7 @@ type GovernanceBatchActive struct { func (x *GovernanceBatchActive) Reset() { *x = GovernanceBatchActive{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[46] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3801,7 +3900,7 @@ func (x *GovernanceBatchActive) String() string { func (*GovernanceBatchActive) ProtoMessage() {} func (x *GovernanceBatchActive) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[46] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3814,7 +3913,7 @@ func (x *GovernanceBatchActive) ProtoReflect() protoreflect.Message { // Deprecated: Use GovernanceBatchActive.ProtoReflect.Descriptor instead. func (*GovernanceBatchActive) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{46} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{47} } func (x *GovernanceBatchActive) GetBatchProposals() []*BatchProposalData { @@ -3829,14 +3928,15 @@ type GovernanceNode struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Proposals []*vega.Proposal `protobuf:"bytes,1,rep,name=proposals,proto3" json:"proposals,omitempty"` - ProposalData []*ProposalData `protobuf:"bytes,2,rep,name=proposal_data,json=proposalData,proto3" json:"proposal_data,omitempty"` // includes votes + Proposals []*vega.Proposal `protobuf:"bytes,1,rep,name=proposals,proto3" json:"proposals,omitempty"` + ProposalData []*ProposalData `protobuf:"bytes,2,rep,name=proposal_data,json=proposalData,proto3" json:"proposal_data,omitempty"` // includes votes + BatchProposalData []*BatchProposalData `protobuf:"bytes,3,rep,name=batch_proposal_data,json=batchProposalData,proto3" json:"batch_proposal_data,omitempty"` } func (x *GovernanceNode) Reset() { *x = GovernanceNode{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[47] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3849,7 +3949,7 @@ func (x *GovernanceNode) String() string { func (*GovernanceNode) ProtoMessage() {} func (x *GovernanceNode) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[47] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3862,7 +3962,7 @@ func (x *GovernanceNode) ProtoReflect() protoreflect.Message { // Deprecated: Use GovernanceNode.ProtoReflect.Descriptor instead. func (*GovernanceNode) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{47} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{48} } func (x *GovernanceNode) GetProposals() []*vega.Proposal { @@ -3879,6 +3979,13 @@ func (x *GovernanceNode) GetProposalData() []*ProposalData { return nil } +func (x *GovernanceNode) GetBatchProposalData() []*BatchProposalData { + if x != nil { + return x.BatchProposalData + } + return nil +} + type StakingAccount struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3892,7 +3999,7 @@ type StakingAccount struct { func (x *StakingAccount) Reset() { *x = StakingAccount{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[48] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3905,7 +4012,7 @@ func (x *StakingAccount) String() string { func (*StakingAccount) ProtoMessage() {} func (x *StakingAccount) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[48] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3918,7 +4025,7 @@ func (x *StakingAccount) ProtoReflect() protoreflect.Message { // Deprecated: Use StakingAccount.ProtoReflect.Descriptor instead. func (*StakingAccount) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{48} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{49} } func (x *StakingAccount) GetParty() string { @@ -3955,7 +4062,7 @@ type StakingAccounts struct { func (x *StakingAccounts) Reset() { *x = StakingAccounts{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[49] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3968,7 +4075,7 @@ func (x *StakingAccounts) String() string { func (*StakingAccounts) ProtoMessage() {} func (x *StakingAccounts) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[49] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3981,7 +4088,7 @@ func (x *StakingAccounts) ProtoReflect() protoreflect.Message { // Deprecated: Use StakingAccounts.ProtoReflect.Descriptor instead. func (*StakingAccounts) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{49} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{50} } func (x *StakingAccounts) GetAccounts() []*StakingAccount { @@ -4022,7 +4129,7 @@ type MatchingBook struct { func (x *MatchingBook) Reset() { *x = MatchingBook{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[50] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4035,7 +4142,7 @@ func (x *MatchingBook) String() string { func (*MatchingBook) ProtoMessage() {} func (x *MatchingBook) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[50] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4048,7 +4155,7 @@ func (x *MatchingBook) ProtoReflect() protoreflect.Message { // Deprecated: Use MatchingBook.ProtoReflect.Descriptor instead. func (*MatchingBook) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{50} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{51} } func (x *MatchingBook) GetMarketId() string { @@ -4111,7 +4218,7 @@ type NetParams struct { func (x *NetParams) Reset() { *x = NetParams{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[51] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4124,7 +4231,7 @@ func (x *NetParams) String() string { func (*NetParams) ProtoMessage() {} func (x *NetParams) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[51] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4137,7 +4244,7 @@ func (x *NetParams) ProtoReflect() protoreflect.Message { // Deprecated: Use NetParams.ProtoReflect.Descriptor instead. func (*NetParams) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{51} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{52} } func (x *NetParams) GetParams() []*vega.NetworkParameter { @@ -4159,7 +4266,7 @@ type DecimalMap struct { func (x *DecimalMap) Reset() { *x = DecimalMap{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[52] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4172,7 +4279,7 @@ func (x *DecimalMap) String() string { func (*DecimalMap) ProtoMessage() {} func (x *DecimalMap) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[52] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4185,7 +4292,7 @@ func (x *DecimalMap) ProtoReflect() protoreflect.Message { // Deprecated: Use DecimalMap.ProtoReflect.Descriptor instead. func (*DecimalMap) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{52} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{53} } func (x *DecimalMap) GetKey() int64 { @@ -4214,7 +4321,7 @@ type TimePrice struct { func (x *TimePrice) Reset() { *x = TimePrice{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[53] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4227,7 +4334,7 @@ func (x *TimePrice) String() string { func (*TimePrice) ProtoMessage() {} func (x *TimePrice) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[53] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4240,7 +4347,7 @@ func (x *TimePrice) ProtoReflect() protoreflect.Message { // Deprecated: Use TimePrice.ProtoReflect.Descriptor instead. func (*TimePrice) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{53} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{54} } func (x *TimePrice) GetTime() int64 { @@ -4269,7 +4376,7 @@ type PriceVolume struct { func (x *PriceVolume) Reset() { *x = PriceVolume{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[54] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4282,7 +4389,7 @@ func (x *PriceVolume) String() string { func (*PriceVolume) ProtoMessage() {} func (x *PriceVolume) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[54] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4295,7 +4402,7 @@ func (x *PriceVolume) ProtoReflect() protoreflect.Message { // Deprecated: Use PriceVolume.ProtoReflect.Descriptor instead. func (*PriceVolume) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{54} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{55} } func (x *PriceVolume) GetPrice() string { @@ -4325,7 +4432,7 @@ type PriceRange struct { func (x *PriceRange) Reset() { *x = PriceRange{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[55] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4338,7 +4445,7 @@ func (x *PriceRange) String() string { func (*PriceRange) ProtoMessage() {} func (x *PriceRange) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[55] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4351,7 +4458,7 @@ func (x *PriceRange) ProtoReflect() protoreflect.Message { // Deprecated: Use PriceRange.ProtoReflect.Descriptor instead. func (*PriceRange) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{55} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{56} } func (x *PriceRange) GetMin() string { @@ -4389,7 +4496,7 @@ type PriceBound struct { func (x *PriceBound) Reset() { *x = PriceBound{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[56] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4402,7 +4509,7 @@ func (x *PriceBound) String() string { func (*PriceBound) ProtoMessage() {} func (x *PriceBound) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[56] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4415,7 +4522,7 @@ func (x *PriceBound) ProtoReflect() protoreflect.Message { // Deprecated: Use PriceBound.ProtoReflect.Descriptor instead. func (*PriceBound) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{56} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{57} } func (x *PriceBound) GetActive() bool { @@ -4451,14 +4558,15 @@ type PriceRangeCache struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Bound *PriceBound `protobuf:"bytes,1,opt,name=bound,proto3" json:"bound,omitempty"` - Range *PriceRange `protobuf:"bytes,2,opt,name=range,proto3" json:"range,omitempty"` + Bound *PriceBound `protobuf:"bytes,1,opt,name=bound,proto3" json:"bound,omitempty"` + Range *PriceRange `protobuf:"bytes,2,opt,name=range,proto3" json:"range,omitempty"` + BoundIndex uint64 `protobuf:"varint,3,opt,name=bound_index,json=boundIndex,proto3" json:"bound_index,omitempty"` } func (x *PriceRangeCache) Reset() { *x = PriceRangeCache{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[57] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4471,7 +4579,7 @@ func (x *PriceRangeCache) String() string { func (*PriceRangeCache) ProtoMessage() {} func (x *PriceRangeCache) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[57] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4484,7 +4592,7 @@ func (x *PriceRangeCache) ProtoReflect() protoreflect.Message { // Deprecated: Use PriceRangeCache.ProtoReflect.Descriptor instead. func (*PriceRangeCache) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{57} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{58} } func (x *PriceRangeCache) GetBound() *PriceBound { @@ -4501,6 +4609,13 @@ func (x *PriceRangeCache) GetRange() *PriceRange { return nil } +func (x *PriceRangeCache) GetBoundIndex() uint64 { + if x != nil { + return x.BoundIndex + } + return 0 +} + type CurrentPrice struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4513,7 +4628,7 @@ type CurrentPrice struct { func (x *CurrentPrice) Reset() { *x = CurrentPrice{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[58] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4526,7 +4641,7 @@ func (x *CurrentPrice) String() string { func (*CurrentPrice) ProtoMessage() {} func (x *CurrentPrice) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[58] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4539,7 +4654,7 @@ func (x *CurrentPrice) ProtoReflect() protoreflect.Message { // Deprecated: Use CurrentPrice.ProtoReflect.Descriptor instead. func (*CurrentPrice) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{58} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{59} } func (x *CurrentPrice) GetPrice() string { @@ -4568,7 +4683,7 @@ type PastPrice struct { func (x *PastPrice) Reset() { *x = PastPrice{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[59] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4581,7 +4696,7 @@ func (x *PastPrice) String() string { func (*PastPrice) ProtoMessage() {} func (x *PastPrice) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[59] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4594,7 +4709,7 @@ func (x *PastPrice) ProtoReflect() protoreflect.Message { // Deprecated: Use PastPrice.ProtoReflect.Descriptor instead. func (*PastPrice) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{59} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{60} } func (x *PastPrice) GetTime() int64 { @@ -4633,7 +4748,7 @@ type PriceMonitor struct { func (x *PriceMonitor) Reset() { *x = PriceMonitor{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[60] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4646,7 +4761,7 @@ func (x *PriceMonitor) String() string { func (*PriceMonitor) ProtoMessage() {} func (x *PriceMonitor) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[60] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4659,7 +4774,7 @@ func (x *PriceMonitor) ProtoReflect() protoreflect.Message { // Deprecated: Use PriceMonitor.ProtoReflect.Descriptor instead. func (*PriceMonitor) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{60} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{61} } func (x *PriceMonitor) GetInitialised() bool { @@ -4765,7 +4880,7 @@ type AuctionState struct { func (x *AuctionState) Reset() { *x = AuctionState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[61] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4778,7 +4893,7 @@ func (x *AuctionState) String() string { func (*AuctionState) ProtoMessage() {} func (x *AuctionState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[61] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4791,7 +4906,7 @@ func (x *AuctionState) ProtoReflect() protoreflect.Message { // Deprecated: Use AuctionState.ProtoReflect.Descriptor instead. func (*AuctionState) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{61} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{62} } func (x *AuctionState) GetMode() vega.Market_TradingMode { @@ -4872,7 +4987,7 @@ type EquityShareLP struct { func (x *EquityShareLP) Reset() { *x = EquityShareLP{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[62] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4885,7 +5000,7 @@ func (x *EquityShareLP) String() string { func (*EquityShareLP) ProtoMessage() {} func (x *EquityShareLP) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[62] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4898,7 +5013,7 @@ func (x *EquityShareLP) ProtoReflect() protoreflect.Message { // Deprecated: Use EquityShareLP.ProtoReflect.Descriptor instead. func (*EquityShareLP) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{62} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{63} } func (x *EquityShareLP) GetId() string { @@ -4951,7 +5066,7 @@ type EquityShare struct { func (x *EquityShare) Reset() { *x = EquityShare{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[63] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4964,7 +5079,7 @@ func (x *EquityShare) String() string { func (*EquityShare) ProtoMessage() {} func (x *EquityShare) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[63] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4977,7 +5092,7 @@ func (x *EquityShare) ProtoReflect() protoreflect.Message { // Deprecated: Use EquityShare.ProtoReflect.Descriptor instead. func (*EquityShare) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{63} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{64} } func (x *EquityShare) GetMvp() string { @@ -5029,7 +5144,7 @@ type FeeSplitter struct { func (x *FeeSplitter) Reset() { *x = FeeSplitter{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[64] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5042,7 +5157,7 @@ func (x *FeeSplitter) String() string { func (*FeeSplitter) ProtoMessage() {} func (x *FeeSplitter) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[64] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5055,7 +5170,7 @@ func (x *FeeSplitter) ProtoReflect() protoreflect.Message { // Deprecated: Use FeeSplitter.ProtoReflect.Descriptor instead. func (*FeeSplitter) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{64} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{65} } func (x *FeeSplitter) GetTimeWindowStart() int64 { @@ -5091,33 +5206,35 @@ type SpotMarket struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Market *vega.Market `protobuf:"bytes,1,opt,name=market,proto3" json:"market,omitempty"` - PriceMonitor *PriceMonitor `protobuf:"bytes,2,opt,name=price_monitor,json=priceMonitor,proto3" json:"price_monitor,omitempty"` - AuctionState *AuctionState `protobuf:"bytes,3,opt,name=auction_state,json=auctionState,proto3" json:"auction_state,omitempty"` - PeggedOrders *PeggedOrders `protobuf:"bytes,4,opt,name=pegged_orders,json=peggedOrders,proto3" json:"pegged_orders,omitempty"` - ExpiringOrders []*vega.Order `protobuf:"bytes,5,rep,name=expiring_orders,json=expiringOrders,proto3" json:"expiring_orders,omitempty"` - LastBestBid string `protobuf:"bytes,6,opt,name=last_best_bid,json=lastBestBid,proto3" json:"last_best_bid,omitempty"` - LastBestAsk string `protobuf:"bytes,7,opt,name=last_best_ask,json=lastBestAsk,proto3" json:"last_best_ask,omitempty"` - LastMidBid string `protobuf:"bytes,8,opt,name=last_mid_bid,json=lastMidBid,proto3" json:"last_mid_bid,omitempty"` - LastMidAsk string `protobuf:"bytes,9,opt,name=last_mid_ask,json=lastMidAsk,proto3" json:"last_mid_ask,omitempty"` - LastMarketValueProxy string `protobuf:"bytes,10,opt,name=last_market_value_proxy,json=lastMarketValueProxy,proto3" json:"last_market_value_proxy,omitempty"` - LastEquityShareDistributed int64 `protobuf:"varint,11,opt,name=last_equity_share_distributed,json=lastEquityShareDistributed,proto3" json:"last_equity_share_distributed,omitempty"` - EquityShare *EquityShare `protobuf:"bytes,12,opt,name=equity_share,json=equityShare,proto3" json:"equity_share,omitempty"` - CurrentMarkPrice string `protobuf:"bytes,13,opt,name=current_mark_price,json=currentMarkPrice,proto3" json:"current_mark_price,omitempty"` - FeeSplitter *FeeSplitter `protobuf:"bytes,14,opt,name=fee_splitter,json=feeSplitter,proto3" json:"fee_splitter,omitempty"` - NextMarkToMarket int64 `protobuf:"varint,15,opt,name=next_mark_to_market,json=nextMarkToMarket,proto3" json:"next_mark_to_market,omitempty"` - LastTradedPrice string `protobuf:"bytes,16,opt,name=last_traded_price,json=lastTradedPrice,proto3" json:"last_traded_price,omitempty"` - Parties []string `protobuf:"bytes,17,rep,name=parties,proto3" json:"parties,omitempty"` - Closed bool `protobuf:"varint,18,opt,name=closed,proto3" json:"closed,omitempty"` - StopOrders *StopOrders `protobuf:"bytes,19,opt,name=stop_orders,json=stopOrders,proto3" json:"stop_orders,omitempty"` - ExpiringStopOrders []*vega.Order `protobuf:"bytes,20,rep,name=expiring_stop_orders,json=expiringStopOrders,proto3" json:"expiring_stop_orders,omitempty"` - FeesStats *v12.FeesStats `protobuf:"bytes,21,opt,name=fees_stats,json=feesStats,proto3" json:"fees_stats,omitempty"` + Market *vega.Market `protobuf:"bytes,1,opt,name=market,proto3" json:"market,omitempty"` + PriceMonitor *PriceMonitor `protobuf:"bytes,2,opt,name=price_monitor,json=priceMonitor,proto3" json:"price_monitor,omitempty"` + AuctionState *AuctionState `protobuf:"bytes,3,opt,name=auction_state,json=auctionState,proto3" json:"auction_state,omitempty"` + PeggedOrders *PeggedOrders `protobuf:"bytes,4,opt,name=pegged_orders,json=peggedOrders,proto3" json:"pegged_orders,omitempty"` + ExpiringOrders []*vega.Order `protobuf:"bytes,5,rep,name=expiring_orders,json=expiringOrders,proto3" json:"expiring_orders,omitempty"` + LastBestBid string `protobuf:"bytes,6,opt,name=last_best_bid,json=lastBestBid,proto3" json:"last_best_bid,omitempty"` + LastBestAsk string `protobuf:"bytes,7,opt,name=last_best_ask,json=lastBestAsk,proto3" json:"last_best_ask,omitempty"` + LastMidBid string `protobuf:"bytes,8,opt,name=last_mid_bid,json=lastMidBid,proto3" json:"last_mid_bid,omitempty"` + LastMidAsk string `protobuf:"bytes,9,opt,name=last_mid_ask,json=lastMidAsk,proto3" json:"last_mid_ask,omitempty"` + LastMarketValueProxy string `protobuf:"bytes,10,opt,name=last_market_value_proxy,json=lastMarketValueProxy,proto3" json:"last_market_value_proxy,omitempty"` + LastEquityShareDistributed int64 `protobuf:"varint,11,opt,name=last_equity_share_distributed,json=lastEquityShareDistributed,proto3" json:"last_equity_share_distributed,omitempty"` + EquityShare *EquityShare `protobuf:"bytes,12,opt,name=equity_share,json=equityShare,proto3" json:"equity_share,omitempty"` + CurrentMarkPrice string `protobuf:"bytes,13,opt,name=current_mark_price,json=currentMarkPrice,proto3" json:"current_mark_price,omitempty"` + FeeSplitter *FeeSplitter `protobuf:"bytes,14,opt,name=fee_splitter,json=feeSplitter,proto3" json:"fee_splitter,omitempty"` + NextMarkToMarket int64 `protobuf:"varint,15,opt,name=next_mark_to_market,json=nextMarkToMarket,proto3" json:"next_mark_to_market,omitempty"` + LastTradedPrice string `protobuf:"bytes,16,opt,name=last_traded_price,json=lastTradedPrice,proto3" json:"last_traded_price,omitempty"` + Parties []string `protobuf:"bytes,17,rep,name=parties,proto3" json:"parties,omitempty"` + Closed bool `protobuf:"varint,18,opt,name=closed,proto3" json:"closed,omitempty"` + StopOrders *StopOrders `protobuf:"bytes,19,opt,name=stop_orders,json=stopOrders,proto3" json:"stop_orders,omitempty"` + ExpiringStopOrders []*vega.Order `protobuf:"bytes,20,rep,name=expiring_stop_orders,json=expiringStopOrders,proto3" json:"expiring_stop_orders,omitempty"` + FeesStats *v12.FeesStats `protobuf:"bytes,21,opt,name=fees_stats,json=feesStats,proto3" json:"fees_stats,omitempty"` + HasTraded bool `protobuf:"varint,22,opt,name=has_traded,json=hasTraded,proto3" json:"has_traded,omitempty"` + MarketLiquidity *MarketLiquidity `protobuf:"bytes,23,opt,name=market_liquidity,json=marketLiquidity,proto3" json:"market_liquidity,omitempty"` } func (x *SpotMarket) Reset() { *x = SpotMarket{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[65] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5130,7 +5247,7 @@ func (x *SpotMarket) String() string { func (*SpotMarket) ProtoMessage() {} func (x *SpotMarket) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[65] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5143,7 +5260,7 @@ func (x *SpotMarket) ProtoReflect() protoreflect.Message { // Deprecated: Use SpotMarket.ProtoReflect.Descriptor instead. func (*SpotMarket) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{65} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{66} } func (x *SpotMarket) GetMarket() *vega.Market { @@ -5293,11 +5410,25 @@ func (x *SpotMarket) GetFeesStats() *v12.FeesStats { return nil } -type Market struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - +func (x *SpotMarket) GetHasTraded() bool { + if x != nil { + return x.HasTraded + } + return false +} + +func (x *SpotMarket) GetMarketLiquidity() *MarketLiquidity { + if x != nil { + return x.MarketLiquidity + } + return nil +} + +type Market struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Market *vega.Market `protobuf:"bytes,1,opt,name=market,proto3" json:"market,omitempty"` PriceMonitor *PriceMonitor `protobuf:"bytes,2,opt,name=price_monitor,json=priceMonitor,proto3" json:"price_monitor,omitempty"` AuctionState *AuctionState `protobuf:"bytes,3,opt,name=auction_state,json=auctionState,proto3" json:"auction_state,omitempty"` @@ -5329,12 +5460,13 @@ type Market struct { MarkPriceCalculator *CompositePriceCalculator `protobuf:"bytes,29,opt,name=mark_price_calculator,json=markPriceCalculator,proto3" json:"mark_price_calculator,omitempty"` 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"` } func (x *Market) Reset() { *x = Market{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[66] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5347,7 +5479,7 @@ func (x *Market) String() string { func (*Market) ProtoMessage() {} func (x *Market) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[66] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5360,7 +5492,7 @@ func (x *Market) ProtoReflect() protoreflect.Message { // Deprecated: Use Market.ProtoReflect.Descriptor instead. func (*Market) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{66} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{67} } func (x *Market) GetMarket() *vega.Market { @@ -5580,6 +5712,13 @@ func (x *Market) GetNextInternalCompositePriceCalc() int64 { return 0 } +func (x *Market) GetMarketLiquidity() *MarketLiquidity { + if x != nil { + return x.MarketLiquidity + } + return nil +} + type PartyMarginFactor struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5592,7 +5731,7 @@ type PartyMarginFactor struct { func (x *PartyMarginFactor) Reset() { *x = PartyMarginFactor{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[67] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5605,7 +5744,7 @@ func (x *PartyMarginFactor) String() string { func (*PartyMarginFactor) ProtoMessage() {} func (x *PartyMarginFactor) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[67] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5618,7 +5757,7 @@ func (x *PartyMarginFactor) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyMarginFactor.ProtoReflect.Descriptor instead. func (*PartyMarginFactor) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{67} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{68} } func (x *PartyMarginFactor) GetParty() string { @@ -5650,7 +5789,7 @@ type Product struct { func (x *Product) Reset() { *x = Product{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[68] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5663,7 +5802,7 @@ func (x *Product) String() string { func (*Product) ProtoMessage() {} func (x *Product) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[68] + 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 { @@ -5676,7 +5815,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{68} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{69} } func (m *Product) GetType() isProduct_Type { @@ -5715,7 +5854,7 @@ type DataPoint struct { func (x *DataPoint) Reset() { *x = DataPoint{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[69] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5728,7 +5867,7 @@ func (x *DataPoint) String() string { func (*DataPoint) ProtoMessage() {} func (x *DataPoint) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[69] + 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 { @@ -5741,7 +5880,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{69} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{70} } func (x *DataPoint) GetPrice() string { @@ -5771,7 +5910,7 @@ type AuctionIntervals struct { func (x *AuctionIntervals) Reset() { *x = AuctionIntervals{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[70] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5784,7 +5923,7 @@ func (x *AuctionIntervals) String() string { func (*AuctionIntervals) ProtoMessage() {} func (x *AuctionIntervals) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[70] + 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 { @@ -5797,7 +5936,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{70} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{71} } func (x *AuctionIntervals) GetT() []int64 { @@ -5834,7 +5973,7 @@ type TWAPData struct { func (x *TWAPData) Reset() { *x = TWAPData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[71] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5847,7 +5986,7 @@ func (x *TWAPData) String() string { func (*TWAPData) ProtoMessage() {} func (x *TWAPData) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[71] + 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 { @@ -5860,7 +5999,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{71} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{72} } func (x *TWAPData) GetStart() int64 { @@ -5902,7 +6041,7 @@ type Perps struct { func (x *Perps) Reset() { *x = Perps{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[72] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5915,7 +6054,7 @@ func (x *Perps) String() string { func (*Perps) ProtoMessage() {} func (x *Perps) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[72] + 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 { @@ -5928,7 +6067,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{72} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{73} } func (x *Perps) GetId() string { @@ -5999,7 +6138,7 @@ type OrdersAtPrice struct { func (x *OrdersAtPrice) Reset() { *x = OrdersAtPrice{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[73] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6012,7 +6151,7 @@ func (x *OrdersAtPrice) String() string { func (*OrdersAtPrice) ProtoMessage() {} func (x *OrdersAtPrice) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[73] + 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 { @@ -6025,7 +6164,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{73} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{74} } func (x *OrdersAtPrice) GetPrice() string { @@ -6054,7 +6193,7 @@ type PricedStopOrders struct { func (x *PricedStopOrders) Reset() { *x = PricedStopOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[74] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6067,7 +6206,7 @@ func (x *PricedStopOrders) String() string { func (*PricedStopOrders) ProtoMessage() {} func (x *PricedStopOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[74] + 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 { @@ -6080,7 +6219,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{74} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{75} } func (x *PricedStopOrders) GetFallsBellow() []*OrdersAtPrice { @@ -6110,7 +6249,7 @@ type TrailingStopOrders struct { func (x *TrailingStopOrders) Reset() { *x = TrailingStopOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[75] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6123,7 +6262,7 @@ func (x *TrailingStopOrders) String() string { func (*TrailingStopOrders) ProtoMessage() {} func (x *TrailingStopOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[75] + 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 { @@ -6136,7 +6275,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{75} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{76} } func (x *TrailingStopOrders) GetLastSeenPrice() string { @@ -6172,7 +6311,7 @@ type OrdersAtOffset struct { func (x *OrdersAtOffset) Reset() { *x = OrdersAtOffset{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[76] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6185,7 +6324,7 @@ func (x *OrdersAtOffset) String() string { func (*OrdersAtOffset) ProtoMessage() {} func (x *OrdersAtOffset) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[76] + 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 { @@ -6198,7 +6337,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{76} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{77} } func (x *OrdersAtOffset) GetOffset() string { @@ -6227,7 +6366,7 @@ type OffsetsAtPrice struct { func (x *OffsetsAtPrice) Reset() { *x = OffsetsAtPrice{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[77] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6240,7 +6379,7 @@ func (x *OffsetsAtPrice) String() string { func (*OffsetsAtPrice) ProtoMessage() {} func (x *OffsetsAtPrice) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[77] + 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 { @@ -6253,7 +6392,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{77} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{78} } func (x *OffsetsAtPrice) GetPrice() string { @@ -6283,7 +6422,7 @@ type StopOrders struct { func (x *StopOrders) Reset() { *x = StopOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[78] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6296,7 +6435,7 @@ func (x *StopOrders) String() string { func (*StopOrders) ProtoMessage() {} func (x *StopOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[78] + 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 { @@ -6309,7 +6448,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{78} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{79} } func (x *StopOrders) GetStopOrders() []*v12.StopOrderEvent { @@ -6344,7 +6483,7 @@ type PeggedOrders struct { func (x *PeggedOrders) Reset() { *x = PeggedOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[79] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6357,7 +6496,7 @@ func (x *PeggedOrders) String() string { func (*PeggedOrders) ProtoMessage() {} func (x *PeggedOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[79] + 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 { @@ -6370,7 +6509,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{79} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{80} } func (x *PeggedOrders) GetParkedOrders() []*vega.Order { @@ -6397,7 +6536,7 @@ type SLANetworkParams struct { func (x *SLANetworkParams) Reset() { *x = SLANetworkParams{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[80] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6410,7 +6549,7 @@ func (x *SLANetworkParams) String() string { func (*SLANetworkParams) ProtoMessage() {} func (x *SLANetworkParams) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[80] + 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 { @@ -6423,7 +6562,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{80} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{81} } func (x *SLANetworkParams) GetBondPenaltyFactor() string { @@ -6491,7 +6630,7 @@ type ExecutionMarkets struct { func (x *ExecutionMarkets) Reset() { *x = ExecutionMarkets{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[81] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6504,7 +6643,7 @@ func (x *ExecutionMarkets) String() string { func (*ExecutionMarkets) ProtoMessage() {} func (x *ExecutionMarkets) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[81] + 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 { @@ -6517,7 +6656,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{81} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{82} } func (x *ExecutionMarkets) GetMarkets() []*Market { @@ -6574,7 +6713,7 @@ type Successors struct { func (x *Successors) Reset() { *x = Successors{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[82] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6587,7 +6726,7 @@ func (x *Successors) String() string { func (*Successors) ProtoMessage() {} func (x *Successors) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[82] + 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 { @@ -6600,7 +6739,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{82} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{83} } func (x *Successors) GetParentMarket() string { @@ -6636,7 +6775,7 @@ type Position struct { func (x *Position) Reset() { *x = Position{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[83] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6649,7 +6788,7 @@ func (x *Position) String() string { func (*Position) ProtoMessage() {} func (x *Position) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[83] + 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 { @@ -6662,7 +6801,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{83} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{84} } func (x *Position) GetPartyId() string { @@ -6741,7 +6880,7 @@ type MarketPositions struct { func (x *MarketPositions) Reset() { *x = MarketPositions{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[84] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6754,7 +6893,7 @@ func (x *MarketPositions) String() string { func (*MarketPositions) ProtoMessage() {} func (x *MarketPositions) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[84] + 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 { @@ -6767,7 +6906,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{84} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{85} } func (x *MarketPositions) GetMarketId() string { @@ -6805,7 +6944,7 @@ type PartyPositionStats struct { func (x *PartyPositionStats) Reset() { *x = PartyPositionStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[85] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6818,7 +6957,7 @@ func (x *PartyPositionStats) String() string { func (*PartyPositionStats) ProtoMessage() {} func (x *PartyPositionStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[85] + 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 { @@ -6831,7 +6970,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{85} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{86} } func (x *PartyPositionStats) GetParty() string { @@ -6876,7 +7015,7 @@ type SettlementState struct { func (x *SettlementState) Reset() { *x = SettlementState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[86] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6889,7 +7028,7 @@ func (x *SettlementState) String() string { func (*SettlementState) ProtoMessage() {} func (x *SettlementState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[86] + 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 { @@ -6902,7 +7041,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{86} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{87} } func (x *SettlementState) GetMarketId() string { @@ -6945,7 +7084,7 @@ type LastSettledPosition struct { func (x *LastSettledPosition) Reset() { *x = LastSettledPosition{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[87] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6958,7 +7097,7 @@ func (x *LastSettledPosition) String() string { func (*LastSettledPosition) ProtoMessage() {} func (x *LastSettledPosition) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[87] + 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 { @@ -6971,7 +7110,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{87} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{88} } func (x *LastSettledPosition) GetParty() string { @@ -7003,7 +7142,7 @@ type SettlementTrade struct { func (x *SettlementTrade) Reset() { *x = SettlementTrade{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[88] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7016,7 +7155,7 @@ func (x *SettlementTrade) String() string { func (*SettlementTrade) ProtoMessage() {} func (x *SettlementTrade) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[88] + 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 { @@ -7029,7 +7168,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{88} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{89} } func (x *SettlementTrade) GetPartyId() string { @@ -7083,7 +7222,7 @@ type AppState struct { func (x *AppState) Reset() { *x = AppState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[89] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7096,7 +7235,7 @@ func (x *AppState) String() string { func (*AppState) ProtoMessage() {} func (x *AppState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[89] + 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 { @@ -7109,7 +7248,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{89} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{90} } func (x *AppState) GetHeight() uint64 { @@ -7175,7 +7314,7 @@ type EpochState struct { func (x *EpochState) Reset() { *x = EpochState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[90] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7188,7 +7327,7 @@ func (x *EpochState) String() string { func (*EpochState) ProtoMessage() {} func (x *EpochState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[90] + 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 { @@ -7201,7 +7340,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{90} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{91} } func (x *EpochState) GetSeq() uint64 { @@ -7250,7 +7389,7 @@ type RewardsPendingPayouts struct { func (x *RewardsPendingPayouts) Reset() { *x = RewardsPendingPayouts{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[91] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7263,7 +7402,7 @@ func (x *RewardsPendingPayouts) String() string { func (*RewardsPendingPayouts) ProtoMessage() {} func (x *RewardsPendingPayouts) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[91] + 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 { @@ -7276,7 +7415,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{91} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{92} } func (x *RewardsPendingPayouts) GetScheduledRewardsPayout() []*ScheduledRewardsPayout { @@ -7298,7 +7437,7 @@ type ScheduledRewardsPayout struct { func (x *ScheduledRewardsPayout) Reset() { *x = ScheduledRewardsPayout{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[92] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7311,7 +7450,7 @@ func (x *ScheduledRewardsPayout) String() string { func (*ScheduledRewardsPayout) ProtoMessage() {} func (x *ScheduledRewardsPayout) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[92] + 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 { @@ -7324,7 +7463,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{92} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{93} } func (x *ScheduledRewardsPayout) GetPayoutTime() int64 { @@ -7357,7 +7496,7 @@ type RewardsPayout struct { func (x *RewardsPayout) Reset() { *x = RewardsPayout{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[93] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7370,7 +7509,7 @@ func (x *RewardsPayout) String() string { func (*RewardsPayout) ProtoMessage() {} func (x *RewardsPayout) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[93] + 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 { @@ -7383,7 +7522,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{93} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{94} } func (x *RewardsPayout) GetFromAccount() string { @@ -7440,7 +7579,7 @@ type RewardsPartyAmount struct { func (x *RewardsPartyAmount) Reset() { *x = RewardsPartyAmount{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[94] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7453,7 +7592,7 @@ func (x *RewardsPartyAmount) String() string { func (*RewardsPartyAmount) ProtoMessage() {} func (x *RewardsPartyAmount) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[94] + 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 { @@ -7466,7 +7605,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{94} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{95} } func (x *RewardsPartyAmount) GetParty() string { @@ -7509,7 +7648,7 @@ type LimitState struct { func (x *LimitState) Reset() { *x = LimitState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[95] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7522,7 +7661,7 @@ func (x *LimitState) String() string { func (*LimitState) ProtoMessage() {} func (x *LimitState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[95] + 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 { @@ -7535,7 +7674,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{95} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{96} } func (x *LimitState) GetBlockCount() uint32 { @@ -7626,7 +7765,7 @@ type VoteSpamPolicy struct { func (x *VoteSpamPolicy) Reset() { *x = VoteSpamPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[96] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7639,7 +7778,7 @@ func (x *VoteSpamPolicy) String() string { func (*VoteSpamPolicy) ProtoMessage() {} func (x *VoteSpamPolicy) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[96] + 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 { @@ -7652,7 +7791,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{96} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{97} } func (x *VoteSpamPolicy) GetPartyToVote() []*PartyProposalVoteCount { @@ -7724,7 +7863,7 @@ type PartyProposalVoteCount struct { func (x *PartyProposalVoteCount) Reset() { *x = PartyProposalVoteCount{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[97] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7737,7 +7876,7 @@ func (x *PartyProposalVoteCount) String() string { func (*PartyProposalVoteCount) ProtoMessage() {} func (x *PartyProposalVoteCount) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[97] + 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 { @@ -7750,7 +7889,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{97} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{98} } func (x *PartyProposalVoteCount) GetParty() string { @@ -7786,7 +7925,7 @@ type PartyTokenBalance struct { func (x *PartyTokenBalance) Reset() { *x = PartyTokenBalance{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[98] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7799,7 +7938,7 @@ func (x *PartyTokenBalance) String() string { func (*PartyTokenBalance) ProtoMessage() {} func (x *PartyTokenBalance) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[98] + 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 { @@ -7812,7 +7951,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{98} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{99} } func (x *PartyTokenBalance) GetParty() string { @@ -7841,7 +7980,7 @@ type BlockRejectStats struct { func (x *BlockRejectStats) Reset() { *x = BlockRejectStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[99] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7854,7 +7993,7 @@ func (x *BlockRejectStats) String() string { func (*BlockRejectStats) ProtoMessage() {} func (x *BlockRejectStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[99] + 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 { @@ -7867,7 +8006,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{99} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{100} } func (x *BlockRejectStats) GetRejected() uint64 { @@ -7896,7 +8035,7 @@ type SpamPartyTransactionCount struct { func (x *SpamPartyTransactionCount) Reset() { *x = SpamPartyTransactionCount{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[100] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7909,7 +8048,7 @@ func (x *SpamPartyTransactionCount) String() string { func (*SpamPartyTransactionCount) ProtoMessage() {} func (x *SpamPartyTransactionCount) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[100] + 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 { @@ -7922,7 +8061,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{100} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{101} } func (x *SpamPartyTransactionCount) GetParty() string { @@ -7954,7 +8093,7 @@ type SimpleSpamPolicy struct { func (x *SimpleSpamPolicy) Reset() { *x = SimpleSpamPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[101] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7967,7 +8106,7 @@ func (x *SimpleSpamPolicy) String() string { func (*SimpleSpamPolicy) ProtoMessage() {} func (x *SimpleSpamPolicy) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[101] + 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 { @@ -7980,7 +8119,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{101} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{102} } func (x *SimpleSpamPolicy) GetPolicyName() string { @@ -8033,7 +8172,7 @@ type NotarySigs struct { func (x *NotarySigs) Reset() { *x = NotarySigs{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[102] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8046,7 +8185,7 @@ func (x *NotarySigs) String() string { func (*NotarySigs) ProtoMessage() {} func (x *NotarySigs) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[102] + 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 { @@ -8059,7 +8198,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{102} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{103} } func (x *NotarySigs) GetId() string { @@ -8108,7 +8247,7 @@ type Notary struct { func (x *Notary) Reset() { *x = Notary{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[103] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8121,7 +8260,7 @@ func (x *Notary) String() string { func (*Notary) ProtoMessage() {} func (x *Notary) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[103] + 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 { @@ -8134,7 +8273,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{103} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{104} } func (x *Notary) GetNotarySigs() []*NotarySigs { @@ -8155,7 +8294,7 @@ type StakeVerifierDeposited struct { func (x *StakeVerifierDeposited) Reset() { *x = StakeVerifierDeposited{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[104] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8168,7 +8307,7 @@ func (x *StakeVerifierDeposited) String() string { func (*StakeVerifierDeposited) ProtoMessage() {} func (x *StakeVerifierDeposited) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[104] + 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 { @@ -8181,7 +8320,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{104} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{105} } func (x *StakeVerifierDeposited) GetPendingDeposited() []*StakeVerifierPending { @@ -8202,7 +8341,7 @@ type StakeVerifierRemoved struct { func (x *StakeVerifierRemoved) Reset() { *x = StakeVerifierRemoved{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[105] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8215,7 +8354,7 @@ func (x *StakeVerifierRemoved) String() string { func (*StakeVerifierRemoved) ProtoMessage() {} func (x *StakeVerifierRemoved) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[105] + 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 { @@ -8228,7 +8367,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{105} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{106} } func (x *StakeVerifierRemoved) GetPendingRemoved() []*StakeVerifierPending { @@ -8256,7 +8395,7 @@ type StakeVerifierPending struct { func (x *StakeVerifierPending) Reset() { *x = StakeVerifierPending{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[106] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8269,7 +8408,7 @@ func (x *StakeVerifierPending) String() string { func (*StakeVerifierPending) ProtoMessage() {} func (x *StakeVerifierPending) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[106] + 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 { @@ -8282,7 +8421,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{106} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{107} } func (x *StakeVerifierPending) GetEthereumAddress() string { @@ -8352,7 +8491,7 @@ type L2EthOracles struct { func (x *L2EthOracles) Reset() { *x = L2EthOracles{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[107] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8365,7 +8504,7 @@ func (x *L2EthOracles) String() string { func (*L2EthOracles) ProtoMessage() {} func (x *L2EthOracles) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[107] + 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 { @@ -8378,7 +8517,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{107} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{108} } func (x *L2EthOracles) GetChainIdEthOracles() []*ChainIdEthOracles { @@ -8402,7 +8541,7 @@ type ChainIdEthOracles struct { func (x *ChainIdEthOracles) Reset() { *x = ChainIdEthOracles{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[108] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8415,7 +8554,7 @@ func (x *ChainIdEthOracles) String() string { func (*ChainIdEthOracles) ProtoMessage() {} func (x *ChainIdEthOracles) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[108] + 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 { @@ -8428,7 +8567,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{108} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{109} } func (x *ChainIdEthOracles) GetSourceChainId() string { @@ -8471,7 +8610,7 @@ type EthOracleVerifierLastBlock struct { func (x *EthOracleVerifierLastBlock) Reset() { *x = EthOracleVerifierLastBlock{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[109] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8484,7 +8623,7 @@ func (x *EthOracleVerifierLastBlock) String() string { func (*EthOracleVerifierLastBlock) ProtoMessage() {} func (x *EthOracleVerifierLastBlock) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[109] + 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 { @@ -8497,7 +8636,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{109} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{110} } func (x *EthOracleVerifierLastBlock) GetBlockHeight() uint64 { @@ -8526,7 +8665,7 @@ type EthOracleVerifierMisc struct { func (x *EthOracleVerifierMisc) Reset() { *x = EthOracleVerifierMisc{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[110] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8539,7 +8678,7 @@ func (x *EthOracleVerifierMisc) String() string { func (*EthOracleVerifierMisc) ProtoMessage() {} func (x *EthOracleVerifierMisc) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[110] + 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 { @@ -8552,7 +8691,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{110} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{111} } func (x *EthOracleVerifierMisc) GetBuckets() []*EthVerifierBucket { @@ -8580,7 +8719,7 @@ type EthContractCallResults struct { func (x *EthContractCallResults) Reset() { *x = EthContractCallResults{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[111] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8593,7 +8732,7 @@ func (x *EthContractCallResults) String() string { func (*EthContractCallResults) ProtoMessage() {} func (x *EthContractCallResults) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[111] + 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 { @@ -8606,7 +8745,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{111} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{112} } func (x *EthContractCallResults) GetPendingContractCallResult() []*EthContractCallResult { @@ -8632,7 +8771,7 @@ type EthContractCallResult struct { func (x *EthContractCallResult) Reset() { *x = EthContractCallResult{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[112] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8645,7 +8784,7 @@ func (x *EthContractCallResult) String() string { func (*EthContractCallResult) ProtoMessage() {} func (x *EthContractCallResult) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[112] + 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 { @@ -8658,7 +8797,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{112} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{113} } func (x *EthContractCallResult) GetBlockHeight() uint64 { @@ -8715,7 +8854,7 @@ type EthVerifierBucket struct { func (x *EthVerifierBucket) Reset() { *x = EthVerifierBucket{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[113] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8728,7 +8867,7 @@ func (x *EthVerifierBucket) String() string { func (*EthVerifierBucket) ProtoMessage() {} func (x *EthVerifierBucket) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[113] + 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 { @@ -8741,7 +8880,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{113} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{114} } func (x *EthVerifierBucket) GetTs() int64 { @@ -8772,7 +8911,7 @@ type PendingKeyRotation struct { func (x *PendingKeyRotation) Reset() { *x = PendingKeyRotation{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[114] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8785,7 +8924,7 @@ func (x *PendingKeyRotation) String() string { func (*PendingKeyRotation) ProtoMessage() {} func (x *PendingKeyRotation) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[114] + 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 { @@ -8798,7 +8937,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{114} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{115} } func (x *PendingKeyRotation) GetBlockHeight() uint64 { @@ -8844,7 +8983,7 @@ type PendingEthereumKeyRotation struct { func (x *PendingEthereumKeyRotation) Reset() { *x = PendingEthereumKeyRotation{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[115] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8857,7 +8996,7 @@ func (x *PendingEthereumKeyRotation) String() string { func (*PendingEthereumKeyRotation) ProtoMessage() {} func (x *PendingEthereumKeyRotation) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[115] + 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 { @@ -8870,7 +9009,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{115} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{116} } func (x *PendingEthereumKeyRotation) GetBlockHeight() uint64 { @@ -8925,7 +9064,7 @@ type Topology struct { func (x *Topology) Reset() { *x = Topology{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[116] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8938,7 +9077,7 @@ func (x *Topology) String() string { func (*Topology) ProtoMessage() {} func (x *Topology) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[116] + 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 { @@ -8951,7 +9090,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{116} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{117} } func (x *Topology) GetValidatorData() []*ValidatorState { @@ -9015,7 +9154,7 @@ type ToplogySignatures struct { func (x *ToplogySignatures) Reset() { *x = ToplogySignatures{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[117] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9028,7 +9167,7 @@ func (x *ToplogySignatures) String() string { func (*ToplogySignatures) ProtoMessage() {} func (x *ToplogySignatures) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[117] + 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 { @@ -9041,7 +9180,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{117} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{118} } func (x *ToplogySignatures) GetPendingSignatures() []*PendingERC20MultisigControlSignature { @@ -9073,7 +9212,7 @@ type PendingERC20MultisigControlSignature struct { func (x *PendingERC20MultisigControlSignature) Reset() { *x = PendingERC20MultisigControlSignature{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[118] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9086,7 +9225,7 @@ func (x *PendingERC20MultisigControlSignature) String() string { func (*PendingERC20MultisigControlSignature) ProtoMessage() {} func (x *PendingERC20MultisigControlSignature) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[118] + 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 { @@ -9099,7 +9238,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{118} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{119} } func (x *PendingERC20MultisigControlSignature) GetNodeId() string { @@ -9145,12 +9284,13 @@ type IssuedERC20MultisigControlSignature struct { ResourceId string `protobuf:"bytes,1,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` EthereumAddress string `protobuf:"bytes,2,opt,name=ethereum_address,json=ethereumAddress,proto3" json:"ethereum_address,omitempty"` SubmitterAddress string `protobuf:"bytes,3,opt,name=submitter_address,json=submitterAddress,proto3" json:"submitter_address,omitempty"` + ChainId string `protobuf:"bytes,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (x *IssuedERC20MultisigControlSignature) Reset() { *x = IssuedERC20MultisigControlSignature{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[119] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9163,7 +9303,7 @@ func (x *IssuedERC20MultisigControlSignature) String() string { func (*IssuedERC20MultisigControlSignature) ProtoMessage() {} func (x *IssuedERC20MultisigControlSignature) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[119] + 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 { @@ -9176,7 +9316,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{119} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{120} } func (x *IssuedERC20MultisigControlSignature) GetResourceId() string { @@ -9200,6 +9340,13 @@ func (x *IssuedERC20MultisigControlSignature) GetSubmitterAddress() string { return "" } +func (x *IssuedERC20MultisigControlSignature) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + type ValidatorState struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9219,7 +9366,7 @@ type ValidatorState struct { func (x *ValidatorState) Reset() { *x = ValidatorState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[120] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9232,7 +9379,7 @@ func (x *ValidatorState) String() string { func (*ValidatorState) ProtoMessage() {} func (x *ValidatorState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[120] + 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 { @@ -9245,7 +9392,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{120} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{121} } func (x *ValidatorState) GetValidatorUpdate() *v12.ValidatorUpdate { @@ -9325,7 +9472,7 @@ type HeartbeatTracker struct { func (x *HeartbeatTracker) Reset() { *x = HeartbeatTracker{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[121] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9338,7 +9485,7 @@ func (x *HeartbeatTracker) String() string { func (*HeartbeatTracker) ProtoMessage() {} func (x *HeartbeatTracker) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[121] + 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 { @@ -9351,7 +9498,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{121} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{122} } func (x *HeartbeatTracker) GetExpectedNextHash() string { @@ -9399,7 +9546,7 @@ type PerformanceStats struct { func (x *PerformanceStats) Reset() { *x = PerformanceStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[122] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9412,7 +9559,7 @@ func (x *PerformanceStats) String() string { func (*PerformanceStats) ProtoMessage() {} func (x *PerformanceStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[122] + 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 { @@ -9425,7 +9572,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{122} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{123} } func (x *PerformanceStats) GetValidatorAddress() string { @@ -9488,7 +9635,7 @@ type ValidatorPerformance struct { func (x *ValidatorPerformance) Reset() { *x = ValidatorPerformance{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[123] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9501,7 +9648,7 @@ func (x *ValidatorPerformance) String() string { func (*ValidatorPerformance) ProtoMessage() {} func (x *ValidatorPerformance) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[123] + 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 { @@ -9514,7 +9661,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{123} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{124} } func (x *ValidatorPerformance) GetValidatorPerfStats() []*PerformanceStats { @@ -9539,7 +9686,7 @@ type LiquidityParameters struct { func (x *LiquidityParameters) Reset() { *x = LiquidityParameters{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[124] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9552,7 +9699,7 @@ func (x *LiquidityParameters) String() string { func (*LiquidityParameters) ProtoMessage() {} func (x *LiquidityParameters) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[124] + 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 { @@ -9565,7 +9712,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{124} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{125} } func (x *LiquidityParameters) GetMaxFee() string { @@ -9609,7 +9756,7 @@ type LiquidityPendingProvisions struct { func (x *LiquidityPendingProvisions) Reset() { *x = LiquidityPendingProvisions{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[125] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9622,7 +9769,7 @@ func (x *LiquidityPendingProvisions) String() string { func (*LiquidityPendingProvisions) ProtoMessage() {} func (x *LiquidityPendingProvisions) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[125] + 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 { @@ -9635,7 +9782,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{125} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{126} } func (x *LiquidityPendingProvisions) GetPendingProvisions() []string { @@ -9665,7 +9812,7 @@ type LiquidityPartiesLiquidityOrders struct { func (x *LiquidityPartiesLiquidityOrders) Reset() { *x = LiquidityPartiesLiquidityOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[126] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9678,7 +9825,7 @@ func (x *LiquidityPartiesLiquidityOrders) String() string { func (*LiquidityPartiesLiquidityOrders) ProtoMessage() {} func (x *LiquidityPartiesLiquidityOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[126] + 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 { @@ -9691,7 +9838,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{126} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{127} } func (x *LiquidityPartiesLiquidityOrders) GetPartyOrders() []*PartyOrders { @@ -9720,7 +9867,7 @@ type PartyOrders struct { func (x *PartyOrders) Reset() { *x = PartyOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[127] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9733,7 +9880,7 @@ func (x *PartyOrders) String() string { func (*PartyOrders) ProtoMessage() {} func (x *PartyOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[127] + 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 { @@ -9746,7 +9893,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{127} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{128} } func (x *PartyOrders) GetParty() string { @@ -9776,7 +9923,7 @@ type LiquidityPartiesOrders struct { func (x *LiquidityPartiesOrders) Reset() { *x = LiquidityPartiesOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[128] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9789,7 +9936,7 @@ func (x *LiquidityPartiesOrders) String() string { func (*LiquidityPartiesOrders) ProtoMessage() {} func (x *LiquidityPartiesOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[128] + 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 { @@ -9802,7 +9949,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{128} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{129} } func (x *LiquidityPartiesOrders) GetPartyOrders() []*PartyOrders { @@ -9832,7 +9979,7 @@ type LiquidityProvisions struct { func (x *LiquidityProvisions) Reset() { *x = LiquidityProvisions{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[129] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9845,7 +9992,7 @@ func (x *LiquidityProvisions) String() string { func (*LiquidityProvisions) ProtoMessage() {} func (x *LiquidityProvisions) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[129] + 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 { @@ -9858,7 +10005,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{129} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{130} } func (x *LiquidityProvisions) GetLiquidityProvisions() []*vega.LiquidityProvision { @@ -9888,7 +10035,7 @@ type LiquidityScores struct { func (x *LiquidityScores) Reset() { *x = LiquidityScores{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[130] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9901,7 +10048,7 @@ func (x *LiquidityScores) String() string { func (*LiquidityScores) ProtoMessage() {} func (x *LiquidityScores) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[130] + 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 { @@ -9914,7 +10061,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{130} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{131} } func (x *LiquidityScores) GetRunningAverageCounter() int32 { @@ -9950,7 +10097,7 @@ type LiquidityScore struct { func (x *LiquidityScore) Reset() { *x = LiquidityScore{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[131] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9963,7 +10110,7 @@ func (x *LiquidityScore) String() string { func (*LiquidityScore) ProtoMessage() {} func (x *LiquidityScore) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[131] + 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 { @@ -9976,7 +10123,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{131} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{132} } func (x *LiquidityScore) GetScore() string { @@ -10013,7 +10160,7 @@ type LiquidityV2Parameters struct { func (x *LiquidityV2Parameters) Reset() { *x = LiquidityV2Parameters{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[132] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10026,7 +10173,7 @@ func (x *LiquidityV2Parameters) String() string { func (*LiquidityV2Parameters) ProtoMessage() {} func (x *LiquidityV2Parameters) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[132] + 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 { @@ -10039,7 +10186,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{132} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{133} } func (x *LiquidityV2Parameters) GetMarketId() string { @@ -10090,7 +10237,7 @@ type LiquidityV2PaidFeesStats struct { func (x *LiquidityV2PaidFeesStats) Reset() { *x = LiquidityV2PaidFeesStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[133] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10103,7 +10250,7 @@ func (x *LiquidityV2PaidFeesStats) String() string { func (*LiquidityV2PaidFeesStats) ProtoMessage() {} func (x *LiquidityV2PaidFeesStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[133] + 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 { @@ -10116,7 +10263,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{133} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{134} } func (x *LiquidityV2PaidFeesStats) GetMarketId() string { @@ -10146,7 +10293,7 @@ type LiquidityV2Provisions struct { func (x *LiquidityV2Provisions) Reset() { *x = LiquidityV2Provisions{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[134] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10159,7 +10306,7 @@ func (x *LiquidityV2Provisions) String() string { func (*LiquidityV2Provisions) ProtoMessage() {} func (x *LiquidityV2Provisions) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[134] + 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 { @@ -10172,7 +10319,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{134} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{135} } func (x *LiquidityV2Provisions) GetMarketId() string { @@ -10202,7 +10349,7 @@ type LiquidityV2PendingProvisions struct { func (x *LiquidityV2PendingProvisions) Reset() { *x = LiquidityV2PendingProvisions{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[135] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10215,7 +10362,7 @@ func (x *LiquidityV2PendingProvisions) String() string { func (*LiquidityV2PendingProvisions) ProtoMessage() {} func (x *LiquidityV2PendingProvisions) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[135] + 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 { @@ -10228,7 +10375,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{135} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{136} } func (x *LiquidityV2PendingProvisions) GetMarketId() string { @@ -10259,7 +10406,7 @@ type LiquidityV2Performances struct { func (x *LiquidityV2Performances) Reset() { *x = LiquidityV2Performances{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[136] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10272,7 +10419,7 @@ func (x *LiquidityV2Performances) String() string { func (*LiquidityV2Performances) ProtoMessage() {} func (x *LiquidityV2Performances) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[136] + 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 { @@ -10285,7 +10432,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{136} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{137} } func (x *LiquidityV2Performances) GetMarketId() string { @@ -10330,7 +10477,7 @@ type LiquidityV2PerformancePerParty struct { func (x *LiquidityV2PerformancePerParty) Reset() { *x = LiquidityV2PerformancePerParty{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[137] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10343,7 +10490,7 @@ func (x *LiquidityV2PerformancePerParty) String() string { func (*LiquidityV2PerformancePerParty) ProtoMessage() {} func (x *LiquidityV2PerformancePerParty) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[137] + 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 { @@ -10356,7 +10503,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{137} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{138} } func (x *LiquidityV2PerformancePerParty) GetParty() string { @@ -10452,7 +10599,7 @@ type LiquidityV2Scores struct { func (x *LiquidityV2Scores) Reset() { *x = LiquidityV2Scores{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[138] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10465,7 +10612,7 @@ func (x *LiquidityV2Scores) String() string { func (*LiquidityV2Scores) ProtoMessage() {} func (x *LiquidityV2Scores) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[138] + 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 { @@ -10478,7 +10625,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{138} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{139} } func (x *LiquidityV2Scores) GetMarketId() string { @@ -10531,7 +10678,7 @@ type LiquidityV2Supplied struct { func (x *LiquidityV2Supplied) Reset() { *x = LiquidityV2Supplied{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[139] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10544,7 +10691,7 @@ func (x *LiquidityV2Supplied) String() string { func (*LiquidityV2Supplied) ProtoMessage() {} func (x *LiquidityV2Supplied) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[139] + 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 { @@ -10557,7 +10704,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{139} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{140} } func (x *LiquidityV2Supplied) GetMarketId() string { @@ -10601,7 +10748,7 @@ type FloatingPointConsensus struct { func (x *FloatingPointConsensus) Reset() { *x = FloatingPointConsensus{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[140] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10614,7 +10761,7 @@ func (x *FloatingPointConsensus) String() string { func (*FloatingPointConsensus) ProtoMessage() {} func (x *FloatingPointConsensus) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[140] + 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 { @@ -10627,7 +10774,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{140} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{141} } func (x *FloatingPointConsensus) GetNextTimeTrigger() []*NextTimeTrigger { @@ -10659,7 +10806,7 @@ type StateVarInternalState struct { func (x *StateVarInternalState) Reset() { *x = StateVarInternalState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[141] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10672,7 +10819,7 @@ func (x *StateVarInternalState) String() string { func (*StateVarInternalState) ProtoMessage() {} func (x *StateVarInternalState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[141] + 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 { @@ -10685,7 +10832,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{141} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{142} } func (x *StateVarInternalState) GetId() string { @@ -10735,7 +10882,7 @@ type FloatingPointValidatorResult struct { func (x *FloatingPointValidatorResult) Reset() { *x = FloatingPointValidatorResult{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[142] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10748,7 +10895,7 @@ func (x *FloatingPointValidatorResult) String() string { func (*FloatingPointValidatorResult) ProtoMessage() {} func (x *FloatingPointValidatorResult) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[142] + 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 { @@ -10761,7 +10908,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{142} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{143} } func (x *FloatingPointValidatorResult) GetId() string { @@ -10792,7 +10939,7 @@ type NextTimeTrigger struct { func (x *NextTimeTrigger) Reset() { *x = NextTimeTrigger{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[143] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10805,7 +10952,7 @@ func (x *NextTimeTrigger) String() string { func (*NextTimeTrigger) ProtoMessage() {} func (x *NextTimeTrigger) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[143] + 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 { @@ -10818,7 +10965,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{143} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{144} } func (x *NextTimeTrigger) GetAsset() string { @@ -10857,12 +11004,13 @@ type MarketTracker struct { MarketActivity []*v11.MarketActivityTracker `protobuf:"bytes,1,rep,name=market_activity,json=marketActivity,proto3" json:"market_activity,omitempty"` TakerNotionalVolume []*v11.TakerNotionalVolume `protobuf:"bytes,2,rep,name=taker_notional_volume,json=takerNotionalVolume,proto3" json:"taker_notional_volume,omitempty"` MarketToPartyTakerNotionalVolume []*v11.MarketToPartyTakerNotionalVolume `protobuf:"bytes,3,rep,name=market_to_party_taker_notional_volume,json=marketToPartyTakerNotionalVolume,proto3" json:"market_to_party_taker_notional_volume,omitempty"` + EpochTakerFees []*v11.EpochPartyTakerFees `protobuf:"bytes,4,rep,name=epoch_taker_fees,json=epochTakerFees,proto3" json:"epoch_taker_fees,omitempty"` } func (x *MarketTracker) Reset() { *x = MarketTracker{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[144] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10875,7 +11023,7 @@ func (x *MarketTracker) String() string { func (*MarketTracker) ProtoMessage() {} func (x *MarketTracker) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[144] + 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 { @@ -10888,7 +11036,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{144} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{145} } func (x *MarketTracker) GetMarketActivity() []*v11.MarketActivityTracker { @@ -10912,6 +11060,13 @@ func (x *MarketTracker) GetMarketToPartyTakerNotionalVolume() []*v11.MarketToPar return nil } +func (x *MarketTracker) GetEpochTakerFees() []*v11.EpochPartyTakerFees { + if x != nil { + return x.EpochTakerFees + } + return nil +} + type SignerEventsPerAddress struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -10924,7 +11079,7 @@ type SignerEventsPerAddress struct { func (x *SignerEventsPerAddress) Reset() { *x = SignerEventsPerAddress{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[145] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10937,7 +11092,7 @@ func (x *SignerEventsPerAddress) String() string { func (*SignerEventsPerAddress) ProtoMessage() {} func (x *SignerEventsPerAddress) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[145] + 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 { @@ -10950,7 +11105,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{145} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{146} } func (x *SignerEventsPerAddress) GetAddress() string { @@ -10981,7 +11136,7 @@ type ERC20MultiSigTopologyVerified struct { func (x *ERC20MultiSigTopologyVerified) Reset() { *x = ERC20MultiSigTopologyVerified{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[146] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10994,7 +11149,7 @@ func (x *ERC20MultiSigTopologyVerified) String() string { func (*ERC20MultiSigTopologyVerified) ProtoMessage() {} func (x *ERC20MultiSigTopologyVerified) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[146] + 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 { @@ -11007,7 +11162,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{146} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{147} } func (x *ERC20MultiSigTopologyVerified) GetSigners() []string { @@ -11052,7 +11207,7 @@ type ERC20MultiSigTopologyPending struct { func (x *ERC20MultiSigTopologyPending) Reset() { *x = ERC20MultiSigTopologyPending{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[147] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11065,7 +11220,7 @@ func (x *ERC20MultiSigTopologyPending) String() string { func (*ERC20MultiSigTopologyPending) ProtoMessage() {} func (x *ERC20MultiSigTopologyPending) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[147] + 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 { @@ -11078,7 +11233,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{147} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{148} } func (x *ERC20MultiSigTopologyPending) GetPendingSigners() []*v12.ERC20MultiSigSignerEvent { @@ -11109,6 +11264,116 @@ func (x *ERC20MultiSigTopologyPending) GetWitnessedThresholdSets() []string { return nil } +type EVMMultisigTopology 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"` + Verified *ERC20MultiSigTopologyVerified `protobuf:"bytes,2,opt,name=verified,proto3" json:"verified,omitempty"` + Pending *ERC20MultiSigTopologyPending `protobuf:"bytes,3,opt,name=pending,proto3" json:"pending,omitempty"` +} + +func (x *EVMMultisigTopology) Reset() { + *x = EVMMultisigTopology{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[149] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EVMMultisigTopology) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EVMMultisigTopology) ProtoMessage() {} + +func (x *EVMMultisigTopology) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EVMMultisigTopology.ProtoReflect.Descriptor instead. +func (*EVMMultisigTopology) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{149} +} + +func (x *EVMMultisigTopology) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + +func (x *EVMMultisigTopology) GetVerified() *ERC20MultiSigTopologyVerified { + if x != nil { + return x.Verified + } + return nil +} + +func (x *EVMMultisigTopology) GetPending() *ERC20MultiSigTopologyPending { + if x != nil { + return x.Pending + } + return nil +} + +type EVMMultisigTopologies struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EvmMultisigTopology []*EVMMultisigTopology `protobuf:"bytes,1,rep,name=evm_multisig_topology,json=evmMultisigTopology,proto3" json:"evm_multisig_topology,omitempty"` +} + +func (x *EVMMultisigTopologies) Reset() { + *x = EVMMultisigTopologies{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[150] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EVMMultisigTopologies) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EVMMultisigTopologies) ProtoMessage() {} + +func (x *EVMMultisigTopologies) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EVMMultisigTopologies.ProtoReflect.Descriptor instead. +func (*EVMMultisigTopologies) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{150} +} + +func (x *EVMMultisigTopologies) GetEvmMultisigTopology() []*EVMMultisigTopology { + if x != nil { + return x.EvmMultisigTopology + } + return nil +} + type ProofOfWork struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -11128,7 +11393,7 @@ type ProofOfWork struct { func (x *ProofOfWork) Reset() { *x = ProofOfWork{} 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) } @@ -11141,7 +11406,7 @@ func (x *ProofOfWork) String() string { func (*ProofOfWork) ProtoMessage() {} func (x *ProofOfWork) 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 { @@ -11154,7 +11419,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{148} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{151} } func (x *ProofOfWork) GetBlockHeight() []uint64 { @@ -11232,7 +11497,7 @@ type BannedParty struct { func (x *BannedParty) Reset() { *x = BannedParty{} 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) } @@ -11245,7 +11510,7 @@ func (x *BannedParty) String() string { func (*BannedParty) ProtoMessage() {} func (x *BannedParty) 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 { @@ -11258,7 +11523,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{149} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{152} } func (x *BannedParty) GetParty() string { @@ -11292,7 +11557,7 @@ type ProofOfWorkParams struct { func (x *ProofOfWorkParams) Reset() { *x = ProofOfWorkParams{} 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) } @@ -11305,7 +11570,7 @@ func (x *ProofOfWorkParams) String() string { func (*ProofOfWorkParams) ProtoMessage() {} func (x *ProofOfWorkParams) 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 { @@ -11318,7 +11583,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{150} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{153} } func (x *ProofOfWorkParams) GetSpamPowNumberOfPastBlocks() uint64 { @@ -11381,7 +11646,7 @@ type ProofOfWorkState struct { func (x *ProofOfWorkState) Reset() { *x = ProofOfWorkState{} 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) } @@ -11394,7 +11659,7 @@ func (x *ProofOfWorkState) String() string { func (*ProofOfWorkState) ProtoMessage() {} func (x *ProofOfWorkState) 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 { @@ -11407,7 +11672,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{151} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{154} } func (x *ProofOfWorkState) GetPowState() []*ProofOfWorkBlockState { @@ -11429,7 +11694,7 @@ type ProofOfWorkBlockState struct { func (x *ProofOfWorkBlockState) Reset() { *x = ProofOfWorkBlockState{} 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) } @@ -11442,7 +11707,7 @@ func (x *ProofOfWorkBlockState) String() string { func (*ProofOfWorkBlockState) ProtoMessage() {} func (x *ProofOfWorkBlockState) 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 { @@ -11455,7 +11720,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{152} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{155} } func (x *ProofOfWorkBlockState) GetBlockHeight() uint64 { @@ -11485,7 +11750,7 @@ type ProofOfWorkPartyStateForBlock struct { func (x *ProofOfWorkPartyStateForBlock) Reset() { *x = ProofOfWorkPartyStateForBlock{} 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) } @@ -11498,7 +11763,7 @@ func (x *ProofOfWorkPartyStateForBlock) String() string { func (*ProofOfWorkPartyStateForBlock) ProtoMessage() {} func (x *ProofOfWorkPartyStateForBlock) 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 { @@ -11511,7 +11776,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{153} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{156} } func (x *ProofOfWorkPartyStateForBlock) GetParty() string { @@ -11547,7 +11812,7 @@ type TransactionsAtHeight struct { func (x *TransactionsAtHeight) Reset() { *x = TransactionsAtHeight{} 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) } @@ -11560,7 +11825,7 @@ func (x *TransactionsAtHeight) String() string { func (*TransactionsAtHeight) ProtoMessage() {} func (x *TransactionsAtHeight) 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 { @@ -11573,7 +11838,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{154} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{157} } func (x *TransactionsAtHeight) GetHeight() uint64 { @@ -11602,7 +11867,7 @@ type NonceRef struct { func (x *NonceRef) Reset() { *x = NonceRef{} 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) } @@ -11615,7 +11880,7 @@ func (x *NonceRef) String() string { func (*NonceRef) ProtoMessage() {} func (x *NonceRef) 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 { @@ -11628,7 +11893,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{155} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{158} } func (x *NonceRef) GetParty() string { @@ -11657,7 +11922,7 @@ type NonceRefsAtHeight struct { func (x *NonceRefsAtHeight) Reset() { *x = NonceRefsAtHeight{} 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) } @@ -11670,7 +11935,7 @@ func (x *NonceRefsAtHeight) String() string { func (*NonceRefsAtHeight) ProtoMessage() {} func (x *NonceRefsAtHeight) 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 { @@ -11683,7 +11948,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{156} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{159} } func (x *NonceRefsAtHeight) GetHeight() uint64 { @@ -11712,7 +11977,7 @@ type ProtocolUpgradeProposals struct { func (x *ProtocolUpgradeProposals) Reset() { *x = ProtocolUpgradeProposals{} 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) } @@ -11725,7 +11990,7 @@ func (x *ProtocolUpgradeProposals) String() string { func (*ProtocolUpgradeProposals) ProtoMessage() {} func (x *ProtocolUpgradeProposals) 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 { @@ -11738,7 +12003,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{157} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{160} } func (x *ProtocolUpgradeProposals) GetActiveProposals() []*v12.ProtocolUpgradeEvent { @@ -11769,7 +12034,7 @@ type AcceptedProtocolUpgradeProposal struct { func (x *AcceptedProtocolUpgradeProposal) Reset() { *x = AcceptedProtocolUpgradeProposal{} 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) } @@ -11782,7 +12047,7 @@ func (x *AcceptedProtocolUpgradeProposal) String() string { func (*AcceptedProtocolUpgradeProposal) ProtoMessage() {} func (x *AcceptedProtocolUpgradeProposal) 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 { @@ -11795,7 +12060,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{158} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{161} } func (x *AcceptedProtocolUpgradeProposal) GetUpgradeBlockHeight() uint64 { @@ -11823,7 +12088,7 @@ type Teams struct { func (x *Teams) Reset() { *x = Teams{} 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) } @@ -11836,7 +12101,7 @@ func (x *Teams) String() string { func (*Teams) ProtoMessage() {} func (x *Teams) 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 { @@ -11849,7 +12114,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{159} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{162} } func (x *Teams) GetTeams() []*Team { @@ -11878,7 +12143,7 @@ type Team struct { func (x *Team) Reset() { *x = Team{} 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) } @@ -11891,7 +12156,7 @@ func (x *Team) String() string { func (*Team) ProtoMessage() {} func (x *Team) 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 { @@ -11904,7 +12169,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{160} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{163} } func (x *Team) GetId() string { @@ -11983,7 +12248,7 @@ type Membership struct { func (x *Membership) Reset() { *x = Membership{} 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) } @@ -11996,7 +12261,7 @@ func (x *Membership) String() string { func (*Membership) ProtoMessage() {} func (x *Membership) 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 { @@ -12009,7 +12274,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{161} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{164} } func (x *Membership) GetPartyId() string { @@ -12044,7 +12309,7 @@ type TeamSwitches struct { func (x *TeamSwitches) Reset() { *x = TeamSwitches{} 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) } @@ -12057,7 +12322,7 @@ func (x *TeamSwitches) String() string { func (*TeamSwitches) ProtoMessage() {} func (x *TeamSwitches) 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 { @@ -12070,7 +12335,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{162} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{165} } func (x *TeamSwitches) GetTeamSwitches() []*TeamSwitch { @@ -12093,7 +12358,7 @@ type TeamSwitch struct { func (x *TeamSwitch) Reset() { *x = TeamSwitch{} 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) } @@ -12106,7 +12371,7 @@ func (x *TeamSwitch) String() string { func (*TeamSwitch) ProtoMessage() {} func (x *TeamSwitch) 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 { @@ -12119,7 +12384,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{163} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{166} } func (x *TeamSwitch) GetFromTeamId() string { @@ -12154,7 +12419,7 @@ type Vesting struct { func (x *Vesting) Reset() { *x = Vesting{} 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) } @@ -12167,7 +12432,7 @@ func (x *Vesting) String() string { func (*Vesting) ProtoMessage() {} func (x *Vesting) 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 { @@ -12180,7 +12445,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{164} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{167} } func (x *Vesting) GetPartiesReward() []*PartyReward { @@ -12203,7 +12468,7 @@ type PartyReward struct { func (x *PartyReward) Reset() { *x = PartyReward{} 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) } @@ -12216,7 +12481,7 @@ func (x *PartyReward) String() string { func (*PartyReward) ProtoMessage() {} func (x *PartyReward) 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 { @@ -12229,7 +12494,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{165} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{168} } func (x *PartyReward) GetParty() string { @@ -12269,7 +12534,7 @@ type ReferralProgramData struct { func (x *ReferralProgramData) Reset() { *x = ReferralProgramData{} 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) } @@ -12282,7 +12547,7 @@ func (x *ReferralProgramData) String() string { func (*ReferralProgramData) ProtoMessage() {} func (x *ReferralProgramData) 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 { @@ -12295,7 +12560,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{166} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{169} } func (x *ReferralProgramData) GetFactorByReferee() []*FactorByReferee { @@ -12359,7 +12624,7 @@ type ReferralSet struct { func (x *ReferralSet) Reset() { *x = ReferralSet{} 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) } @@ -12372,7 +12637,7 @@ func (x *ReferralSet) String() string { func (*ReferralSet) ProtoMessage() {} func (x *ReferralSet) 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 { @@ -12385,7 +12650,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{167} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{170} } func (x *ReferralSet) GetId() string { @@ -12463,7 +12728,7 @@ type RunningVolume struct { func (x *RunningVolume) Reset() { *x = RunningVolume{} 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) } @@ -12476,7 +12741,7 @@ func (x *RunningVolume) String() string { func (*RunningVolume) ProtoMessage() {} func (x *RunningVolume) 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 { @@ -12489,7 +12754,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{168} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{171} } func (x *RunningVolume) GetEpoch() uint64 { @@ -12519,7 +12784,7 @@ type FactorByReferee struct { func (x *FactorByReferee) Reset() { *x = FactorByReferee{} 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) } @@ -12532,7 +12797,7 @@ func (x *FactorByReferee) String() string { func (*FactorByReferee) ProtoMessage() {} func (x *FactorByReferee) 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 { @@ -12545,7 +12810,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{169} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{172} } func (x *FactorByReferee) GetParty() string { @@ -12581,7 +12846,7 @@ type AssetLocked struct { func (x *AssetLocked) Reset() { *x = AssetLocked{} 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) } @@ -12594,7 +12859,7 @@ func (x *AssetLocked) String() string { func (*AssetLocked) ProtoMessage() {} func (x *AssetLocked) 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 { @@ -12607,7 +12872,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{170} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{173} } func (x *AssetLocked) GetAsset() string { @@ -12636,7 +12901,7 @@ type EpochBalance struct { func (x *EpochBalance) Reset() { *x = EpochBalance{} 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) } @@ -12649,7 +12914,7 @@ func (x *EpochBalance) String() string { func (*EpochBalance) ProtoMessage() {} func (x *EpochBalance) 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 { @@ -12662,7 +12927,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{171} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{174} } func (x *EpochBalance) GetEpoch() uint64 { @@ -12691,7 +12956,7 @@ type InVesting struct { func (x *InVesting) Reset() { *x = InVesting{} 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) } @@ -12704,7 +12969,7 @@ func (x *InVesting) String() string { func (*InVesting) ProtoMessage() {} func (x *InVesting) 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 { @@ -12717,7 +12982,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{172} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{175} } func (x *InVesting) GetAsset() string { @@ -12745,7 +13010,7 @@ type ActivityStreak struct { func (x *ActivityStreak) Reset() { *x = ActivityStreak{} 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) } @@ -12758,7 +13023,7 @@ func (x *ActivityStreak) String() string { func (*ActivityStreak) ProtoMessage() {} func (x *ActivityStreak) 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 { @@ -12771,7 +13036,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{173} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{176} } func (x *ActivityStreak) GetPartiesActivityStreak() []*PartyActivityStreak { @@ -12796,7 +13061,7 @@ type PartyActivityStreak struct { func (x *PartyActivityStreak) Reset() { *x = PartyActivityStreak{} 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) } @@ -12809,7 +13074,7 @@ func (x *PartyActivityStreak) String() string { func (*PartyActivityStreak) ProtoMessage() {} func (x *PartyActivityStreak) 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 { @@ -12822,7 +13087,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{174} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{177} } func (x *PartyActivityStreak) GetParty() string { @@ -12879,7 +13144,7 @@ type VolumeDiscountProgram struct { func (x *VolumeDiscountProgram) Reset() { *x = VolumeDiscountProgram{} 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) } @@ -12892,7 +13157,7 @@ func (x *VolumeDiscountProgram) String() string { func (*VolumeDiscountProgram) ProtoMessage() {} func (x *VolumeDiscountProgram) 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 { @@ -12905,7 +13170,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{175} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{178} } func (x *VolumeDiscountProgram) GetParties() []string { @@ -12983,7 +13248,7 @@ type VolumeDiscountStats struct { func (x *VolumeDiscountStats) Reset() { *x = VolumeDiscountStats{} 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) } @@ -12996,7 +13261,7 @@ func (x *VolumeDiscountStats) String() string { func (*VolumeDiscountStats) ProtoMessage() {} func (x *VolumeDiscountStats) 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 { @@ -13009,7 +13274,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{176} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{179} } func (x *VolumeDiscountStats) GetParty() string { @@ -13037,7 +13302,7 @@ type EpochPartyVolumes struct { func (x *EpochPartyVolumes) Reset() { *x = EpochPartyVolumes{} 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) } @@ -13050,7 +13315,7 @@ func (x *EpochPartyVolumes) String() string { func (*EpochPartyVolumes) ProtoMessage() {} func (x *EpochPartyVolumes) 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 { @@ -13063,7 +13328,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{177} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{180} } func (x *EpochPartyVolumes) GetPartyVolume() []*PartyVolume { @@ -13085,7 +13350,7 @@ type PartyVolume struct { func (x *PartyVolume) Reset() { *x = PartyVolume{} 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) } @@ -13098,7 +13363,7 @@ func (x *PartyVolume) String() string { func (*PartyVolume) ProtoMessage() {} func (x *PartyVolume) 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 { @@ -13111,7 +13376,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{178} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{181} } func (x *PartyVolume) GetParty() string { @@ -13142,7 +13407,7 @@ type Liquidation struct { func (x *Liquidation) Reset() { *x = Liquidation{} 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) } @@ -13155,7 +13420,7 @@ func (x *Liquidation) String() string { func (*Liquidation) ProtoMessage() {} func (x *Liquidation) 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 { @@ -13168,7 +13433,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{179} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{182} } func (x *Liquidation) GetMarketId() string { @@ -13212,7 +13477,7 @@ type PartyAssetAmount struct { func (x *PartyAssetAmount) Reset() { *x = PartyAssetAmount{} 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) } @@ -13225,7 +13490,7 @@ func (x *PartyAssetAmount) String() string { func (*PartyAssetAmount) ProtoMessage() {} func (x *PartyAssetAmount) 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 { @@ -13238,7 +13503,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{180} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{183} } func (x *PartyAssetAmount) GetParty() string { @@ -13273,7 +13538,7 @@ type BankingTransferFeeDiscounts struct { func (x *BankingTransferFeeDiscounts) Reset() { *x = BankingTransferFeeDiscounts{} 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) } @@ -13286,7 +13551,7 @@ func (x *BankingTransferFeeDiscounts) String() string { func (*BankingTransferFeeDiscounts) ProtoMessage() {} func (x *BankingTransferFeeDiscounts) 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 { @@ -13299,7 +13564,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{181} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{184} } func (x *BankingTransferFeeDiscounts) GetPartyAssetDiscount() []*PartyAssetAmount { @@ -13325,7 +13590,7 @@ type CompositePriceCalculator struct { func (x *CompositePriceCalculator) Reset() { *x = CompositePriceCalculator{} 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) } @@ -13338,7 +13603,7 @@ func (x *CompositePriceCalculator) String() string { func (*CompositePriceCalculator) ProtoMessage() {} func (x *CompositePriceCalculator) 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 { @@ -13351,7 +13616,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{182} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{185} } func (x *CompositePriceCalculator) GetCompositePrice() string { @@ -13407,7 +13672,7 @@ type Parties struct { func (x *Parties) Reset() { *x = Parties{} 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) } @@ -13420,7 +13685,7 @@ func (x *Parties) String() string { func (*Parties) ProtoMessage() {} func (x *Parties) 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 { @@ -13433,7 +13698,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{183} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{186} } func (x *Parties) GetProfiles() []*PartyProfile { @@ -13456,7 +13721,7 @@ type PartyProfile struct { func (x *PartyProfile) Reset() { *x = PartyProfile{} 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) } @@ -13469,7 +13734,7 @@ func (x *PartyProfile) String() string { func (*PartyProfile) ProtoMessage() {} func (x *PartyProfile) 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 { @@ -13482,7 +13747,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{184} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{187} } func (x *PartyProfile) GetPartyId() string { @@ -13506,6 +13771,53 @@ func (x *PartyProfile) GetMetadata() []*vega.Metadata { return nil } +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"` +} + +func (x *MarketLiquidity) Reset() { + *x = MarketLiquidity{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[188] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MarketLiquidity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MarketLiquidity) ProtoMessage() {} + +func (x *MarketLiquidity) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MarketLiquidity.ProtoReflect.Descriptor instead. +func (*MarketLiquidity) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{188} +} + +func (x *MarketLiquidity) GetPriceRange() string { + if x != nil { + return x.PriceRange + } + return "" +} + var File_vega_snapshot_v1_snapshot_proto protoreflect.FileDescriptor var file_vega_snapshot_v1_snapshot_proto_rawDesc = []byte{ @@ -13561,7 +13873,7 @@ var file_vega_snapshot_v1_snapshot_proto_rawDesc = []byte{ 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, 0x80, 0x36, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, + 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, @@ -13830,218 +14142,208 @@ var file_vega_snapshot_v1_snapshot_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x48, 0x00, 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, 0x12, 0x58, 0x0a, 0x14, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x62, - 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x38, 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, 0x42, 0x72, 0x69, 0x64, - 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x12, 0x62, 0x61, 0x6e, 0x6b, 0x69, - 0x6e, 0x67, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4e, 0x0a, - 0x10, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x39, 0x20, 0x01, 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, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x65, - 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4e, 0x0a, - 0x10, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, - 0x73, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x6c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x5b, 0x0a, - 0x15, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x3b, 0x20, 0x01, 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, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x48, 0x00, 0x52, 0x13, 0x73, 0x70, 0x6f, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x8c, 0x01, 0x0a, 0x26, 0x62, - 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 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, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 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, 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, 0x48, 0x00, 0x52, 0x23, 0x62, 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, 0x8c, 0x01, 0x0a, 0x26, 0x62, 0x61, - 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, + 0x61, 0x6c, 0x73, 0x12, 0x67, 0x0a, 0x1c, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x38, 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, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, + 0x00, 0x52, 0x19, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x10, + 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x39, 0x20, 0x01, 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, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x65, 0x74, + 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x10, + 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, + 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x6c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x5b, 0x0a, 0x15, + 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x3b, 0x20, 0x01, 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, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x48, 0x00, 0x52, 0x13, 0x73, 0x70, 0x6f, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x8c, 0x01, 0x0a, 0x26, 0x62, 0x61, + 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 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, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x65, 0x67, + 0x66, 0x65, 0x72, 0x73, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 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, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x6f, + 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, 0x48, 0x00, 0x52, 0x23, 0x62, 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, 0x65, 0x0a, 0x19, 0x65, 0x74, 0x68, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x3e, 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, 0x48, 0x00, 0x52, 0x16, 0x65, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x61, 0x63, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, - 0x72, 0x0a, 0x1e, 0x65, 0x74, 0x68, 0x5f, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x18, 0x3f, 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, 0x48, 0x00, 0x52, 0x1a, 0x65, 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, 0x61, 0x0a, 0x17, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x5f, 0x76, 0x32, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x40, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 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, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, - 0x15, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x77, 0x0a, 0x1f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x5f, 0x76, 0x32, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2e, 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, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x48, - 0x00, 0x52, 0x1c, 0x6c, 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, - 0x67, 0x0a, 0x19, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x76, 0x32, 0x5f, - 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x42, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x29, 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, 0x73, 0x48, 0x00, 0x52, - 0x17, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x65, 0x72, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x5b, 0x0a, 0x15, 0x6c, 0x69, 0x71, 0x75, - 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x76, 0x32, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, - 0x64, 0x18, 0x43, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 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, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x48, 0x00, - 0x52, 0x13, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x53, 0x75, 0x70, - 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x55, 0x0a, 0x13, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x5f, 0x76, 0x32, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x44, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 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, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x48, 0x00, 0x52, 0x11, 0x6c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x17, - 0x68, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, - 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x48, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, - 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, 0x68, 0x6f, 0x6c, 0x64, 0x69, 0x6e, - 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x12, - 0x2f, 0x0a, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, - 0x12, 0x45, 0x0a, 0x0d, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, - 0x73, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x65, 0x61, 0x6d, 0x53, - 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x76, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x18, 0x48, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x52, - 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x18, 0x49, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 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, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x48, - 0x00, 0x52, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x12, 0x4b, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6b, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x48, 0x00, 0x52, - 0x0e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x12, - 0x61, 0x0a, 0x17, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x27, 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, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x15, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x12, 0x61, 0x0a, 0x17, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, - 0x76, 0x32, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x4e, 0x20, + 0x73, 0x48, 0x00, 0x52, 0x23, 0x62, 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, 0x8c, 0x01, 0x0a, 0x26, 0x62, 0x61, 0x6e, + 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x67, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x73, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 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, 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, + 0x48, 0x00, 0x52, 0x23, 0x62, 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, 0x65, 0x0a, 0x19, 0x65, 0x74, 0x68, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x18, 0x3e, 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, 0x48, 0x00, 0x52, 0x16, 0x65, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x72, + 0x0a, 0x1e, 0x65, 0x74, 0x68, 0x5f, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x18, 0x3f, 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, 0x48, 0x00, 0x52, 0x1a, 0x65, 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, 0x61, 0x0a, 0x17, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, + 0x76, 0x32, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 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, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x15, - 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x6c, 0x0a, 0x1c, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x5f, 0x76, 0x32, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 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, 0x61, 0x69, 0x64, 0x46, 0x65, - 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x48, 0x00, 0x52, 0x18, 0x6c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x61, 0x69, 0x64, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0b, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x71, 0x75, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x6c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x74, 0x0a, 0x1e, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, - 0x67, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x64, - 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x56, 0x32, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x15, + 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x77, 0x0a, 0x1f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x5f, 0x76, 0x32, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 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, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x48, 0x00, 0x52, - 0x1b, 0x62, 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, 0x61, 0x0a, 0x17, - 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, - 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x31, 0x2e, 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, 0x48, 0x00, + 0x52, 0x1c, 0x6c, 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, 0x67, + 0x0a, 0x19, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x76, 0x32, 0x5f, 0x70, + 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x42, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x29, 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, 0x73, 0x48, 0x00, 0x52, 0x17, + 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x65, 0x72, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x5b, 0x0a, 0x15, 0x6c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x5f, 0x76, 0x32, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, + 0x18, 0x43, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 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, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x48, 0x00, 0x52, + 0x13, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x53, 0x75, 0x70, 0x70, + 0x6c, 0x69, 0x65, 0x64, 0x12, 0x55, 0x0a, 0x13, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x5f, 0x76, 0x32, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x44, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 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, + 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x48, 0x00, 0x52, 0x11, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x56, 0x32, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x17, 0x68, + 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, + 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x48, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x72, + 0x61, 0x63, 0x6b, 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, 0x68, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x2f, + 0x0a, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x48, 0x00, 0x52, 0x15, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, - 0x61, 0x6e, 0x63, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, - 0x35, 0x0a, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x53, 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, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x48, 0x00, 0x52, 0x07, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x0e, 0x6c, 0x32, 0x5f, 0x65, 0x74, 0x68, - 0x5f, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x32, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x48, 0x00, - 0x52, 0x0c, 0x6c, 0x32, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x62, - 0x0a, 0x18, 0x65, 0x74, 0x68, 0x5f, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x73, 0x63, 0x18, 0x55, 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, 0x48, 0x00, 0x52, 0x15, 0x65, 0x74, 0x68, - 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4d, 0x69, - 0x73, 0x63, 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, 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, + 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x12, + 0x45, 0x0a, 0x0d, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x65, 0x61, 0x6d, 0x53, 0x77, + 0x69, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x07, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x18, 0x48, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x52, 0x0a, + 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x18, 0x49, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 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, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, + 0x52, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x12, 0x4b, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6b, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x48, 0x00, 0x52, 0x0e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x12, 0x61, + 0x0a, 0x17, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 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, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x15, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x12, 0x61, 0x0a, 0x17, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x76, + 0x32, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x4e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 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, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x15, 0x6c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x6c, 0x0a, 0x1c, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x5f, 0x76, 0x32, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 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, 0x61, 0x69, 0x64, 0x46, 0x65, 0x65, + 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x48, 0x00, 0x52, 0x18, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x61, 0x69, 0x64, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0b, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x74, 0x0a, 0x1e, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, + 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x64, 0x69, + 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 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, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x48, 0x00, 0x52, 0x1b, + 0x62, 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, 0x61, 0x0a, 0x17, 0x67, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x48, 0x00, 0x52, 0x15, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x35, + 0x0a, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x53, 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, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x48, 0x00, 0x52, 0x07, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x0e, 0x6c, 0x32, 0x5f, 0x65, 0x74, 0x68, 0x5f, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x32, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, + 0x0c, 0x6c, 0x32, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x62, 0x0a, + 0x18, 0x65, 0x74, 0x68, 0x5f, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x73, 0x63, 0x18, 0x55, 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, 0x48, 0x00, 0x52, 0x15, 0x65, 0x74, 0x68, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4d, 0x69, 0x73, + 0x63, 0x12, 0x65, 0x0a, 0x19, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x76, 0x6d, + 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x56, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 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, 0x45, + 0x56, 0x4d, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x48, 0x00, + 0x52, 0x16, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x45, 0x76, 0x6d, 0x42, 0x72, 0x69, 0x64, + 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x17, 0x65, 0x76, 0x6d, 0x5f, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, + 0x69, 0x65, 0x73, 0x18, 0x57, 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, 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, @@ -14049,1209 +14351,1268 @@ var file_vega_snapshot_v1_snapshot_proto_rawDesc = []byte{ 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, + 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, 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, 0x75, 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, 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, + 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, 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, 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, 0x69, 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, 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, 0x50, 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, 0x2d, - 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x65, 0x74, 0x68, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x6c, 0x61, 0x73, - 0x74, 0x53, 0x65, 0x65, 0x6e, 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, + 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, + 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, - 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, 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, 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, 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, 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, 0x83, 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, 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, 0x79, 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, 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, + 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, 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, + 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, 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, + 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, 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, 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, + 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, + 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, 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, 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, 0xb4, - 0x08, 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, 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, + 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, 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, 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, 0x22, 0xee, 0x0d, 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, 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, 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, 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, 0x42, 0x26, - 0x0a, 0x24, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x63, - 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, - 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, - 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x42, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x70, 0x65, 0x72, 0x70, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x70, 0x73, 0x48, 0x00, 0x52, 0x05, 0x70, 0x65, 0x72, - 0x70, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3f, 0x0a, 0x09, 0x44, 0x61, - 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x5b, 0x0a, 0x10, 0x41, - 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x12, - 0x0c, 0x0a, 0x01, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x01, 0x74, 0x12, 0x23, 0x0a, - 0x0d, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x53, 0x0a, 0x08, 0x54, 0x57, 0x41, 0x50, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x1f, 0x0a, 0x0b, - 0x73, 0x75, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x73, 0x75, 0x6d, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0xc7, 0x03, - 0x0a, 0x05, 0x50, 0x65, 0x72, 0x70, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x4b, 0x0a, 0x13, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x11, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, - 0x73, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x48, 0x0a, 0x12, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, - 0x77, 0x61, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 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, 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, + 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, 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, + 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, 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, 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, + 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x22, 0x5b, 0x0a, 0x10, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x73, 0x12, 0x0c, 0x0a, 0x01, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, + 0x01, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x61, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x53, 0x0a, + 0x08, 0x54, 0x57, 0x41, 0x50, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, + 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x75, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x6d, 0x50, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x22, 0xc7, 0x03, 0x0a, 0x05, 0x50, 0x65, 0x72, 0x70, 0x73, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x4b, 0x0a, 0x13, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x13, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x52, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, + 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x48, 0x0a, 0x12, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x77, 0x61, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x57, 0x41, 0x50, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x77, 0x61, 0x70, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x48, 0x0a, 0x12, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x77, + 0x61, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x57, 0x41, 0x50, 0x44, 0x61, 0x74, 0x61, 0x52, 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x54, 0x77, 0x61, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4f, 0x0a, 0x11, 0x61, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x52, 0x10, 0x61, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x22, 0x3d, 0x0a, 0x0d, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x10, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x42, 0x0a, 0x0c, 0x66, 0x61, 0x6c, 0x6c, 0x73, 0x5f, 0x62, 0x65, 0x6c, 0x6c, 0x6f, 0x77, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0b, 0x66, 0x61, 0x6c, 0x6c, 0x73, 0x42, 0x65, + 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x61, 0x62, + 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x72, 0x69, 0x73, 0x65, + 0x73, 0x41, 0x62, 0x6f, 0x76, 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x66, 0x61, 0x6c, 0x6c, 0x73, 0x5f, 0x62, + 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0b, 0x66, + 0x61, 0x6c, 0x6c, 0x73, 0x42, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x41, 0x0a, 0x0b, 0x72, 0x69, + 0x73, 0x65, 0x73, 0x5f, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x52, 0x0a, 0x72, 0x69, 0x73, 0x65, 0x73, 0x41, 0x62, 0x6f, 0x76, 0x65, 0x22, 0x40, 0x0a, + 0x0e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, + 0x62, 0x0a, 0x0e, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x73, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x73, 0x22, 0xf7, 0x01, 0x0a, 0x0a, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x73, 0x12, 0x50, 0x0a, 0x12, 0x70, 0x72, 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, 0x74, + 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x73, 0x52, 0x10, 0x70, 0x72, 0x69, 0x63, 0x65, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x56, 0x0a, 0x14, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x53, + 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x12, 0x74, 0x72, 0x61, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0x40, 0x0a, + 0x0c, 0x50, 0x65, 0x67, 0x67, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x30, 0x0a, + 0x0d, 0x70, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, + 0xad, 0x03, 0x0a, 0x10, 0x53, 0x4c, 0x41, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x6e, + 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x11, 0x62, 0x6f, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x46, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x5f, 0x65, 0x78, + 0x69, 0x74, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x45, 0x78, 0x69, 0x74, 0x50, 0x65, 0x6e, 0x61, 0x6c, + 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, + 0x61, 0x78, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x12, 0x46, + 0x0a, 0x20, 0x6e, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x6d, + 0x61, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x6e, 0x6f, 0x6e, 0x50, 0x65, 0x72, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x6f, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x61, + 0x6c, 0x74, 0x79, 0x4d, 0x61, 0x78, 0x12, 0x4a, 0x0a, 0x22, 0x6e, 0x6f, 0x6e, 0x5f, 0x70, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, + 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x73, 0x6c, 0x6f, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x1e, 0x6e, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, + 0x63, 0x65, 0x42, 0x6f, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x53, 0x6c, 0x6f, + 0x70, 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x63, + 0x63, 0x79, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x43, 0x63, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x12, 0x4c, 0x0a, 0x23, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x66, + 0x65, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x46, 0x65, 0x65, 0x43, 0x61, 0x6c, 0x63, + 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x65, 0x70, 0x22, + 0x80, 0x03, 0x0a, 0x10, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, + 0x07, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x70, 0x6f, 0x74, + 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x73, 0x52, 0x12, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x74, - 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0x40, 0x0a, 0x0c, 0x50, 0x65, 0x67, 0x67, - 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x6b, - 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x0c, 0x70, 0x61, - 0x72, 0x6b, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0xad, 0x03, 0x0a, 0x10, 0x53, - 0x4c, 0x41, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x2e, 0x0a, 0x13, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, - 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x62, 0x6f, - 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x2c, 0x0a, 0x12, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x70, 0x65, - 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x65, 0x61, 0x72, - 0x6c, 0x79, 0x45, 0x78, 0x69, 0x74, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x12, 0x2a, 0x0a, - 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x66, - 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x4c, 0x69, 0x71, - 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x12, 0x46, 0x0a, 0x20, 0x6e, 0x6f, 0x6e, - 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x6f, 0x6e, - 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x1c, 0x6e, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x6e, 0x63, 0x65, 0x42, 0x6f, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x4d, 0x61, - 0x78, 0x12, 0x4a, 0x0a, 0x22, 0x6e, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, - 0x79, 0x5f, 0x73, 0x6c, 0x6f, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1e, 0x6e, - 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x6f, 0x6e, - 0x64, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x53, 0x6c, 0x6f, 0x70, 0x65, 0x12, 0x2d, 0x0a, - 0x13, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x63, 0x79, 0x5f, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, 0x61, 0x6b, - 0x65, 0x54, 0x6f, 0x43, 0x63, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x23, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x63, 0x61, - 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, - 0x74, 0x65, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1f, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x73, 0x46, 0x65, 0x65, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x65, 0x70, 0x22, 0x80, 0x03, 0x0a, 0x10, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, - 0x32, 0x0a, 0x07, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x6f, - 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x0b, 0x73, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x0f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0e, - 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x3c, - 0x0a, 0x0a, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, - 0x52, 0x0a, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x1d, 0x0a, 0x0a, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x50, 0x0a, 0x12, 0x73, - 0x6c, 0x61, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x4c, 0x41, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x10, 0x73, 0x6c, 0x61, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x5e, 0x0a, - 0x0a, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x5f, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x22, 0x97, 0x02, - 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x62, 0x75, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x62, 0x75, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x73, - 0x65, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x65, 0x6c, 0x6c, 0x12, - 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x62, 0x75, 0x79, 0x5f, 0x73, 0x75, 0x6d, - 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x62, 0x75, 0x79, 0x53, 0x75, 0x6d, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x28, 0x0a, - 0x10, 0x73, 0x65, 0x6c, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x6c, 0x6c, 0x53, 0x75, 0x6d, - 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x73, 0x74, 0x72, - 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x76, 0x65, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x73, 0x22, 0x86, 0x02, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x35, - 0x0a, 0x14, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x12, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, - 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x6c, 0x6f, 0x77, 0x65, 0x73, 0x74, 0x5f, - 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x12, 0x6c, 0x6f, 0x77, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, - 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x74, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, - 0x17, 0x0a, 0x15, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x74, 0x72, 0x61, - 0x64, 0x65, 0x64, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0xee, 0x01, 0x0a, 0x0f, 0x53, - 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x50, 0x72, - 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x74, - 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x74, 0x74, 0x6c, - 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x6c, 0x61, 0x73, 0x74, - 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x39, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x72, - 0x61, 0x64, 0x65, 0x52, 0x06, 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, 0x22, 0x56, 0x0a, 0x13, 0x4c, - 0x61, 0x73, 0x74, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x74, 0x74, - 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x94, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, - 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x08, 0x41, - 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, - 0x61, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x0a, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x18, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x65, - 0x77, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x54, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x65, 0x77, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x12, 0x2b, 0x0a, 0x12, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x74, 0x6f, 0x5f, - 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x54, 0x6f, 0x45, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x22, 0x7b, 0x0a, 0x15, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x73, 0x12, 0x62, 0x0a, 0x18, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x70, - 0x61, 0x79, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, - 0x61, 0x79, 0x6f, 0x75, 0x74, 0x52, 0x16, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, - 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x22, 0x81, 0x01, - 0x0a, 0x16, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x73, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x79, 0x6f, - 0x75, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, - 0x61, 0x79, 0x6f, 0x75, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x72, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x61, 0x79, 0x6f, - 0x75, 0x74, 0x52, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x61, 0x79, 0x6f, 0x75, - 0x74, 0x22, 0xfc, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x61, 0x79, - 0x6f, 0x75, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x54, 0x0a, 0x13, - 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 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, + 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, 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, - 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, 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, 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, + 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, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, + 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, 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, + 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, 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, + 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, - 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, 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, + 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, 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, 0x9e, 0x01, 0x0a, - 0x23, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, + 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, 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, 0x22, 0xf2, 0x03, + 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, + 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, @@ -15550,7 +15911,7 @@ var file_vega_snapshot_v1_snapshot_proto_rawDesc = []byte{ 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, 0xc8, 0x02, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, + 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, @@ -15571,444 +15932,472 @@ var file_vega_snapshot_v1_snapshot_proto_rawDesc = []byte{ 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, 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, + 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, 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, 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, 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, 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, + 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, + 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, + 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, 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, - 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, + 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, 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, + 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, 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, 0x2e, + 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, 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, + 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, 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, + 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, 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, 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, + 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, 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, } var ( @@ -16024,7 +16413,7 @@ 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, 185) +var file_vega_snapshot_v1_snapshot_proto_msgTypes = make([]protoimpl.MessageInfo, 189) var file_vega_snapshot_v1_snapshot_proto_goTypes = []interface{}{ (Format)(0), // 0: vega.snapshot.v1.Format (*Snapshot)(nil), // 1: vega.snapshot.v1.Snapshot @@ -16064,199 +16453,204 @@ var file_vega_snapshot_v1_snapshot_proto_goTypes = []interface{}{ (*BankingRecurringGovernanceTransfers)(nil), // 35: vega.snapshot.v1.BankingRecurringGovernanceTransfers (*BankingScheduledGovernanceTransfers)(nil), // 36: vega.snapshot.v1.BankingScheduledGovernanceTransfers (*BankingBridgeState)(nil), // 37: vega.snapshot.v1.BankingBridgeState - (*Checkpoint)(nil), // 38: vega.snapshot.v1.Checkpoint - (*DelegationLastReconciliationTime)(nil), // 39: vega.snapshot.v1.DelegationLastReconciliationTime - (*DelegationActive)(nil), // 40: vega.snapshot.v1.DelegationActive - (*DelegationPending)(nil), // 41: vega.snapshot.v1.DelegationPending - (*DelegationAuto)(nil), // 42: vega.snapshot.v1.DelegationAuto - (*ProposalData)(nil), // 43: vega.snapshot.v1.ProposalData - (*GovernanceEnacted)(nil), // 44: vega.snapshot.v1.GovernanceEnacted - (*GovernanceActive)(nil), // 45: vega.snapshot.v1.GovernanceActive - (*BatchProposalData)(nil), // 46: vega.snapshot.v1.BatchProposalData - (*GovernanceBatchActive)(nil), // 47: vega.snapshot.v1.GovernanceBatchActive - (*GovernanceNode)(nil), // 48: vega.snapshot.v1.GovernanceNode - (*StakingAccount)(nil), // 49: vega.snapshot.v1.StakingAccount - (*StakingAccounts)(nil), // 50: vega.snapshot.v1.StakingAccounts - (*MatchingBook)(nil), // 51: vega.snapshot.v1.MatchingBook - (*NetParams)(nil), // 52: vega.snapshot.v1.NetParams - (*DecimalMap)(nil), // 53: vega.snapshot.v1.DecimalMap - (*TimePrice)(nil), // 54: vega.snapshot.v1.TimePrice - (*PriceVolume)(nil), // 55: vega.snapshot.v1.PriceVolume - (*PriceRange)(nil), // 56: vega.snapshot.v1.PriceRange - (*PriceBound)(nil), // 57: vega.snapshot.v1.PriceBound - (*PriceRangeCache)(nil), // 58: vega.snapshot.v1.PriceRangeCache - (*CurrentPrice)(nil), // 59: vega.snapshot.v1.CurrentPrice - (*PastPrice)(nil), // 60: vega.snapshot.v1.PastPrice - (*PriceMonitor)(nil), // 61: vega.snapshot.v1.PriceMonitor - (*AuctionState)(nil), // 62: vega.snapshot.v1.AuctionState - (*EquityShareLP)(nil), // 63: vega.snapshot.v1.EquityShareLP - (*EquityShare)(nil), // 64: vega.snapshot.v1.EquityShare - (*FeeSplitter)(nil), // 65: vega.snapshot.v1.FeeSplitter - (*SpotMarket)(nil), // 66: vega.snapshot.v1.SpotMarket - (*Market)(nil), // 67: vega.snapshot.v1.Market - (*PartyMarginFactor)(nil), // 68: vega.snapshot.v1.PartyMarginFactor - (*Product)(nil), // 69: vega.snapshot.v1.Product - (*DataPoint)(nil), // 70: vega.snapshot.v1.DataPoint - (*AuctionIntervals)(nil), // 71: vega.snapshot.v1.AuctionIntervals - (*TWAPData)(nil), // 72: vega.snapshot.v1.TWAPData - (*Perps)(nil), // 73: vega.snapshot.v1.Perps - (*OrdersAtPrice)(nil), // 74: vega.snapshot.v1.OrdersAtPrice - (*PricedStopOrders)(nil), // 75: vega.snapshot.v1.PricedStopOrders - (*TrailingStopOrders)(nil), // 76: vega.snapshot.v1.TrailingStopOrders - (*OrdersAtOffset)(nil), // 77: vega.snapshot.v1.OrdersAtOffset - (*OffsetsAtPrice)(nil), // 78: vega.snapshot.v1.OffsetsAtPrice - (*StopOrders)(nil), // 79: vega.snapshot.v1.StopOrders - (*PeggedOrders)(nil), // 80: vega.snapshot.v1.PeggedOrders - (*SLANetworkParams)(nil), // 81: vega.snapshot.v1.SLANetworkParams - (*ExecutionMarkets)(nil), // 82: vega.snapshot.v1.ExecutionMarkets - (*Successors)(nil), // 83: vega.snapshot.v1.Successors - (*Position)(nil), // 84: vega.snapshot.v1.Position - (*MarketPositions)(nil), // 85: vega.snapshot.v1.MarketPositions - (*PartyPositionStats)(nil), // 86: vega.snapshot.v1.PartyPositionStats - (*SettlementState)(nil), // 87: vega.snapshot.v1.SettlementState - (*LastSettledPosition)(nil), // 88: vega.snapshot.v1.LastSettledPosition - (*SettlementTrade)(nil), // 89: vega.snapshot.v1.SettlementTrade - (*AppState)(nil), // 90: vega.snapshot.v1.AppState - (*EpochState)(nil), // 91: vega.snapshot.v1.EpochState - (*RewardsPendingPayouts)(nil), // 92: vega.snapshot.v1.RewardsPendingPayouts - (*ScheduledRewardsPayout)(nil), // 93: vega.snapshot.v1.ScheduledRewardsPayout - (*RewardsPayout)(nil), // 94: vega.snapshot.v1.RewardsPayout - (*RewardsPartyAmount)(nil), // 95: vega.snapshot.v1.RewardsPartyAmount - (*LimitState)(nil), // 96: vega.snapshot.v1.LimitState - (*VoteSpamPolicy)(nil), // 97: vega.snapshot.v1.VoteSpamPolicy - (*PartyProposalVoteCount)(nil), // 98: vega.snapshot.v1.PartyProposalVoteCount - (*PartyTokenBalance)(nil), // 99: vega.snapshot.v1.PartyTokenBalance - (*BlockRejectStats)(nil), // 100: vega.snapshot.v1.BlockRejectStats - (*SpamPartyTransactionCount)(nil), // 101: vega.snapshot.v1.SpamPartyTransactionCount - (*SimpleSpamPolicy)(nil), // 102: vega.snapshot.v1.SimpleSpamPolicy - (*NotarySigs)(nil), // 103: vega.snapshot.v1.NotarySigs - (*Notary)(nil), // 104: vega.snapshot.v1.Notary - (*StakeVerifierDeposited)(nil), // 105: vega.snapshot.v1.StakeVerifierDeposited - (*StakeVerifierRemoved)(nil), // 106: vega.snapshot.v1.StakeVerifierRemoved - (*StakeVerifierPending)(nil), // 107: vega.snapshot.v1.StakeVerifierPending - (*L2EthOracles)(nil), // 108: vega.snapshot.v1.L2EthOracles - (*ChainIdEthOracles)(nil), // 109: vega.snapshot.v1.ChainIdEthOracles - (*EthOracleVerifierLastBlock)(nil), // 110: vega.snapshot.v1.EthOracleVerifierLastBlock - (*EthOracleVerifierMisc)(nil), // 111: vega.snapshot.v1.EthOracleVerifierMisc - (*EthContractCallResults)(nil), // 112: vega.snapshot.v1.EthContractCallResults - (*EthContractCallResult)(nil), // 113: vega.snapshot.v1.EthContractCallResult - (*EthVerifierBucket)(nil), // 114: vega.snapshot.v1.EthVerifierBucket - (*PendingKeyRotation)(nil), // 115: vega.snapshot.v1.PendingKeyRotation - (*PendingEthereumKeyRotation)(nil), // 116: vega.snapshot.v1.PendingEthereumKeyRotation - (*Topology)(nil), // 117: vega.snapshot.v1.Topology - (*ToplogySignatures)(nil), // 118: vega.snapshot.v1.ToplogySignatures - (*PendingERC20MultisigControlSignature)(nil), // 119: vega.snapshot.v1.PendingERC20MultisigControlSignature - (*IssuedERC20MultisigControlSignature)(nil), // 120: vega.snapshot.v1.IssuedERC20MultisigControlSignature - (*ValidatorState)(nil), // 121: vega.snapshot.v1.ValidatorState - (*HeartbeatTracker)(nil), // 122: vega.snapshot.v1.HeartbeatTracker - (*PerformanceStats)(nil), // 123: vega.snapshot.v1.PerformanceStats - (*ValidatorPerformance)(nil), // 124: vega.snapshot.v1.ValidatorPerformance - (*LiquidityParameters)(nil), // 125: vega.snapshot.v1.LiquidityParameters - (*LiquidityPendingProvisions)(nil), // 126: vega.snapshot.v1.LiquidityPendingProvisions - (*LiquidityPartiesLiquidityOrders)(nil), // 127: vega.snapshot.v1.LiquidityPartiesLiquidityOrders - (*PartyOrders)(nil), // 128: vega.snapshot.v1.PartyOrders - (*LiquidityPartiesOrders)(nil), // 129: vega.snapshot.v1.LiquidityPartiesOrders - (*LiquidityProvisions)(nil), // 130: vega.snapshot.v1.LiquidityProvisions - (*LiquidityScores)(nil), // 131: vega.snapshot.v1.LiquidityScores - (*LiquidityScore)(nil), // 132: vega.snapshot.v1.LiquidityScore - (*LiquidityV2Parameters)(nil), // 133: vega.snapshot.v1.LiquidityV2Parameters - (*LiquidityV2PaidFeesStats)(nil), // 134: vega.snapshot.v1.LiquidityV2PaidFeesStats - (*LiquidityV2Provisions)(nil), // 135: vega.snapshot.v1.LiquidityV2Provisions - (*LiquidityV2PendingProvisions)(nil), // 136: vega.snapshot.v1.LiquidityV2PendingProvisions - (*LiquidityV2Performances)(nil), // 137: vega.snapshot.v1.LiquidityV2Performances - (*LiquidityV2PerformancePerParty)(nil), // 138: vega.snapshot.v1.LiquidityV2PerformancePerParty - (*LiquidityV2Scores)(nil), // 139: vega.snapshot.v1.LiquidityV2Scores - (*LiquidityV2Supplied)(nil), // 140: vega.snapshot.v1.LiquidityV2Supplied - (*FloatingPointConsensus)(nil), // 141: vega.snapshot.v1.FloatingPointConsensus - (*StateVarInternalState)(nil), // 142: vega.snapshot.v1.StateVarInternalState - (*FloatingPointValidatorResult)(nil), // 143: vega.snapshot.v1.FloatingPointValidatorResult - (*NextTimeTrigger)(nil), // 144: vega.snapshot.v1.NextTimeTrigger - (*MarketTracker)(nil), // 145: vega.snapshot.v1.MarketTracker - (*SignerEventsPerAddress)(nil), // 146: vega.snapshot.v1.SignerEventsPerAddress - (*ERC20MultiSigTopologyVerified)(nil), // 147: vega.snapshot.v1.ERC20MultiSigTopologyVerified - (*ERC20MultiSigTopologyPending)(nil), // 148: vega.snapshot.v1.ERC20MultiSigTopologyPending - (*ProofOfWork)(nil), // 149: vega.snapshot.v1.ProofOfWork - (*BannedParty)(nil), // 150: vega.snapshot.v1.BannedParty - (*ProofOfWorkParams)(nil), // 151: vega.snapshot.v1.ProofOfWorkParams - (*ProofOfWorkState)(nil), // 152: vega.snapshot.v1.ProofOfWorkState - (*ProofOfWorkBlockState)(nil), // 153: vega.snapshot.v1.ProofOfWorkBlockState - (*ProofOfWorkPartyStateForBlock)(nil), // 154: vega.snapshot.v1.ProofOfWorkPartyStateForBlock - (*TransactionsAtHeight)(nil), // 155: vega.snapshot.v1.TransactionsAtHeight - (*NonceRef)(nil), // 156: vega.snapshot.v1.NonceRef - (*NonceRefsAtHeight)(nil), // 157: vega.snapshot.v1.NonceRefsAtHeight - (*ProtocolUpgradeProposals)(nil), // 158: vega.snapshot.v1.ProtocolUpgradeProposals - (*AcceptedProtocolUpgradeProposal)(nil), // 159: vega.snapshot.v1.AcceptedProtocolUpgradeProposal - (*Teams)(nil), // 160: vega.snapshot.v1.Teams - (*Team)(nil), // 161: vega.snapshot.v1.Team - (*Membership)(nil), // 162: vega.snapshot.v1.Membership - (*TeamSwitches)(nil), // 163: vega.snapshot.v1.TeamSwitches - (*TeamSwitch)(nil), // 164: vega.snapshot.v1.TeamSwitch - (*Vesting)(nil), // 165: vega.snapshot.v1.Vesting - (*PartyReward)(nil), // 166: vega.snapshot.v1.PartyReward - (*ReferralProgramData)(nil), // 167: vega.snapshot.v1.ReferralProgramData - (*ReferralSet)(nil), // 168: vega.snapshot.v1.ReferralSet - (*RunningVolume)(nil), // 169: vega.snapshot.v1.RunningVolume - (*FactorByReferee)(nil), // 170: vega.snapshot.v1.FactorByReferee - (*AssetLocked)(nil), // 171: vega.snapshot.v1.AssetLocked - (*EpochBalance)(nil), // 172: vega.snapshot.v1.EpochBalance - (*InVesting)(nil), // 173: vega.snapshot.v1.InVesting - (*ActivityStreak)(nil), // 174: vega.snapshot.v1.ActivityStreak - (*PartyActivityStreak)(nil), // 175: vega.snapshot.v1.PartyActivityStreak - (*VolumeDiscountProgram)(nil), // 176: vega.snapshot.v1.VolumeDiscountProgram - (*VolumeDiscountStats)(nil), // 177: vega.snapshot.v1.VolumeDiscountStats - (*EpochPartyVolumes)(nil), // 178: vega.snapshot.v1.EpochPartyVolumes - (*PartyVolume)(nil), // 179: vega.snapshot.v1.PartyVolume - (*Liquidation)(nil), // 180: vega.snapshot.v1.Liquidation - (*PartyAssetAmount)(nil), // 181: vega.snapshot.v1.PartyAssetAmount - (*BankingTransferFeeDiscounts)(nil), // 182: vega.snapshot.v1.BankingTransferFeeDiscounts - (*CompositePriceCalculator)(nil), // 183: vega.snapshot.v1.CompositePriceCalculator - (*Parties)(nil), // 184: vega.snapshot.v1.Parties - (*PartyProfile)(nil), // 185: vega.snapshot.v1.PartyProfile - (*v1.Signer)(nil), // 186: vega.data.v1.Signer - (*v1.Property)(nil), // 187: vega.data.v1.Property - (*vega.Account)(nil), // 188: vega.Account - (*vega.Asset)(nil), // 189: vega.Asset - (*vega.Withdrawal)(nil), // 190: vega.Withdrawal - (*vega.Deposit)(nil), // 191: vega.Deposit - (*v11.AssetAction)(nil), // 192: vega.checkpoint.v1.AssetAction - (*v11.RecurringTransfers)(nil), // 193: vega.checkpoint.v1.RecurringTransfers - (*v11.ScheduledTransferAtTime)(nil), // 194: vega.checkpoint.v1.ScheduledTransferAtTime - (*v11.GovernanceTransfer)(nil), // 195: vega.checkpoint.v1.GovernanceTransfer - (*v11.ScheduledGovernanceTransferAtTime)(nil), // 196: vega.checkpoint.v1.ScheduledGovernanceTransferAtTime - (*v11.BridgeState)(nil), // 197: vega.checkpoint.v1.BridgeState - (*vega.Delegation)(nil), // 198: vega.Delegation - (*vega.Proposal)(nil), // 199: vega.Proposal - (*vega.Vote)(nil), // 200: vega.Vote - (*v12.StakeLinking)(nil), // 201: vega.events.v1.StakeLinking - (*vega.StakeTotalSupply)(nil), // 202: vega.StakeTotalSupply - (*vega.Order)(nil), // 203: vega.Order - (*vega.NetworkParameter)(nil), // 204: vega.NetworkParameter - (*vega.PriceMonitoringTrigger)(nil), // 205: vega.PriceMonitoringTrigger - (vega.Market_TradingMode)(0), // 206: vega.Market.TradingMode - (vega.AuctionTrigger)(0), // 207: vega.AuctionTrigger - (*vega.AuctionDuration)(nil), // 208: vega.AuctionDuration - (*vega.Market)(nil), // 209: vega.Market - (*v12.FeesStats)(nil), // 210: vega.events.v1.FeesStats - (*v12.StopOrderEvent)(nil), // 211: vega.events.v1.StopOrderEvent - (*v11.MarketState)(nil), // 212: vega.checkpoint.v1.MarketState - (*v12.ValidatorUpdate)(nil), // 213: vega.events.v1.ValidatorUpdate - (*vega.RankingScore)(nil), // 214: vega.RankingScore - (*vega.LiquidityProvision)(nil), // 215: vega.LiquidityProvision - (*vega.LiquiditySLAParameters)(nil), // 216: vega.LiquiditySLAParameters - (*v12.PaidLiquidityFeesStats)(nil), // 217: vega.events.v1.PaidLiquidityFeesStats - (*vega.KeyValueBundle)(nil), // 218: vega.KeyValueBundle - (*v11.MarketActivityTracker)(nil), // 219: vega.checkpoint.v1.MarketActivityTracker - (*v11.TakerNotionalVolume)(nil), // 220: vega.checkpoint.v1.TakerNotionalVolume - (*v11.MarketToPartyTakerNotionalVolume)(nil), // 221: vega.checkpoint.v1.MarketToPartyTakerNotionalVolume - (*v12.ERC20MultiSigSignerEvent)(nil), // 222: vega.events.v1.ERC20MultiSigSignerEvent - (*v12.ERC20MultiSigThresholdSetEvent)(nil), // 223: vega.events.v1.ERC20MultiSigThresholdSetEvent - (*v12.ProtocolUpgradeEvent)(nil), // 224: vega.events.v1.ProtocolUpgradeEvent - (*vega.ReferralProgram)(nil), // 225: vega.ReferralProgram - (*vega.VolumeDiscountProgram)(nil), // 226: vega.VolumeDiscountProgram - (*vega.LiquidationStrategy)(nil), // 227: vega.LiquidationStrategy - (*vega.CompositePriceConfiguration)(nil), // 228: vega.CompositePriceConfiguration - (*vega.Trade)(nil), // 229: vega.Trade - (*vega.Metadata)(nil), // 230: vega.Metadata + (*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 } var file_vega_snapshot_v1_snapshot_proto_depIdxs = []int32{ 0, // 0: vega.snapshot.v1.Snapshot.format:type_name -> vega.snapshot.v1.Format @@ -16268,291 +16662,301 @@ var file_vega_snapshot_v1_snapshot_proto_depIdxs = []int32{ 30, // 6: vega.snapshot.v1.Payload.banking_deposits:type_name -> vega.snapshot.v1.BankingDeposits 31, // 7: vega.snapshot.v1.Payload.banking_seen:type_name -> vega.snapshot.v1.BankingSeen 32, // 8: vega.snapshot.v1.Payload.banking_asset_actions:type_name -> vega.snapshot.v1.BankingAssetActions - 38, // 9: vega.snapshot.v1.Payload.checkpoint:type_name -> vega.snapshot.v1.Checkpoint + 39, // 9: vega.snapshot.v1.Payload.checkpoint:type_name -> vega.snapshot.v1.Checkpoint 21, // 10: vega.snapshot.v1.Payload.collateral_accounts:type_name -> vega.snapshot.v1.CollateralAccounts 22, // 11: vega.snapshot.v1.Payload.collateral_assets:type_name -> vega.snapshot.v1.CollateralAssets - 40, // 12: vega.snapshot.v1.Payload.delegation_active:type_name -> vega.snapshot.v1.DelegationActive - 41, // 13: vega.snapshot.v1.Payload.delegation_pending:type_name -> vega.snapshot.v1.DelegationPending - 42, // 14: vega.snapshot.v1.Payload.delegation_auto:type_name -> vega.snapshot.v1.DelegationAuto - 45, // 15: vega.snapshot.v1.Payload.governance_active:type_name -> vega.snapshot.v1.GovernanceActive - 44, // 16: vega.snapshot.v1.Payload.governance_enacted:type_name -> vega.snapshot.v1.GovernanceEnacted - 50, // 17: vega.snapshot.v1.Payload.staking_accounts:type_name -> vega.snapshot.v1.StakingAccounts - 51, // 18: vega.snapshot.v1.Payload.matching_book:type_name -> vega.snapshot.v1.MatchingBook - 52, // 19: vega.snapshot.v1.Payload.network_parameters:type_name -> vega.snapshot.v1.NetParams - 82, // 20: vega.snapshot.v1.Payload.execution_markets:type_name -> vega.snapshot.v1.ExecutionMarkets - 85, // 21: vega.snapshot.v1.Payload.market_positions:type_name -> vega.snapshot.v1.MarketPositions - 90, // 22: vega.snapshot.v1.Payload.app_state:type_name -> vega.snapshot.v1.AppState - 91, // 23: vega.snapshot.v1.Payload.epoch:type_name -> vega.snapshot.v1.EpochState - 92, // 24: vega.snapshot.v1.Payload.rewards_pending_payouts:type_name -> vega.snapshot.v1.RewardsPendingPayouts - 48, // 25: vega.snapshot.v1.Payload.governance_node:type_name -> vega.snapshot.v1.GovernanceNode - 96, // 26: vega.snapshot.v1.Payload.limit_state:type_name -> vega.snapshot.v1.LimitState - 97, // 27: vega.snapshot.v1.Payload.vote_spam_policy:type_name -> vega.snapshot.v1.VoteSpamPolicy - 102, // 28: vega.snapshot.v1.Payload.simple_spam_policy:type_name -> vega.snapshot.v1.SimpleSpamPolicy - 104, // 29: vega.snapshot.v1.Payload.notary:type_name -> vega.snapshot.v1.Notary + 41, // 12: vega.snapshot.v1.Payload.delegation_active:type_name -> vega.snapshot.v1.DelegationActive + 42, // 13: vega.snapshot.v1.Payload.delegation_pending:type_name -> vega.snapshot.v1.DelegationPending + 43, // 14: vega.snapshot.v1.Payload.delegation_auto:type_name -> vega.snapshot.v1.DelegationAuto + 46, // 15: vega.snapshot.v1.Payload.governance_active:type_name -> vega.snapshot.v1.GovernanceActive + 45, // 16: vega.snapshot.v1.Payload.governance_enacted:type_name -> vega.snapshot.v1.GovernanceEnacted + 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 + 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 20, // 30: vega.snapshot.v1.Payload.event_forwarder:type_name -> vega.snapshot.v1.EventForwarder - 105, // 31: vega.snapshot.v1.Payload.stake_verifier_deposited:type_name -> vega.snapshot.v1.StakeVerifierDeposited - 106, // 32: vega.snapshot.v1.Payload.stake_verifier_removed:type_name -> vega.snapshot.v1.StakeVerifierRemoved + 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 17, // 33: vega.snapshot.v1.Payload.witness:type_name -> vega.snapshot.v1.Witness - 39, // 34: vega.snapshot.v1.Payload.delegation_last_reconciliation_time:type_name -> vega.snapshot.v1.DelegationLastReconciliationTime - 117, // 35: vega.snapshot.v1.Payload.topology:type_name -> vega.snapshot.v1.Topology + 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 14, // 36: vega.snapshot.v1.Payload.oracle_data:type_name -> vega.snapshot.v1.OracleDataBatch - 125, // 37: vega.snapshot.v1.Payload.liquidity_parameters:type_name -> vega.snapshot.v1.LiquidityParameters - 126, // 38: vega.snapshot.v1.Payload.liquidity_pending_provisions:type_name -> vega.snapshot.v1.LiquidityPendingProvisions - 127, // 39: vega.snapshot.v1.Payload.liquidity_parties_liquidity_orders:type_name -> vega.snapshot.v1.LiquidityPartiesLiquidityOrders - 129, // 40: vega.snapshot.v1.Payload.liquidity_parties_orders:type_name -> vega.snapshot.v1.LiquidityPartiesOrders - 130, // 41: vega.snapshot.v1.Payload.liquidity_provisions:type_name -> vega.snapshot.v1.LiquidityProvisions + 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 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 - 141, // 44: vega.snapshot.v1.Payload.floating_point_consensus:type_name -> vega.snapshot.v1.FloatingPointConsensus - 145, // 45: vega.snapshot.v1.Payload.market_tracker:type_name -> vega.snapshot.v1.MarketTracker + 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 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 - 147, // 48: vega.snapshot.v1.Payload.erc20_multisig_topology_verified:type_name -> vega.snapshot.v1.ERC20MultiSigTopologyVerified - 148, // 49: vega.snapshot.v1.Payload.erc20_multisig_topology_pending:type_name -> vega.snapshot.v1.ERC20MultiSigTopologyPending - 149, // 50: vega.snapshot.v1.Payload.proof_of_work:type_name -> vega.snapshot.v1.ProofOfWork + 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 25, // 51: vega.snapshot.v1.Payload.pending_asset_updates:type_name -> vega.snapshot.v1.PendingAssetUpdates - 158, // 52: vega.snapshot.v1.Payload.protocol_upgrade_proposals:type_name -> vega.snapshot.v1.ProtocolUpgradeProposals - 37, // 53: vega.snapshot.v1.Payload.banking_bridge_state:type_name -> vega.snapshot.v1.BankingBridgeState - 87, // 54: vega.snapshot.v1.Payload.settlement_state:type_name -> vega.snapshot.v1.SettlementState - 131, // 55: vega.snapshot.v1.Payload.liquidity_scores:type_name -> vega.snapshot.v1.LiquidityScores + 161, // 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 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 - 112, // 59: vega.snapshot.v1.Payload.eth_contract_call_results:type_name -> vega.snapshot.v1.EthContractCallResults - 110, // 60: vega.snapshot.v1.Payload.eth_oracle_verifier_last_block:type_name -> vega.snapshot.v1.EthOracleVerifierLastBlock - 135, // 61: vega.snapshot.v1.Payload.liquidity_v2_provisions:type_name -> vega.snapshot.v1.LiquidityV2Provisions - 136, // 62: vega.snapshot.v1.Payload.liquidity_v2_pending_provisions:type_name -> vega.snapshot.v1.LiquidityV2PendingProvisions - 137, // 63: vega.snapshot.v1.Payload.liquidity_v2_performances:type_name -> vega.snapshot.v1.LiquidityV2Performances - 140, // 64: vega.snapshot.v1.Payload.liquidity_v2_supplied:type_name -> vega.snapshot.v1.LiquidityV2Supplied - 139, // 65: vega.snapshot.v1.Payload.liquidity_v2_scores:type_name -> vega.snapshot.v1.LiquidityV2Scores + 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 7, // 66: vega.snapshot.v1.Payload.holding_account_tracker:type_name -> vega.snapshot.v1.HoldingAccountTracker - 160, // 67: vega.snapshot.v1.Payload.teams:type_name -> vega.snapshot.v1.Teams - 163, // 68: vega.snapshot.v1.Payload.team_switches:type_name -> vega.snapshot.v1.TeamSwitches - 165, // 69: vega.snapshot.v1.Payload.vesting:type_name -> vega.snapshot.v1.Vesting - 167, // 70: vega.snapshot.v1.Payload.referral_program:type_name -> vega.snapshot.v1.ReferralProgramData - 174, // 71: vega.snapshot.v1.Payload.activity_streak:type_name -> vega.snapshot.v1.ActivityStreak - 176, // 72: vega.snapshot.v1.Payload.volume_discount_program:type_name -> vega.snapshot.v1.VolumeDiscountProgram - 133, // 73: vega.snapshot.v1.Payload.liquidity_v2_parameters:type_name -> vega.snapshot.v1.LiquidityV2Parameters - 134, // 74: vega.snapshot.v1.Payload.liquidity_v2_paid_fees_stats:type_name -> vega.snapshot.v1.LiquidityV2PaidFeesStats - 180, // 75: vega.snapshot.v1.Payload.liquidation:type_name -> vega.snapshot.v1.Liquidation - 182, // 76: vega.snapshot.v1.Payload.banking_transfer_fee_discounts:type_name -> vega.snapshot.v1.BankingTransferFeeDiscounts - 47, // 77: vega.snapshot.v1.Payload.governance_batch_active:type_name -> vega.snapshot.v1.GovernanceBatchActive - 184, // 78: vega.snapshot.v1.Payload.parties:type_name -> vega.snapshot.v1.Parties - 108, // 79: vega.snapshot.v1.Payload.l2_eth_oracles:type_name -> vega.snapshot.v1.L2EthOracles - 111, // 80: vega.snapshot.v1.Payload.eth_oracle_verifier_misc:type_name -> vega.snapshot.v1.EthOracleVerifierMisc - 6, // 81: vega.snapshot.v1.HoldingAccountTracker.order_holding:type_name -> vega.snapshot.v1.OrderHoldingQuantities - 9, // 82: vega.snapshot.v1.LiquidityTarget.previous_open_interests:type_name -> vega.snapshot.v1.TimestampedOpenInterest - 9, // 83: vega.snapshot.v1.LiquidityTarget.max_open_interests:type_name -> vega.snapshot.v1.TimestampedOpenInterest - 8, // 84: vega.snapshot.v1.SpotLiquidityTarget.previous_total_stake:type_name -> vega.snapshot.v1.TimestampedTotalStake - 8, // 85: vega.snapshot.v1.SpotLiquidityTarget.max_total_stake:type_name -> vega.snapshot.v1.TimestampedTotalStake - 12, // 86: vega.snapshot.v1.LiquiditySupplied.bid_cache:type_name -> vega.snapshot.v1.LiquidityOffsetProbabilityPair - 12, // 87: vega.snapshot.v1.LiquiditySupplied.ask_cache:type_name -> vega.snapshot.v1.LiquidityOffsetProbabilityPair - 15, // 88: vega.snapshot.v1.OracleDataBatch.oracle_data:type_name -> vega.snapshot.v1.OracleData - 186, // 89: vega.snapshot.v1.OracleData.signers:type_name -> vega.data.v1.Signer - 16, // 90: vega.snapshot.v1.OracleData.data:type_name -> vega.snapshot.v1.OracleDataPair - 187, // 91: vega.snapshot.v1.OracleData.meta_data:type_name -> vega.data.v1.Property - 18, // 92: vega.snapshot.v1.Witness.resources:type_name -> vega.snapshot.v1.Resource - 19, // 93: vega.snapshot.v1.EventForwarder.buckets:type_name -> vega.snapshot.v1.EventForwarderBucket - 188, // 94: vega.snapshot.v1.CollateralAccounts.accounts:type_name -> vega.Account - 189, // 95: vega.snapshot.v1.CollateralAssets.assets:type_name -> vega.Asset - 189, // 96: vega.snapshot.v1.ActiveAssets.assets:type_name -> vega.Asset - 189, // 97: vega.snapshot.v1.PendingAssets.assets:type_name -> vega.Asset - 189, // 98: vega.snapshot.v1.PendingAssetUpdates.assets:type_name -> vega.Asset - 190, // 99: vega.snapshot.v1.Withdrawal.withdrawal:type_name -> vega.Withdrawal - 191, // 100: vega.snapshot.v1.Deposit.deposit:type_name -> vega.Deposit - 26, // 101: vega.snapshot.v1.BankingWithdrawals.withdrawals:type_name -> vega.snapshot.v1.Withdrawal - 27, // 102: vega.snapshot.v1.BankingDeposits.deposit:type_name -> vega.snapshot.v1.Deposit - 192, // 103: vega.snapshot.v1.BankingAssetActions.asset_action:type_name -> vega.checkpoint.v1.AssetAction - 193, // 104: vega.snapshot.v1.BankingRecurringTransfers.recurring_transfers:type_name -> vega.checkpoint.v1.RecurringTransfers - 194, // 105: vega.snapshot.v1.BankingScheduledTransfers.transfers_at_time:type_name -> vega.checkpoint.v1.ScheduledTransferAtTime - 195, // 106: vega.snapshot.v1.BankingRecurringGovernanceTransfers.recurring_transfers:type_name -> vega.checkpoint.v1.GovernanceTransfer - 196, // 107: vega.snapshot.v1.BankingScheduledGovernanceTransfers.transfers_at_time:type_name -> vega.checkpoint.v1.ScheduledGovernanceTransferAtTime - 197, // 108: vega.snapshot.v1.BankingBridgeState.bridge_state:type_name -> vega.checkpoint.v1.BridgeState - 198, // 109: vega.snapshot.v1.DelegationActive.delegations:type_name -> vega.Delegation - 198, // 110: vega.snapshot.v1.DelegationPending.delegations:type_name -> vega.Delegation - 198, // 111: vega.snapshot.v1.DelegationPending.undelegation:type_name -> vega.Delegation - 199, // 112: vega.snapshot.v1.ProposalData.proposal:type_name -> vega.Proposal - 200, // 113: vega.snapshot.v1.ProposalData.yes:type_name -> vega.Vote - 200, // 114: vega.snapshot.v1.ProposalData.no:type_name -> vega.Vote - 200, // 115: vega.snapshot.v1.ProposalData.invalid:type_name -> vega.Vote - 43, // 116: vega.snapshot.v1.GovernanceEnacted.proposals:type_name -> vega.snapshot.v1.ProposalData - 43, // 117: vega.snapshot.v1.GovernanceActive.proposals:type_name -> vega.snapshot.v1.ProposalData - 43, // 118: vega.snapshot.v1.BatchProposalData.batch_proposal:type_name -> vega.snapshot.v1.ProposalData - 199, // 119: vega.snapshot.v1.BatchProposalData.proposals:type_name -> vega.Proposal - 46, // 120: vega.snapshot.v1.GovernanceBatchActive.batch_proposals:type_name -> vega.snapshot.v1.BatchProposalData - 199, // 121: vega.snapshot.v1.GovernanceNode.proposals:type_name -> vega.Proposal - 43, // 122: vega.snapshot.v1.GovernanceNode.proposal_data:type_name -> vega.snapshot.v1.ProposalData - 201, // 123: vega.snapshot.v1.StakingAccount.events:type_name -> vega.events.v1.StakeLinking - 49, // 124: vega.snapshot.v1.StakingAccounts.accounts:type_name -> vega.snapshot.v1.StakingAccount - 202, // 125: vega.snapshot.v1.StakingAccounts.pending_stake_total_supply:type_name -> vega.StakeTotalSupply - 203, // 126: vega.snapshot.v1.MatchingBook.buy:type_name -> vega.Order - 203, // 127: vega.snapshot.v1.MatchingBook.sell:type_name -> vega.Order - 204, // 128: vega.snapshot.v1.NetParams.params:type_name -> vega.NetworkParameter - 205, // 129: vega.snapshot.v1.PriceBound.trigger:type_name -> vega.PriceMonitoringTrigger - 57, // 130: vega.snapshot.v1.PriceRangeCache.bound:type_name -> vega.snapshot.v1.PriceBound - 56, // 131: vega.snapshot.v1.PriceRangeCache.range:type_name -> vega.snapshot.v1.PriceRange - 53, // 132: vega.snapshot.v1.PriceMonitor.fp_horizons:type_name -> vega.snapshot.v1.DecimalMap - 57, // 133: vega.snapshot.v1.PriceMonitor.bounds:type_name -> vega.snapshot.v1.PriceBound - 58, // 134: vega.snapshot.v1.PriceMonitor.price_range_cache:type_name -> vega.snapshot.v1.PriceRangeCache - 53, // 135: vega.snapshot.v1.PriceMonitor.ref_price_cache:type_name -> vega.snapshot.v1.DecimalMap - 59, // 136: vega.snapshot.v1.PriceMonitor.prices_now:type_name -> vega.snapshot.v1.CurrentPrice - 60, // 137: vega.snapshot.v1.PriceMonitor.prices_past:type_name -> vega.snapshot.v1.PastPrice - 206, // 138: vega.snapshot.v1.AuctionState.mode:type_name -> vega.Market.TradingMode - 206, // 139: vega.snapshot.v1.AuctionState.default_mode:type_name -> vega.Market.TradingMode - 207, // 140: vega.snapshot.v1.AuctionState.trigger:type_name -> vega.AuctionTrigger - 208, // 141: vega.snapshot.v1.AuctionState.end:type_name -> vega.AuctionDuration - 207, // 142: vega.snapshot.v1.AuctionState.extension:type_name -> vega.AuctionTrigger - 63, // 143: vega.snapshot.v1.EquityShare.lps:type_name -> vega.snapshot.v1.EquityShareLP - 209, // 144: vega.snapshot.v1.SpotMarket.market:type_name -> vega.Market - 61, // 145: vega.snapshot.v1.SpotMarket.price_monitor:type_name -> vega.snapshot.v1.PriceMonitor - 62, // 146: vega.snapshot.v1.SpotMarket.auction_state:type_name -> vega.snapshot.v1.AuctionState - 80, // 147: vega.snapshot.v1.SpotMarket.pegged_orders:type_name -> vega.snapshot.v1.PeggedOrders - 203, // 148: vega.snapshot.v1.SpotMarket.expiring_orders:type_name -> vega.Order - 64, // 149: vega.snapshot.v1.SpotMarket.equity_share:type_name -> vega.snapshot.v1.EquityShare - 65, // 150: vega.snapshot.v1.SpotMarket.fee_splitter:type_name -> vega.snapshot.v1.FeeSplitter - 79, // 151: vega.snapshot.v1.SpotMarket.stop_orders:type_name -> vega.snapshot.v1.StopOrders - 203, // 152: vega.snapshot.v1.SpotMarket.expiring_stop_orders:type_name -> vega.Order - 210, // 153: vega.snapshot.v1.SpotMarket.fees_stats:type_name -> vega.events.v1.FeesStats - 209, // 154: vega.snapshot.v1.Market.market:type_name -> vega.Market - 61, // 155: vega.snapshot.v1.Market.price_monitor:type_name -> vega.snapshot.v1.PriceMonitor - 62, // 156: vega.snapshot.v1.Market.auction_state:type_name -> vega.snapshot.v1.AuctionState - 80, // 157: vega.snapshot.v1.Market.pegged_orders:type_name -> vega.snapshot.v1.PeggedOrders - 203, // 158: vega.snapshot.v1.Market.expiring_orders:type_name -> vega.Order - 64, // 159: vega.snapshot.v1.Market.equity_share:type_name -> vega.snapshot.v1.EquityShare - 65, // 160: vega.snapshot.v1.Market.fee_splitter:type_name -> vega.snapshot.v1.FeeSplitter - 79, // 161: vega.snapshot.v1.Market.stop_orders:type_name -> vega.snapshot.v1.StopOrders - 203, // 162: vega.snapshot.v1.Market.expiring_stop_orders:type_name -> vega.Order - 69, // 163: vega.snapshot.v1.Market.product:type_name -> vega.snapshot.v1.Product - 210, // 164: vega.snapshot.v1.Market.fees_stats:type_name -> vega.events.v1.FeesStats - 68, // 165: vega.snapshot.v1.Market.party_margin_factor:type_name -> vega.snapshot.v1.PartyMarginFactor - 183, // 166: vega.snapshot.v1.Market.mark_price_calculator:type_name -> vega.snapshot.v1.CompositePriceCalculator - 183, // 167: vega.snapshot.v1.Market.internal_composite_price_calculator:type_name -> vega.snapshot.v1.CompositePriceCalculator - 73, // 168: vega.snapshot.v1.Product.perps:type_name -> vega.snapshot.v1.Perps - 70, // 169: vega.snapshot.v1.Perps.external_data_point:type_name -> vega.snapshot.v1.DataPoint - 70, // 170: vega.snapshot.v1.Perps.internal_data_point:type_name -> vega.snapshot.v1.DataPoint - 72, // 171: vega.snapshot.v1.Perps.external_twap_data:type_name -> vega.snapshot.v1.TWAPData - 72, // 172: vega.snapshot.v1.Perps.internal_twap_data:type_name -> vega.snapshot.v1.TWAPData - 71, // 173: vega.snapshot.v1.Perps.auction_intervals:type_name -> vega.snapshot.v1.AuctionIntervals - 74, // 174: vega.snapshot.v1.PricedStopOrders.falls_bellow:type_name -> vega.snapshot.v1.OrdersAtPrice - 74, // 175: vega.snapshot.v1.PricedStopOrders.rises_above:type_name -> vega.snapshot.v1.OrdersAtPrice - 78, // 176: vega.snapshot.v1.TrailingStopOrders.falls_bellow:type_name -> vega.snapshot.v1.OffsetsAtPrice - 78, // 177: vega.snapshot.v1.TrailingStopOrders.rises_above:type_name -> vega.snapshot.v1.OffsetsAtPrice - 77, // 178: vega.snapshot.v1.OffsetsAtPrice.offsets:type_name -> vega.snapshot.v1.OrdersAtOffset - 211, // 179: vega.snapshot.v1.StopOrders.stop_orders:type_name -> vega.events.v1.StopOrderEvent - 75, // 180: vega.snapshot.v1.StopOrders.priced_stop_orders:type_name -> vega.snapshot.v1.PricedStopOrders - 76, // 181: vega.snapshot.v1.StopOrders.trailing_stop_orders:type_name -> vega.snapshot.v1.TrailingStopOrders - 203, // 182: vega.snapshot.v1.PeggedOrders.parked_orders:type_name -> vega.Order - 67, // 183: vega.snapshot.v1.ExecutionMarkets.markets:type_name -> vega.snapshot.v1.Market - 66, // 184: vega.snapshot.v1.ExecutionMarkets.spot_markets:type_name -> vega.snapshot.v1.SpotMarket - 212, // 185: vega.snapshot.v1.ExecutionMarkets.settled_markets:type_name -> vega.checkpoint.v1.MarketState - 83, // 186: vega.snapshot.v1.ExecutionMarkets.successors:type_name -> vega.snapshot.v1.Successors - 81, // 187: vega.snapshot.v1.ExecutionMarkets.sla_network_params:type_name -> vega.snapshot.v1.SLANetworkParams - 84, // 188: vega.snapshot.v1.MarketPositions.positions:type_name -> vega.snapshot.v1.Position - 86, // 189: vega.snapshot.v1.MarketPositions.parties_records:type_name -> vega.snapshot.v1.PartyPositionStats - 88, // 190: vega.snapshot.v1.SettlementState.last_settled_positions:type_name -> vega.snapshot.v1.LastSettledPosition - 89, // 191: vega.snapshot.v1.SettlementState.trades:type_name -> vega.snapshot.v1.SettlementTrade - 93, // 192: vega.snapshot.v1.RewardsPendingPayouts.scheduled_rewards_payout:type_name -> vega.snapshot.v1.ScheduledRewardsPayout - 94, // 193: vega.snapshot.v1.ScheduledRewardsPayout.rewards_payout:type_name -> vega.snapshot.v1.RewardsPayout - 95, // 194: vega.snapshot.v1.RewardsPayout.reward_party_amount:type_name -> vega.snapshot.v1.RewardsPartyAmount - 98, // 195: vega.snapshot.v1.VoteSpamPolicy.party_to_vote:type_name -> vega.snapshot.v1.PartyProposalVoteCount - 150, // 196: vega.snapshot.v1.VoteSpamPolicy.banned_parties:type_name -> vega.snapshot.v1.BannedParty - 99, // 197: vega.snapshot.v1.VoteSpamPolicy.token_balance:type_name -> vega.snapshot.v1.PartyTokenBalance - 100, // 198: vega.snapshot.v1.VoteSpamPolicy.recent_blocks_reject_stats:type_name -> vega.snapshot.v1.BlockRejectStats - 101, // 199: vega.snapshot.v1.SimpleSpamPolicy.party_to_count:type_name -> vega.snapshot.v1.SpamPartyTransactionCount - 150, // 200: vega.snapshot.v1.SimpleSpamPolicy.banned_parties:type_name -> vega.snapshot.v1.BannedParty - 99, // 201: vega.snapshot.v1.SimpleSpamPolicy.token_balance:type_name -> vega.snapshot.v1.PartyTokenBalance - 103, // 202: vega.snapshot.v1.Notary.notary_sigs:type_name -> vega.snapshot.v1.NotarySigs - 107, // 203: vega.snapshot.v1.StakeVerifierDeposited.pending_deposited:type_name -> vega.snapshot.v1.StakeVerifierPending - 107, // 204: vega.snapshot.v1.StakeVerifierRemoved.pending_removed:type_name -> vega.snapshot.v1.StakeVerifierPending - 109, // 205: vega.snapshot.v1.L2EthOracles.chain_id_eth_oracles:type_name -> vega.snapshot.v1.ChainIdEthOracles - 110, // 206: vega.snapshot.v1.ChainIdEthOracles.last_block:type_name -> vega.snapshot.v1.EthOracleVerifierLastBlock - 112, // 207: vega.snapshot.v1.ChainIdEthOracles.call_results:type_name -> vega.snapshot.v1.EthContractCallResults - 111, // 208: vega.snapshot.v1.ChainIdEthOracles.misc:type_name -> vega.snapshot.v1.EthOracleVerifierMisc - 114, // 209: vega.snapshot.v1.EthOracleVerifierMisc.buckets:type_name -> vega.snapshot.v1.EthVerifierBucket - 110, // 210: vega.snapshot.v1.EthOracleVerifierMisc.patch_block:type_name -> vega.snapshot.v1.EthOracleVerifierLastBlock - 113, // 211: vega.snapshot.v1.EthContractCallResults.pending_contract_call_result:type_name -> vega.snapshot.v1.EthContractCallResult - 121, // 212: vega.snapshot.v1.Topology.validator_data:type_name -> vega.snapshot.v1.ValidatorState - 115, // 213: vega.snapshot.v1.Topology.pending_pub_key_rotations:type_name -> vega.snapshot.v1.PendingKeyRotation - 124, // 214: vega.snapshot.v1.Topology.validator_performance:type_name -> vega.snapshot.v1.ValidatorPerformance - 116, // 215: vega.snapshot.v1.Topology.pending_ethereum_key_rotations:type_name -> vega.snapshot.v1.PendingEthereumKeyRotation - 118, // 216: vega.snapshot.v1.Topology.signatures:type_name -> vega.snapshot.v1.ToplogySignatures - 116, // 217: vega.snapshot.v1.Topology.unsolved_ethereum_key_rotations:type_name -> vega.snapshot.v1.PendingEthereumKeyRotation - 119, // 218: vega.snapshot.v1.ToplogySignatures.pending_signatures:type_name -> vega.snapshot.v1.PendingERC20MultisigControlSignature - 120, // 219: vega.snapshot.v1.ToplogySignatures.issued_signatures:type_name -> vega.snapshot.v1.IssuedERC20MultisigControlSignature - 213, // 220: vega.snapshot.v1.ValidatorState.validator_update:type_name -> vega.events.v1.ValidatorUpdate - 122, // 221: vega.snapshot.v1.ValidatorState.heartbeat_tracker:type_name -> vega.snapshot.v1.HeartbeatTracker - 214, // 222: vega.snapshot.v1.ValidatorState.ranking_score:type_name -> vega.RankingScore - 123, // 223: vega.snapshot.v1.ValidatorPerformance.validator_perf_stats:type_name -> vega.snapshot.v1.PerformanceStats - 128, // 224: vega.snapshot.v1.LiquidityPartiesLiquidityOrders.party_orders:type_name -> vega.snapshot.v1.PartyOrders - 203, // 225: vega.snapshot.v1.PartyOrders.orders:type_name -> vega.Order - 128, // 226: vega.snapshot.v1.LiquidityPartiesOrders.party_orders:type_name -> vega.snapshot.v1.PartyOrders - 215, // 227: vega.snapshot.v1.LiquidityProvisions.liquidity_provisions:type_name -> vega.LiquidityProvision - 132, // 228: vega.snapshot.v1.LiquidityScores.scores:type_name -> vega.snapshot.v1.LiquidityScore - 216, // 229: vega.snapshot.v1.LiquidityV2Parameters.market_sla_parameters:type_name -> vega.LiquiditySLAParameters - 217, // 230: vega.snapshot.v1.LiquidityV2PaidFeesStats.stats:type_name -> vega.events.v1.PaidLiquidityFeesStats - 215, // 231: vega.snapshot.v1.LiquidityV2Provisions.liquidity_provisions:type_name -> vega.LiquidityProvision - 215, // 232: vega.snapshot.v1.LiquidityV2PendingProvisions.pending_liquidity_provisions:type_name -> vega.LiquidityProvision - 138, // 233: vega.snapshot.v1.LiquidityV2Performances.performance_per_party:type_name -> vega.snapshot.v1.LiquidityV2PerformancePerParty - 132, // 234: vega.snapshot.v1.LiquidityV2Scores.scores:type_name -> vega.snapshot.v1.LiquidityScore - 12, // 235: vega.snapshot.v1.LiquidityV2Supplied.bid_cache:type_name -> vega.snapshot.v1.LiquidityOffsetProbabilityPair - 12, // 236: vega.snapshot.v1.LiquidityV2Supplied.ask_cache:type_name -> vega.snapshot.v1.LiquidityOffsetProbabilityPair - 144, // 237: vega.snapshot.v1.FloatingPointConsensus.next_time_trigger:type_name -> vega.snapshot.v1.NextTimeTrigger - 142, // 238: vega.snapshot.v1.FloatingPointConsensus.state_variables:type_name -> vega.snapshot.v1.StateVarInternalState - 143, // 239: vega.snapshot.v1.StateVarInternalState.validators_results:type_name -> vega.snapshot.v1.FloatingPointValidatorResult - 218, // 240: vega.snapshot.v1.FloatingPointValidatorResult.bundle:type_name -> vega.KeyValueBundle - 219, // 241: vega.snapshot.v1.MarketTracker.market_activity:type_name -> vega.checkpoint.v1.MarketActivityTracker - 220, // 242: vega.snapshot.v1.MarketTracker.taker_notional_volume:type_name -> vega.checkpoint.v1.TakerNotionalVolume - 221, // 243: vega.snapshot.v1.MarketTracker.market_to_party_taker_notional_volume:type_name -> vega.checkpoint.v1.MarketToPartyTakerNotionalVolume - 222, // 244: vega.snapshot.v1.SignerEventsPerAddress.events:type_name -> vega.events.v1.ERC20MultiSigSignerEvent - 146, // 245: vega.snapshot.v1.ERC20MultiSigTopologyVerified.events_per_address:type_name -> vega.snapshot.v1.SignerEventsPerAddress - 223, // 246: vega.snapshot.v1.ERC20MultiSigTopologyVerified.threshold:type_name -> vega.events.v1.ERC20MultiSigThresholdSetEvent - 222, // 247: vega.snapshot.v1.ERC20MultiSigTopologyPending.pending_signers:type_name -> vega.events.v1.ERC20MultiSigSignerEvent - 223, // 248: vega.snapshot.v1.ERC20MultiSigTopologyPending.pending_threshold_set:type_name -> vega.events.v1.ERC20MultiSigThresholdSetEvent - 155, // 249: vega.snapshot.v1.ProofOfWork.tx_at_height:type_name -> vega.snapshot.v1.TransactionsAtHeight - 155, // 250: vega.snapshot.v1.ProofOfWork.tid_at_height:type_name -> vega.snapshot.v1.TransactionsAtHeight - 150, // 251: vega.snapshot.v1.ProofOfWork.banned:type_name -> vega.snapshot.v1.BannedParty - 151, // 252: vega.snapshot.v1.ProofOfWork.pow_params:type_name -> vega.snapshot.v1.ProofOfWorkParams - 152, // 253: vega.snapshot.v1.ProofOfWork.pow_state:type_name -> vega.snapshot.v1.ProofOfWorkState - 157, // 254: vega.snapshot.v1.ProofOfWork.nonce_refs_at_height:type_name -> vega.snapshot.v1.NonceRefsAtHeight - 153, // 255: vega.snapshot.v1.ProofOfWorkState.pow_state:type_name -> vega.snapshot.v1.ProofOfWorkBlockState - 154, // 256: vega.snapshot.v1.ProofOfWorkBlockState.party_state:type_name -> vega.snapshot.v1.ProofOfWorkPartyStateForBlock - 156, // 257: vega.snapshot.v1.NonceRefsAtHeight.refs:type_name -> vega.snapshot.v1.NonceRef - 224, // 258: vega.snapshot.v1.ProtocolUpgradeProposals.active_proposals:type_name -> vega.events.v1.ProtocolUpgradeEvent - 159, // 259: vega.snapshot.v1.ProtocolUpgradeProposals.accepted_proposal:type_name -> vega.snapshot.v1.AcceptedProtocolUpgradeProposal - 161, // 260: vega.snapshot.v1.Teams.teams:type_name -> vega.snapshot.v1.Team - 162, // 261: vega.snapshot.v1.Team.referrer:type_name -> vega.snapshot.v1.Membership - 162, // 262: vega.snapshot.v1.Team.referees:type_name -> vega.snapshot.v1.Membership - 164, // 263: vega.snapshot.v1.TeamSwitches.team_switches:type_name -> vega.snapshot.v1.TeamSwitch - 166, // 264: vega.snapshot.v1.Vesting.parties_reward:type_name -> vega.snapshot.v1.PartyReward - 171, // 265: vega.snapshot.v1.PartyReward.asset_locked:type_name -> vega.snapshot.v1.AssetLocked - 173, // 266: vega.snapshot.v1.PartyReward.in_vesting:type_name -> vega.snapshot.v1.InVesting - 170, // 267: vega.snapshot.v1.ReferralProgramData.factor_by_referee:type_name -> vega.snapshot.v1.FactorByReferee - 225, // 268: vega.snapshot.v1.ReferralProgramData.current_program:type_name -> vega.ReferralProgram - 225, // 269: vega.snapshot.v1.ReferralProgramData.new_program:type_name -> vega.ReferralProgram - 168, // 270: vega.snapshot.v1.ReferralProgramData.sets:type_name -> vega.snapshot.v1.ReferralSet - 162, // 271: vega.snapshot.v1.ReferralSet.referrer:type_name -> vega.snapshot.v1.Membership - 162, // 272: vega.snapshot.v1.ReferralSet.referees:type_name -> vega.snapshot.v1.Membership - 169, // 273: vega.snapshot.v1.ReferralSet.running_volumes:type_name -> vega.snapshot.v1.RunningVolume - 172, // 274: vega.snapshot.v1.AssetLocked.epoch_balances:type_name -> vega.snapshot.v1.EpochBalance - 175, // 275: vega.snapshot.v1.ActivityStreak.parties_activity_streak:type_name -> vega.snapshot.v1.PartyActivityStreak - 178, // 276: vega.snapshot.v1.VolumeDiscountProgram.epoch_party_volumes:type_name -> vega.snapshot.v1.EpochPartyVolumes - 179, // 277: vega.snapshot.v1.VolumeDiscountProgram.average_party_volume:type_name -> vega.snapshot.v1.PartyVolume - 226, // 278: vega.snapshot.v1.VolumeDiscountProgram.current_program:type_name -> vega.VolumeDiscountProgram - 226, // 279: vega.snapshot.v1.VolumeDiscountProgram.new_program:type_name -> vega.VolumeDiscountProgram - 177, // 280: vega.snapshot.v1.VolumeDiscountProgram.factors_by_party:type_name -> vega.snapshot.v1.VolumeDiscountStats - 179, // 281: vega.snapshot.v1.EpochPartyVolumes.party_volume:type_name -> vega.snapshot.v1.PartyVolume - 227, // 282: vega.snapshot.v1.Liquidation.config:type_name -> vega.LiquidationStrategy - 181, // 283: vega.snapshot.v1.BankingTransferFeeDiscounts.party_asset_discount:type_name -> vega.snapshot.v1.PartyAssetAmount - 228, // 284: vega.snapshot.v1.CompositePriceCalculator.price_configuration:type_name -> vega.CompositePriceConfiguration - 229, // 285: vega.snapshot.v1.CompositePriceCalculator.trades:type_name -> vega.Trade - 54, // 286: vega.snapshot.v1.CompositePriceCalculator.book_price_at_time:type_name -> vega.snapshot.v1.TimePrice - 185, // 287: vega.snapshot.v1.Parties.profiles:type_name -> vega.snapshot.v1.PartyProfile - 230, // 288: vega.snapshot.v1.PartyProfile.metadata:type_name -> vega.Metadata - 289, // [289:289] is the sub-list for method output_type - 289, // [289:289] is the sub-list for method input_type - 289, // [289:289] is the sub-list for extension type_name - 289, // [289:289] is the sub-list for extension extendee - 0, // [0:289] is the sub-list for field type_name + 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 + 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 + 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 } func init() { file_vega_snapshot_v1_snapshot_proto_init() } @@ -17006,7 +17410,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Checkpoint); i { + switch v := v.(*BankingEVMBridgeStates); i { case 0: return &v.state case 1: @@ -17018,7 +17422,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DelegationLastReconciliationTime); i { + switch v := v.(*Checkpoint); i { case 0: return &v.state case 1: @@ -17030,7 +17434,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DelegationActive); i { + switch v := v.(*DelegationLastReconciliationTime); i { case 0: return &v.state case 1: @@ -17042,7 +17446,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DelegationPending); i { + switch v := v.(*DelegationActive); i { case 0: return &v.state case 1: @@ -17054,7 +17458,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DelegationAuto); i { + switch v := v.(*DelegationPending); i { case 0: return &v.state case 1: @@ -17066,7 +17470,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProposalData); i { + switch v := v.(*DelegationAuto); i { case 0: return &v.state case 1: @@ -17078,7 +17482,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GovernanceEnacted); i { + switch v := v.(*ProposalData); i { case 0: return &v.state case 1: @@ -17090,7 +17494,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GovernanceActive); i { + switch v := v.(*GovernanceEnacted); i { case 0: return &v.state case 1: @@ -17102,7 +17506,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchProposalData); i { + switch v := v.(*GovernanceActive); i { case 0: return &v.state case 1: @@ -17114,7 +17518,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GovernanceBatchActive); i { + switch v := v.(*BatchProposalData); i { case 0: return &v.state case 1: @@ -17126,7 +17530,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GovernanceNode); i { + switch v := v.(*GovernanceBatchActive); i { case 0: return &v.state case 1: @@ -17138,7 +17542,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StakingAccount); i { + switch v := v.(*GovernanceNode); i { case 0: return &v.state case 1: @@ -17150,7 +17554,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StakingAccounts); i { + switch v := v.(*StakingAccount); i { case 0: return &v.state case 1: @@ -17162,7 +17566,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchingBook); i { + switch v := v.(*StakingAccounts); i { case 0: return &v.state case 1: @@ -17174,7 +17578,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NetParams); i { + switch v := v.(*MatchingBook); i { case 0: return &v.state case 1: @@ -17186,7 +17590,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DecimalMap); i { + switch v := v.(*NetParams); i { case 0: return &v.state case 1: @@ -17198,7 +17602,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimePrice); i { + switch v := v.(*DecimalMap); i { case 0: return &v.state case 1: @@ -17210,7 +17614,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PriceVolume); i { + switch v := v.(*TimePrice); i { case 0: return &v.state case 1: @@ -17222,7 +17626,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PriceRange); i { + switch v := v.(*PriceVolume); i { case 0: return &v.state case 1: @@ -17234,7 +17638,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PriceBound); i { + switch v := v.(*PriceRange); i { case 0: return &v.state case 1: @@ -17246,7 +17650,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PriceRangeCache); i { + switch v := v.(*PriceBound); i { case 0: return &v.state case 1: @@ -17258,7 +17662,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CurrentPrice); i { + switch v := v.(*PriceRangeCache); i { case 0: return &v.state case 1: @@ -17270,7 +17674,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PastPrice); i { + switch v := v.(*CurrentPrice); i { case 0: return &v.state case 1: @@ -17282,7 +17686,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PriceMonitor); i { + switch v := v.(*PastPrice); i { case 0: return &v.state case 1: @@ -17294,7 +17698,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuctionState); i { + switch v := v.(*PriceMonitor); i { case 0: return &v.state case 1: @@ -17306,7 +17710,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EquityShareLP); i { + switch v := v.(*AuctionState); i { case 0: return &v.state case 1: @@ -17318,7 +17722,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EquityShare); i { + switch v := v.(*EquityShareLP); i { case 0: return &v.state case 1: @@ -17330,7 +17734,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FeeSplitter); i { + switch v := v.(*EquityShare); i { case 0: return &v.state case 1: @@ -17342,7 +17746,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SpotMarket); i { + switch v := v.(*FeeSplitter); i { case 0: return &v.state case 1: @@ -17354,7 +17758,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Market); i { + switch v := v.(*SpotMarket); i { case 0: return &v.state case 1: @@ -17366,7 +17770,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyMarginFactor); i { + switch v := v.(*Market); i { case 0: return &v.state case 1: @@ -17378,7 +17782,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Product); i { + switch v := v.(*PartyMarginFactor); i { case 0: return &v.state case 1: @@ -17390,7 +17794,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.(*DataPoint); i { + switch v := v.(*Product); i { case 0: return &v.state case 1: @@ -17402,7 +17806,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.(*AuctionIntervals); i { + switch v := v.(*DataPoint); i { case 0: return &v.state case 1: @@ -17414,7 +17818,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.(*TWAPData); i { + switch v := v.(*AuctionIntervals); i { case 0: return &v.state case 1: @@ -17426,7 +17830,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.(*Perps); i { + switch v := v.(*TWAPData); i { case 0: return &v.state case 1: @@ -17438,7 +17842,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.(*OrdersAtPrice); i { + switch v := v.(*Perps); i { case 0: return &v.state case 1: @@ -17450,7 +17854,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.(*PricedStopOrders); i { + switch v := v.(*OrdersAtPrice); i { case 0: return &v.state case 1: @@ -17462,7 +17866,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.(*TrailingStopOrders); i { + switch v := v.(*PricedStopOrders); i { case 0: return &v.state case 1: @@ -17474,7 +17878,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.(*OrdersAtOffset); i { + switch v := v.(*TrailingStopOrders); i { case 0: return &v.state case 1: @@ -17486,7 +17890,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.(*OffsetsAtPrice); i { + switch v := v.(*OrdersAtOffset); i { case 0: return &v.state case 1: @@ -17498,7 +17902,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.(*StopOrders); i { + switch v := v.(*OffsetsAtPrice); i { case 0: return &v.state case 1: @@ -17510,7 +17914,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.(*PeggedOrders); i { + switch v := v.(*StopOrders); i { case 0: return &v.state case 1: @@ -17522,7 +17926,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.(*SLANetworkParams); i { + switch v := v.(*PeggedOrders); i { case 0: return &v.state case 1: @@ -17534,7 +17938,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.(*ExecutionMarkets); i { + switch v := v.(*SLANetworkParams); i { case 0: return &v.state case 1: @@ -17546,7 +17950,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.(*Successors); i { + switch v := v.(*ExecutionMarkets); i { case 0: return &v.state case 1: @@ -17558,7 +17962,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.(*Position); i { + switch v := v.(*Successors); i { case 0: return &v.state case 1: @@ -17570,7 +17974,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.(*MarketPositions); i { + switch v := v.(*Position); i { case 0: return &v.state case 1: @@ -17582,7 +17986,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.(*PartyPositionStats); i { + switch v := v.(*MarketPositions); i { case 0: return &v.state case 1: @@ -17594,7 +17998,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.(*SettlementState); i { + switch v := v.(*PartyPositionStats); i { case 0: return &v.state case 1: @@ -17606,7 +18010,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.(*LastSettledPosition); i { + switch v := v.(*SettlementState); i { case 0: return &v.state case 1: @@ -17618,7 +18022,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.(*SettlementTrade); i { + switch v := v.(*LastSettledPosition); i { case 0: return &v.state case 1: @@ -17630,7 +18034,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.(*AppState); i { + switch v := v.(*SettlementTrade); i { case 0: return &v.state case 1: @@ -17642,7 +18046,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.(*EpochState); i { + switch v := v.(*AppState); i { case 0: return &v.state case 1: @@ -17654,7 +18058,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.(*RewardsPendingPayouts); i { + switch v := v.(*EpochState); i { case 0: return &v.state case 1: @@ -17666,7 +18070,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.(*ScheduledRewardsPayout); i { + switch v := v.(*RewardsPendingPayouts); i { case 0: return &v.state case 1: @@ -17678,7 +18082,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.(*RewardsPayout); i { + switch v := v.(*ScheduledRewardsPayout); i { case 0: return &v.state case 1: @@ -17690,7 +18094,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.(*RewardsPartyAmount); i { + switch v := v.(*RewardsPayout); i { case 0: return &v.state case 1: @@ -17702,7 +18106,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.(*LimitState); i { + switch v := v.(*RewardsPartyAmount); i { case 0: return &v.state case 1: @@ -17714,7 +18118,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.(*VoteSpamPolicy); i { + switch v := v.(*LimitState); i { case 0: return &v.state case 1: @@ -17726,7 +18130,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.(*PartyProposalVoteCount); i { + switch v := v.(*VoteSpamPolicy); i { case 0: return &v.state case 1: @@ -17738,7 +18142,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.(*PartyTokenBalance); i { + switch v := v.(*PartyProposalVoteCount); i { case 0: return &v.state case 1: @@ -17750,7 +18154,7 @@ 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.(*BlockRejectStats); i { + switch v := v.(*PartyTokenBalance); i { case 0: return &v.state case 1: @@ -17762,7 +18166,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SpamPartyTransactionCount); i { + switch v := v.(*BlockRejectStats); i { case 0: return &v.state case 1: @@ -17774,7 +18178,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SimpleSpamPolicy); i { + switch v := v.(*SpamPartyTransactionCount); i { case 0: return &v.state case 1: @@ -17786,7 +18190,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NotarySigs); i { + switch v := v.(*SimpleSpamPolicy); i { case 0: return &v.state case 1: @@ -17798,7 +18202,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Notary); i { + switch v := v.(*NotarySigs); i { case 0: return &v.state case 1: @@ -17810,7 +18214,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StakeVerifierDeposited); i { + switch v := v.(*Notary); i { case 0: return &v.state case 1: @@ -17822,7 +18226,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StakeVerifierRemoved); i { + switch v := v.(*StakeVerifierDeposited); i { case 0: return &v.state case 1: @@ -17834,7 +18238,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StakeVerifierPending); i { + switch v := v.(*StakeVerifierRemoved); i { case 0: return &v.state case 1: @@ -17846,7 +18250,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*L2EthOracles); i { + switch v := v.(*StakeVerifierPending); i { case 0: return &v.state case 1: @@ -17858,7 +18262,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChainIdEthOracles); i { + switch v := v.(*L2EthOracles); i { case 0: return &v.state case 1: @@ -17870,7 +18274,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EthOracleVerifierLastBlock); i { + switch v := v.(*ChainIdEthOracles); i { case 0: return &v.state case 1: @@ -17882,7 +18286,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EthOracleVerifierMisc); i { + switch v := v.(*EthOracleVerifierLastBlock); i { case 0: return &v.state case 1: @@ -17894,7 +18298,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EthContractCallResults); i { + switch v := v.(*EthOracleVerifierMisc); i { case 0: return &v.state case 1: @@ -17906,7 +18310,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EthContractCallResult); i { + switch v := v.(*EthContractCallResults); i { case 0: return &v.state case 1: @@ -17918,7 +18322,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EthVerifierBucket); i { + switch v := v.(*EthContractCallResult); i { case 0: return &v.state case 1: @@ -17930,7 +18334,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PendingKeyRotation); i { + switch v := v.(*EthVerifierBucket); i { case 0: return &v.state case 1: @@ -17942,7 +18346,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PendingEthereumKeyRotation); i { + switch v := v.(*PendingKeyRotation); i { case 0: return &v.state case 1: @@ -17954,7 +18358,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Topology); i { + switch v := v.(*PendingEthereumKeyRotation); i { case 0: return &v.state case 1: @@ -17966,7 +18370,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToplogySignatures); i { + switch v := v.(*Topology); i { case 0: return &v.state case 1: @@ -17978,7 +18382,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PendingERC20MultisigControlSignature); i { + switch v := v.(*ToplogySignatures); i { case 0: return &v.state case 1: @@ -17990,7 +18394,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IssuedERC20MultisigControlSignature); i { + switch v := v.(*PendingERC20MultisigControlSignature); i { case 0: return &v.state case 1: @@ -18002,7 +18406,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatorState); i { + switch v := v.(*IssuedERC20MultisigControlSignature); i { case 0: return &v.state case 1: @@ -18014,7 +18418,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HeartbeatTracker); i { + switch v := v.(*ValidatorState); i { case 0: return &v.state case 1: @@ -18026,7 +18430,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PerformanceStats); i { + switch v := v.(*HeartbeatTracker); i { case 0: return &v.state case 1: @@ -18038,7 +18442,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatorPerformance); i { + switch v := v.(*PerformanceStats); i { case 0: return &v.state case 1: @@ -18050,7 +18454,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityParameters); i { + switch v := v.(*ValidatorPerformance); i { case 0: return &v.state case 1: @@ -18062,7 +18466,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityPendingProvisions); i { + switch v := v.(*LiquidityParameters); i { case 0: return &v.state case 1: @@ -18074,7 +18478,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityPartiesLiquidityOrders); i { + switch v := v.(*LiquidityPendingProvisions); i { case 0: return &v.state case 1: @@ -18086,7 +18490,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyOrders); i { + switch v := v.(*LiquidityPartiesLiquidityOrders); i { case 0: return &v.state case 1: @@ -18098,7 +18502,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityPartiesOrders); i { + switch v := v.(*PartyOrders); i { case 0: return &v.state case 1: @@ -18110,7 +18514,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityProvisions); i { + switch v := v.(*LiquidityPartiesOrders); i { case 0: return &v.state case 1: @@ -18122,7 +18526,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityScores); i { + switch v := v.(*LiquidityProvisions); i { case 0: return &v.state case 1: @@ -18134,7 +18538,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityScore); i { + switch v := v.(*LiquidityScores); i { case 0: return &v.state case 1: @@ -18146,7 +18550,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityV2Parameters); i { + switch v := v.(*LiquidityScore); i { case 0: return &v.state case 1: @@ -18158,7 +18562,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityV2PaidFeesStats); i { + switch v := v.(*LiquidityV2Parameters); i { case 0: return &v.state case 1: @@ -18170,7 +18574,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityV2Provisions); i { + switch v := v.(*LiquidityV2PaidFeesStats); i { case 0: return &v.state case 1: @@ -18182,7 +18586,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityV2PendingProvisions); i { + switch v := v.(*LiquidityV2Provisions); i { case 0: return &v.state case 1: @@ -18194,7 +18598,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityV2Performances); i { + switch v := v.(*LiquidityV2PendingProvisions); i { case 0: return &v.state case 1: @@ -18206,7 +18610,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityV2PerformancePerParty); i { + switch v := v.(*LiquidityV2Performances); i { case 0: return &v.state case 1: @@ -18218,7 +18622,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityV2Scores); i { + switch v := v.(*LiquidityV2PerformancePerParty); i { case 0: return &v.state case 1: @@ -18230,7 +18634,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityV2Supplied); i { + switch v := v.(*LiquidityV2Scores); i { case 0: return &v.state case 1: @@ -18242,7 +18646,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FloatingPointConsensus); i { + switch v := v.(*LiquidityV2Supplied); i { case 0: return &v.state case 1: @@ -18254,7 +18658,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateVarInternalState); i { + switch v := v.(*FloatingPointConsensus); i { case 0: return &v.state case 1: @@ -18266,7 +18670,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FloatingPointValidatorResult); i { + switch v := v.(*StateVarInternalState); i { case 0: return &v.state case 1: @@ -18278,7 +18682,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NextTimeTrigger); i { + switch v := v.(*FloatingPointValidatorResult); i { case 0: return &v.state case 1: @@ -18290,7 +18694,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketTracker); i { + switch v := v.(*NextTimeTrigger); i { case 0: return &v.state case 1: @@ -18302,7 +18706,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignerEventsPerAddress); i { + switch v := v.(*MarketTracker); i { case 0: return &v.state case 1: @@ -18314,7 +18718,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigTopologyVerified); i { + switch v := v.(*SignerEventsPerAddress); i { case 0: return &v.state case 1: @@ -18326,7 +18730,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigTopologyPending); i { + switch v := v.(*ERC20MultiSigTopologyVerified); i { case 0: return &v.state case 1: @@ -18338,7 +18742,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProofOfWork); i { + switch v := v.(*ERC20MultiSigTopologyPending); i { case 0: return &v.state case 1: @@ -18350,7 +18754,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BannedParty); i { + switch v := v.(*EVMMultisigTopology); i { case 0: return &v.state case 1: @@ -18362,7 +18766,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProofOfWorkParams); i { + switch v := v.(*EVMMultisigTopologies); i { case 0: return &v.state case 1: @@ -18374,7 +18778,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProofOfWorkState); i { + switch v := v.(*ProofOfWork); i { case 0: return &v.state case 1: @@ -18386,7 +18790,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProofOfWorkBlockState); i { + switch v := v.(*BannedParty); i { case 0: return &v.state case 1: @@ -18398,7 +18802,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[153].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProofOfWorkPartyStateForBlock); i { + switch v := v.(*ProofOfWorkParams); i { case 0: return &v.state case 1: @@ -18410,7 +18814,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionsAtHeight); i { + switch v := v.(*ProofOfWorkState); i { case 0: return &v.state case 1: @@ -18422,7 +18826,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NonceRef); i { + switch v := v.(*ProofOfWorkBlockState); i { case 0: return &v.state case 1: @@ -18434,7 +18838,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[156].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NonceRefsAtHeight); i { + switch v := v.(*ProofOfWorkPartyStateForBlock); i { case 0: return &v.state case 1: @@ -18446,7 +18850,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[157].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProtocolUpgradeProposals); i { + switch v := v.(*TransactionsAtHeight); i { case 0: return &v.state case 1: @@ -18458,7 +18862,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AcceptedProtocolUpgradeProposal); i { + switch v := v.(*NonceRef); i { case 0: return &v.state case 1: @@ -18470,7 +18874,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Teams); i { + switch v := v.(*NonceRefsAtHeight); i { case 0: return &v.state case 1: @@ -18482,7 +18886,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[160].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Team); i { + switch v := v.(*ProtocolUpgradeProposals); i { case 0: return &v.state case 1: @@ -18494,7 +18898,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[161].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Membership); i { + switch v := v.(*AcceptedProtocolUpgradeProposal); i { case 0: return &v.state case 1: @@ -18506,7 +18910,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[162].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamSwitches); i { + switch v := v.(*Teams); i { case 0: return &v.state case 1: @@ -18518,7 +18922,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamSwitch); i { + switch v := v.(*Team); i { case 0: return &v.state case 1: @@ -18530,7 +18934,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Vesting); i { + switch v := v.(*Membership); i { case 0: return &v.state case 1: @@ -18542,7 +18946,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[165].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyReward); i { + switch v := v.(*TeamSwitches); i { case 0: return &v.state case 1: @@ -18554,7 +18958,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[166].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReferralProgramData); i { + switch v := v.(*TeamSwitch); i { case 0: return &v.state case 1: @@ -18566,7 +18970,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[167].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReferralSet); i { + switch v := v.(*Vesting); i { case 0: return &v.state case 1: @@ -18578,7 +18982,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunningVolume); i { + switch v := v.(*PartyReward); i { case 0: return &v.state case 1: @@ -18590,7 +18994,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FactorByReferee); i { + switch v := v.(*ReferralProgramData); i { case 0: return &v.state case 1: @@ -18602,7 +19006,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[170].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssetLocked); i { + switch v := v.(*ReferralSet); i { case 0: return &v.state case 1: @@ -18614,7 +19018,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[171].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EpochBalance); i { + switch v := v.(*RunningVolume); i { case 0: return &v.state case 1: @@ -18626,7 +19030,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[172].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InVesting); i { + switch v := v.(*FactorByReferee); i { case 0: return &v.state case 1: @@ -18638,7 +19042,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[173].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActivityStreak); i { + switch v := v.(*AssetLocked); i { case 0: return &v.state case 1: @@ -18650,7 +19054,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[174].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyActivityStreak); i { + switch v := v.(*EpochBalance); i { case 0: return &v.state case 1: @@ -18662,7 +19066,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[175].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeDiscountProgram); i { + switch v := v.(*InVesting); i { case 0: return &v.state case 1: @@ -18674,7 +19078,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[176].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeDiscountStats); i { + switch v := v.(*ActivityStreak); i { case 0: return &v.state case 1: @@ -18686,7 +19090,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[177].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EpochPartyVolumes); i { + switch v := v.(*PartyActivityStreak); i { case 0: return &v.state case 1: @@ -18698,7 +19102,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[178].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyVolume); i { + switch v := v.(*VolumeDiscountProgram); i { case 0: return &v.state case 1: @@ -18710,7 +19114,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[179].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Liquidation); i { + switch v := v.(*VolumeDiscountStats); i { case 0: return &v.state case 1: @@ -18722,7 +19126,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[180].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyAssetAmount); i { + switch v := v.(*EpochPartyVolumes); i { case 0: return &v.state case 1: @@ -18734,7 +19138,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[181].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BankingTransferFeeDiscounts); i { + switch v := v.(*PartyVolume); i { case 0: return &v.state case 1: @@ -18746,7 +19150,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[182].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompositePriceCalculator); i { + switch v := v.(*Liquidation); i { case 0: return &v.state case 1: @@ -18758,7 +19162,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[183].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Parties); i { + switch v := v.(*PartyAssetAmount); i { case 0: return &v.state case 1: @@ -18770,6 +19174,42 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[184].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BankingTransferFeeDiscounts); 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[185].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CompositePriceCalculator); 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[186].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Parties); 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[187].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PartyProfile); i { case 0: return &v.state @@ -18781,6 +19221,18 @@ 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{} { + switch v := v.(*MarketLiquidity); 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), @@ -18833,7 +19285,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { (*Payload_ProofOfWork)(nil), (*Payload_PendingAssetUpdates)(nil), (*Payload_ProtocolUpgradeProposals)(nil), - (*Payload_BankingBridgeState)(nil), + (*Payload_BankingPrimaryBridgeState)(nil), (*Payload_SettlementState)(nil), (*Payload_LiquidityScores)(nil), (*Payload_SpotLiquidityTarget)(nil), @@ -18861,20 +19313,22 @@ func file_vega_snapshot_v1_snapshot_proto_init() { (*Payload_Parties)(nil), (*Payload_L2EthOracles)(nil), (*Payload_EthOracleVerifierMisc)(nil), + (*Payload_BankingEvmBridgeStates)(nil), + (*Payload_EvmMultisigTopologies)(nil), } - file_vega_snapshot_v1_snapshot_proto_msgTypes[66].OneofWrappers = []interface{}{} - file_vega_snapshot_v1_snapshot_proto_msgTypes[68].OneofWrappers = []interface{}{ + file_vega_snapshot_v1_snapshot_proto_msgTypes[67].OneofWrappers = []interface{}{} + file_vega_snapshot_v1_snapshot_proto_msgTypes[69].OneofWrappers = []interface{}{ (*Product_Perps)(nil), } - file_vega_snapshot_v1_snapshot_proto_msgTypes[85].OneofWrappers = []interface{}{} - file_vega_snapshot_v1_snapshot_proto_msgTypes[112].OneofWrappers = []interface{}{} + file_vega_snapshot_v1_snapshot_proto_msgTypes[86].OneofWrappers = []interface{}{} + file_vega_snapshot_v1_snapshot_proto_msgTypes[113].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: 185, + NumMessages: 189, NumExtensions: 0, NumServices: 0, }, diff --git a/protos/vega/vega.pb.go b/protos/vega/vega.pb.go index 00c3c3cb38..205f9f4201 100644 --- a/protos/vega/vega.pb.go +++ b/protos/vega/vega.pb.go @@ -739,6 +739,8 @@ const ( AccountType_ACCOUNT_TYPE_PENDING_FEE_REFERRAL_REWARD AccountType = 28 // Per asset market account for party in isolated margin mode AccountType_ACCOUNT_TYPE_ORDER_MARGIN AccountType = 29 + // Per asset market reward account for realised return + AccountType_ACCOUNT_TYPE_REWARD_REALISED_RETURN AccountType = 30 ) // Enum value maps for AccountType. @@ -773,6 +775,7 @@ var ( 27: "ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING", 28: "ACCOUNT_TYPE_PENDING_FEE_REFERRAL_REWARD", 29: "ACCOUNT_TYPE_ORDER_MARGIN", + 30: "ACCOUNT_TYPE_REWARD_REALISED_RETURN", } AccountType_value = map[string]int32{ "ACCOUNT_TYPE_UNSPECIFIED": 0, @@ -804,6 +807,7 @@ var ( "ACCOUNT_TYPE_REWARD_VALIDATOR_RANKING": 27, "ACCOUNT_TYPE_PENDING_FEE_REFERRAL_REWARD": 28, "ACCOUNT_TYPE_ORDER_MARGIN": 29, + "ACCOUNT_TYPE_REWARD_REALISED_RETURN": 30, } ) @@ -1067,6 +1071,8 @@ const ( DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY DispatchMetric = 7 // Dispatch metric that uses the validator ranking of the validator as metric DispatchMetric_DISPATCH_METRIC_VALIDATOR_RANKING DispatchMetric = 8 + // Dispatch metric that uses the realised return of the party in a market + DispatchMetric_DISPATCH_METRIC_REALISED_RETURN DispatchMetric = 9 ) // Enum value maps for DispatchMetric. @@ -1081,6 +1087,7 @@ var ( 6: "DISPATCH_METRIC_RELATIVE_RETURN", 7: "DISPATCH_METRIC_RETURN_VOLATILITY", 8: "DISPATCH_METRIC_VALIDATOR_RANKING", + 9: "DISPATCH_METRIC_REALISED_RETURN", } DispatchMetric_value = map[string]int32{ "DISPATCH_METRIC_UNSPECIFIED": 0, @@ -1092,6 +1099,7 @@ var ( "DISPATCH_METRIC_RELATIVE_RETURN": 6, "DISPATCH_METRIC_RETURN_VOLATILITY": 7, "DISPATCH_METRIC_VALIDATOR_RANKING": 8, + "DISPATCH_METRIC_REALISED_RETURN": 9, } ) @@ -1738,21 +1746,24 @@ const ( StopOrder_REJECTION_REASON_STOP_ORDER_NOT_ALLOWED_DURING_OPENING_AUCTION StopOrder_RejectionReason = 8 // Stop OCO orders cannot have the same expiry timestamp StopOrder_REJECTION_REASON_STOP_ORDER_CANNOT_MATCH_OCO_EXPIRY_TIMES StopOrder_RejectionReason = 9 + // Stop orders with a position size override are not supported for spot markets + StopOrder_REJECTION_REASON_STOP_ORDER_SIZE_OVERRIDE_UNSUPPORTED_FOR_SPOT StopOrder_RejectionReason = 10 ) // Enum value maps for StopOrder_RejectionReason. var ( StopOrder_RejectionReason_name = map[int32]string{ - 0: "REJECTION_REASON_UNSPECIFIED", - 1: "REJECTION_REASON_TRADING_NOT_ALLOWED", - 2: "REJECTION_REASON_EXPIRY_IN_THE_PAST", - 3: "REJECTION_REASON_MUST_BE_REDUCE_ONLY", - 4: "REJECTION_REASON_MAX_STOP_ORDERS_PER_PARTY_REACHED", - 5: "REJECTION_REASON_STOP_ORDER_NOT_ALLOWED_WITHOUT_A_POSITION", - 6: "REJECTION_REASON_STOP_ORDER_NOT_CLOSING_THE_POSITION", - 7: "REJECTION_REASON_STOP_ORDER_LINKED_PERCENTAGE_INVALID", - 8: "REJECTION_REASON_STOP_ORDER_NOT_ALLOWED_DURING_OPENING_AUCTION", - 9: "REJECTION_REASON_STOP_ORDER_CANNOT_MATCH_OCO_EXPIRY_TIMES", + 0: "REJECTION_REASON_UNSPECIFIED", + 1: "REJECTION_REASON_TRADING_NOT_ALLOWED", + 2: "REJECTION_REASON_EXPIRY_IN_THE_PAST", + 3: "REJECTION_REASON_MUST_BE_REDUCE_ONLY", + 4: "REJECTION_REASON_MAX_STOP_ORDERS_PER_PARTY_REACHED", + 5: "REJECTION_REASON_STOP_ORDER_NOT_ALLOWED_WITHOUT_A_POSITION", + 6: "REJECTION_REASON_STOP_ORDER_NOT_CLOSING_THE_POSITION", + 7: "REJECTION_REASON_STOP_ORDER_LINKED_PERCENTAGE_INVALID", + 8: "REJECTION_REASON_STOP_ORDER_NOT_ALLOWED_DURING_OPENING_AUCTION", + 9: "REJECTION_REASON_STOP_ORDER_CANNOT_MATCH_OCO_EXPIRY_TIMES", + 10: "REJECTION_REASON_STOP_ORDER_SIZE_OVERRIDE_UNSUPPORTED_FOR_SPOT", } StopOrder_RejectionReason_value = map[string]int32{ "REJECTION_REASON_UNSPECIFIED": 0, @@ -1765,6 +1776,7 @@ var ( "REJECTION_REASON_STOP_ORDER_LINKED_PERCENTAGE_INVALID": 7, "REJECTION_REASON_STOP_ORDER_NOT_ALLOWED_DURING_OPENING_AUCTION": 8, "REJECTION_REASON_STOP_ORDER_CANNOT_MATCH_OCO_EXPIRY_TIMES": 9, + "REJECTION_REASON_STOP_ORDER_SIZE_OVERRIDE_UNSUPPORTED_FOR_SPOT": 10, } ) @@ -4824,6 +4836,8 @@ type DispatchStrategy struct { RankTable []*Rank `protobuf:"bytes,13,rep,name=rank_table,json=rankTable,proto3" json:"rank_table,omitempty"` // If set, the actual amount of rewards transferred to each public key during distribution for this transfer will be `min(calculated_reward_in_quantum, cap_reward_fee_multiple × fees_paid_this_epoch_in_quantum). CapRewardFeeMultiple *string `protobuf:"bytes,14,opt,name=cap_reward_fee_multiple,json=capRewardFeeMultiple,proto3,oneof" json:"cap_reward_fee_multiple,omitempty"` + // Number of epochs between transfers, i.e. when 4, funds will be transferred every 4 epochs with the first transfer occurring 4 epochs after the transaction is processed. + TransferInterval *int32 `protobuf:"varint,15,opt,name=transfer_interval,json=transferInterval,proto3,oneof" json:"transfer_interval,omitempty"` } func (x *DispatchStrategy) Reset() { @@ -4956,6 +4970,13 @@ func (x *DispatchStrategy) GetCapRewardFeeMultiple() string { return "" } +func (x *DispatchStrategy) GetTransferInterval() int32 { + if x != nil && x.TransferInterval != nil { + return *x.TransferInterval + } + return 0 +} + type Rank struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -7182,7 +7203,7 @@ type EthereumConfig struct { NetworkId string `protobuf:"bytes,1,opt,name=network_id,json=networkId,proto3" json:"network_id,omitempty"` // Chain ID of this Ethereum network. ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - // // Contract configuration of the collateral bridge contract for this Ethereum network. + // Contract configuration of the collateral bridge contract for this Ethereum network. CollateralBridgeContract *EthereumContractConfig `protobuf:"bytes,3,opt,name=collateral_bridge_contract,json=collateralBridgeContract,proto3" json:"collateral_bridge_contract,omitempty"` // Number of block confirmations to wait to consider an Ethereum transaction trusted. // An Ethereum block is trusted when there are at least "n" blocks confirmed by the @@ -7279,12 +7300,168 @@ func (x *EthereumConfig) GetMultisigControlContract() *EthereumContractConfig { return nil } +// EVM Chain configuration details. +type EVMBridgeConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Network ID of this EVM compatible network. + NetworkId string `protobuf:"bytes,1,opt,name=network_id,json=networkId,proto3" json:"network_id,omitempty"` + // Chain ID of this EVM compatible network. + ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // Contract configuration of the collateral bridge contract for this EVM compatible network. + CollateralBridgeContract *EthereumContractConfig `protobuf:"bytes,3,opt,name=collateral_bridge_contract,json=collateralBridgeContract,proto3" json:"collateral_bridge_contract,omitempty"` + // Number of block confirmations to wait to consider an EVM compatible chain transaction trusted. + // An EVM compatible chain block is trusted when there are at least "n" blocks confirmed by the + // network, "n" being the number of `confirmations` required. If `confirmations` was set to `3`, + // and the current block to be forged (or mined) on the EVM compatible chain is block 14, block + // 10 would be considered as trusted, but not block 11. + Confirmations uint32 `protobuf:"varint,4,opt,name=confirmations,proto3" json:"confirmations,omitempty"` + // Contract configuration of the multisig control contract for this EVM compatible network. + MultisigControlContract *EthereumContractConfig `protobuf:"bytes,5,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,6,opt,name=block_time,json=blockTime,proto3" json:"block_time,omitempty"` + // Display name of this network. + Name string `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *EVMBridgeConfig) Reset() { + *x = EVMBridgeConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_vega_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EVMBridgeConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EVMBridgeConfig) ProtoMessage() {} + +func (x *EVMBridgeConfig) ProtoReflect() protoreflect.Message { + mi := &file_vega_vega_proto_msgTypes[52] + 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 EVMBridgeConfig.ProtoReflect.Descriptor instead. +func (*EVMBridgeConfig) Descriptor() ([]byte, []int) { + return file_vega_vega_proto_rawDescGZIP(), []int{52} +} + +func (x *EVMBridgeConfig) GetNetworkId() string { + if x != nil { + return x.NetworkId + } + return "" +} + +func (x *EVMBridgeConfig) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + +func (x *EVMBridgeConfig) GetCollateralBridgeContract() *EthereumContractConfig { + if x != nil { + return x.CollateralBridgeContract + } + return nil +} + +func (x *EVMBridgeConfig) GetConfirmations() uint32 { + if x != nil { + return x.Confirmations + } + return 0 +} + +func (x *EVMBridgeConfig) GetMultisigControlContract() *EthereumContractConfig { + if x != nil { + return x.MultisigControlContract + } + return nil +} + +func (x *EVMBridgeConfig) GetBlockTime() string { + if x != nil { + return x.BlockTime + } + return "" +} + +func (x *EVMBridgeConfig) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// A list of EVM bridge configurations +type EVMBridgeConfigs struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The EVM configurations + Configs []*EVMBridgeConfig `protobuf:"bytes,1,rep,name=configs,proto3" json:"configs,omitempty"` +} + +func (x *EVMBridgeConfigs) Reset() { + *x = EVMBridgeConfigs{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_vega_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EVMBridgeConfigs) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EVMBridgeConfigs) ProtoMessage() {} + +func (x *EVMBridgeConfigs) ProtoReflect() protoreflect.Message { + mi := &file_vega_vega_proto_msgTypes[53] + 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 EVMBridgeConfigs.ProtoReflect.Descriptor instead. +func (*EVMBridgeConfigs) Descriptor() ([]byte, []int) { + return file_vega_vega_proto_rawDescGZIP(), []int{53} +} + +func (x *EVMBridgeConfigs) GetConfigs() []*EVMBridgeConfig { + if x != nil { + return x.Configs + } + return nil +} + type EthereumContractConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Address of the contract for this Ethereum network. The address should start with "0x". + // Address of the contract for this EVM compatible network. The address should start with "0x". Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` // Block height at which the stacking contract has been deployed for this Ethereum network. DeploymentBlockHeight uint64 `protobuf:"varint,6,opt,name=deployment_block_height,json=deploymentBlockHeight,proto3" json:"deployment_block_height,omitempty"` @@ -7293,7 +7470,7 @@ type EthereumContractConfig struct { func (x *EthereumContractConfig) Reset() { *x = EthereumContractConfig{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[52] + mi := &file_vega_vega_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7306,7 +7483,7 @@ func (x *EthereumContractConfig) String() string { func (*EthereumContractConfig) ProtoMessage() {} func (x *EthereumContractConfig) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[52] + mi := &file_vega_vega_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7319,7 +7496,7 @@ func (x *EthereumContractConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use EthereumContractConfig.ProtoReflect.Descriptor instead. func (*EthereumContractConfig) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{52} + return file_vega_vega_proto_rawDescGZIP(), []int{54} } func (x *EthereumContractConfig) GetAddress() string { @@ -7357,7 +7534,7 @@ type EpochTimestamps struct { func (x *EpochTimestamps) Reset() { *x = EpochTimestamps{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[53] + mi := &file_vega_vega_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7370,7 +7547,7 @@ func (x *EpochTimestamps) String() string { func (*EpochTimestamps) ProtoMessage() {} func (x *EpochTimestamps) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[53] + mi := &file_vega_vega_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7383,7 +7560,7 @@ func (x *EpochTimestamps) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochTimestamps.ProtoReflect.Descriptor instead. func (*EpochTimestamps) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{53} + return file_vega_vega_proto_rawDescGZIP(), []int{55} } func (x *EpochTimestamps) GetStartTime() int64 { @@ -7439,7 +7616,7 @@ type Epoch struct { func (x *Epoch) Reset() { *x = Epoch{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[54] + mi := &file_vega_vega_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7452,7 +7629,7 @@ func (x *Epoch) String() string { func (*Epoch) ProtoMessage() {} func (x *Epoch) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[54] + mi := &file_vega_vega_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7465,7 +7642,7 @@ func (x *Epoch) ProtoReflect() protoreflect.Message { // Deprecated: Use Epoch.ProtoReflect.Descriptor instead. func (*Epoch) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{54} + return file_vega_vega_proto_rawDescGZIP(), []int{56} } func (x *Epoch) GetSeq() uint64 { @@ -7510,7 +7687,7 @@ type EpochParticipation struct { func (x *EpochParticipation) Reset() { *x = EpochParticipation{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[55] + mi := &file_vega_vega_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7523,7 +7700,7 @@ func (x *EpochParticipation) String() string { func (*EpochParticipation) ProtoMessage() {} func (x *EpochParticipation) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[55] + mi := &file_vega_vega_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7536,7 +7713,7 @@ func (x *EpochParticipation) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochParticipation.ProtoReflect.Descriptor instead. func (*EpochParticipation) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{55} + return file_vega_vega_proto_rawDescGZIP(), []int{57} } func (x *EpochParticipation) GetEpoch() *Epoch { @@ -7583,7 +7760,7 @@ type EpochData struct { func (x *EpochData) Reset() { *x = EpochData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[56] + mi := &file_vega_vega_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7596,7 +7773,7 @@ func (x *EpochData) String() string { func (*EpochData) ProtoMessage() {} func (x *EpochData) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[56] + mi := &file_vega_vega_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7609,7 +7786,7 @@ func (x *EpochData) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochData.ProtoReflect.Descriptor instead. func (*EpochData) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{56} + return file_vega_vega_proto_rawDescGZIP(), []int{58} } func (x *EpochData) GetTotal() int32 { @@ -7655,7 +7832,7 @@ type RankingScore struct { func (x *RankingScore) Reset() { *x = RankingScore{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[57] + mi := &file_vega_vega_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7668,7 +7845,7 @@ func (x *RankingScore) String() string { func (*RankingScore) ProtoMessage() {} func (x *RankingScore) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[57] + mi := &file_vega_vega_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7681,7 +7858,7 @@ func (x *RankingScore) ProtoReflect() protoreflect.Message { // Deprecated: Use RankingScore.ProtoReflect.Descriptor instead. func (*RankingScore) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{57} + return file_vega_vega_proto_rawDescGZIP(), []int{59} } func (x *RankingScore) GetStakeScore() string { @@ -7748,7 +7925,7 @@ type RewardScore struct { func (x *RewardScore) Reset() { *x = RewardScore{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[58] + mi := &file_vega_vega_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7761,7 +7938,7 @@ func (x *RewardScore) String() string { func (*RewardScore) ProtoMessage() {} func (x *RewardScore) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[58] + mi := &file_vega_vega_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7774,7 +7951,7 @@ func (x *RewardScore) ProtoReflect() protoreflect.Message { // Deprecated: Use RewardScore.ProtoReflect.Descriptor instead. func (*RewardScore) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{58} + return file_vega_vega_proto_rawDescGZIP(), []int{60} } func (x *RewardScore) GetRawValidatorScore() string { @@ -7865,7 +8042,7 @@ type Node struct { func (x *Node) Reset() { *x = Node{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[59] + mi := &file_vega_vega_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7878,7 +8055,7 @@ func (x *Node) String() string { func (*Node) ProtoMessage() {} func (x *Node) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[59] + mi := &file_vega_vega_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7891,7 +8068,7 @@ func (x *Node) ProtoReflect() protoreflect.Message { // Deprecated: Use Node.ProtoReflect.Descriptor instead. func (*Node) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{59} + return file_vega_vega_proto_rawDescGZIP(), []int{61} } func (x *Node) GetId() string { @@ -8041,7 +8218,7 @@ type NodeSet struct { func (x *NodeSet) Reset() { *x = NodeSet{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[60] + mi := &file_vega_vega_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8054,7 +8231,7 @@ func (x *NodeSet) String() string { func (*NodeSet) ProtoMessage() {} func (x *NodeSet) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[60] + mi := &file_vega_vega_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8067,7 +8244,7 @@ func (x *NodeSet) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeSet.ProtoReflect.Descriptor instead. func (*NodeSet) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{60} + return file_vega_vega_proto_rawDescGZIP(), []int{62} } func (x *NodeSet) GetTotal() uint32 { @@ -8129,7 +8306,7 @@ type NodeData struct { func (x *NodeData) Reset() { *x = NodeData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[61] + mi := &file_vega_vega_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8142,7 +8319,7 @@ func (x *NodeData) String() string { func (*NodeData) ProtoMessage() {} func (x *NodeData) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[61] + mi := &file_vega_vega_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8155,7 +8332,7 @@ func (x *NodeData) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeData.ProtoReflect.Descriptor instead. func (*NodeData) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{61} + return file_vega_vega_proto_rawDescGZIP(), []int{63} } func (x *NodeData) GetStakedTotal() string { @@ -8225,7 +8402,7 @@ type Delegation struct { func (x *Delegation) Reset() { *x = Delegation{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[62] + mi := &file_vega_vega_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8238,7 +8415,7 @@ func (x *Delegation) String() string { func (*Delegation) ProtoMessage() {} func (x *Delegation) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[62] + mi := &file_vega_vega_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8251,7 +8428,7 @@ func (x *Delegation) ProtoReflect() protoreflect.Message { // Deprecated: Use Delegation.ProtoReflect.Descriptor instead. func (*Delegation) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{62} + return file_vega_vega_proto_rawDescGZIP(), []int{64} } func (x *Delegation) GetParty() string { @@ -8319,7 +8496,7 @@ type Reward struct { func (x *Reward) Reset() { *x = Reward{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[63] + mi := &file_vega_vega_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8332,7 +8509,7 @@ func (x *Reward) String() string { func (*Reward) ProtoMessage() {} func (x *Reward) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[63] + mi := &file_vega_vega_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8345,7 +8522,7 @@ func (x *Reward) ProtoReflect() protoreflect.Message { // Deprecated: Use Reward.ProtoReflect.Descriptor instead. func (*Reward) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{63} + return file_vega_vega_proto_rawDescGZIP(), []int{65} } func (x *Reward) GetAssetId() string { @@ -8449,7 +8626,7 @@ type RewardSummary struct { func (x *RewardSummary) Reset() { *x = RewardSummary{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[64] + mi := &file_vega_vega_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8462,7 +8639,7 @@ func (x *RewardSummary) String() string { func (*RewardSummary) ProtoMessage() {} func (x *RewardSummary) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[64] + mi := &file_vega_vega_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8475,7 +8652,7 @@ func (x *RewardSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use RewardSummary.ProtoReflect.Descriptor instead. func (*RewardSummary) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{64} + return file_vega_vega_proto_rawDescGZIP(), []int{66} } func (x *RewardSummary) GetAssetId() string { @@ -8520,7 +8697,7 @@ type EpochRewardSummary struct { func (x *EpochRewardSummary) Reset() { *x = EpochRewardSummary{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[65] + mi := &file_vega_vega_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8533,7 +8710,7 @@ func (x *EpochRewardSummary) String() string { func (*EpochRewardSummary) ProtoMessage() {} func (x *EpochRewardSummary) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[65] + mi := &file_vega_vega_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8546,7 +8723,7 @@ func (x *EpochRewardSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochRewardSummary.ProtoReflect.Descriptor instead. func (*EpochRewardSummary) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{65} + return file_vega_vega_proto_rawDescGZIP(), []int{67} } func (x *EpochRewardSummary) GetEpoch() uint64 { @@ -8600,7 +8777,7 @@ type StateValueProposal struct { func (x *StateValueProposal) Reset() { *x = StateValueProposal{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[66] + mi := &file_vega_vega_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8613,7 +8790,7 @@ func (x *StateValueProposal) String() string { func (*StateValueProposal) ProtoMessage() {} func (x *StateValueProposal) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[66] + mi := &file_vega_vega_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8626,7 +8803,7 @@ func (x *StateValueProposal) ProtoReflect() protoreflect.Message { // Deprecated: Use StateValueProposal.ProtoReflect.Descriptor instead. func (*StateValueProposal) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{66} + return file_vega_vega_proto_rawDescGZIP(), []int{68} } func (x *StateValueProposal) GetStateVarId() string { @@ -8663,7 +8840,7 @@ type KeyValueBundle struct { func (x *KeyValueBundle) Reset() { *x = KeyValueBundle{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[67] + mi := &file_vega_vega_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8676,7 +8853,7 @@ func (x *KeyValueBundle) String() string { func (*KeyValueBundle) ProtoMessage() {} func (x *KeyValueBundle) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[67] + mi := &file_vega_vega_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8689,7 +8866,7 @@ func (x *KeyValueBundle) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyValueBundle.ProtoReflect.Descriptor instead. func (*KeyValueBundle) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{67} + return file_vega_vega_proto_rawDescGZIP(), []int{69} } func (x *KeyValueBundle) GetKey() string { @@ -8729,7 +8906,7 @@ type StateVarValue struct { func (x *StateVarValue) Reset() { *x = StateVarValue{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[68] + mi := &file_vega_vega_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8742,7 +8919,7 @@ func (x *StateVarValue) String() string { func (*StateVarValue) ProtoMessage() {} func (x *StateVarValue) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[68] + mi := &file_vega_vega_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8755,7 +8932,7 @@ func (x *StateVarValue) ProtoReflect() protoreflect.Message { // Deprecated: Use StateVarValue.ProtoReflect.Descriptor instead. func (*StateVarValue) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{68} + return file_vega_vega_proto_rawDescGZIP(), []int{70} } func (m *StateVarValue) GetValue() isStateVarValue_Value { @@ -8819,7 +8996,7 @@ type ScalarValue struct { func (x *ScalarValue) Reset() { *x = ScalarValue{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[69] + mi := &file_vega_vega_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8832,7 +9009,7 @@ func (x *ScalarValue) String() string { func (*ScalarValue) ProtoMessage() {} func (x *ScalarValue) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[69] + mi := &file_vega_vega_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8845,7 +9022,7 @@ func (x *ScalarValue) ProtoReflect() protoreflect.Message { // Deprecated: Use ScalarValue.ProtoReflect.Descriptor instead. func (*ScalarValue) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{69} + return file_vega_vega_proto_rawDescGZIP(), []int{71} } func (x *ScalarValue) GetValue() string { @@ -8866,7 +9043,7 @@ type VectorValue struct { func (x *VectorValue) Reset() { *x = VectorValue{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[70] + mi := &file_vega_vega_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8879,7 +9056,7 @@ func (x *VectorValue) String() string { func (*VectorValue) ProtoMessage() {} func (x *VectorValue) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[70] + mi := &file_vega_vega_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8892,7 +9069,7 @@ func (x *VectorValue) ProtoReflect() protoreflect.Message { // Deprecated: Use VectorValue.ProtoReflect.Descriptor instead. func (*VectorValue) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{70} + return file_vega_vega_proto_rawDescGZIP(), []int{72} } func (x *VectorValue) GetValue() []string { @@ -8913,7 +9090,7 @@ type MatrixValue struct { func (x *MatrixValue) Reset() { *x = MatrixValue{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[71] + mi := &file_vega_vega_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8926,7 +9103,7 @@ func (x *MatrixValue) String() string { func (*MatrixValue) ProtoMessage() {} func (x *MatrixValue) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[71] + mi := &file_vega_vega_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8939,7 +9116,7 @@ func (x *MatrixValue) ProtoReflect() protoreflect.Message { // Deprecated: Use MatrixValue.ProtoReflect.Descriptor instead. func (*MatrixValue) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{71} + return file_vega_vega_proto_rawDescGZIP(), []int{73} } func (x *MatrixValue) GetValue() []*VectorValue { @@ -8974,7 +9151,7 @@ type ReferralProgram struct { func (x *ReferralProgram) Reset() { *x = ReferralProgram{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[72] + mi := &file_vega_vega_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8987,7 +9164,7 @@ func (x *ReferralProgram) String() string { func (*ReferralProgram) ProtoMessage() {} func (x *ReferralProgram) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[72] + mi := &file_vega_vega_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9000,7 +9177,7 @@ func (x *ReferralProgram) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralProgram.ProtoReflect.Descriptor instead. func (*ReferralProgram) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{72} + return file_vega_vega_proto_rawDescGZIP(), []int{74} } func (x *ReferralProgram) GetVersion() uint64 { @@ -9060,7 +9237,7 @@ type VolumeBenefitTier struct { func (x *VolumeBenefitTier) Reset() { *x = VolumeBenefitTier{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[73] + mi := &file_vega_vega_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9073,7 +9250,7 @@ func (x *VolumeBenefitTier) String() string { func (*VolumeBenefitTier) ProtoMessage() {} func (x *VolumeBenefitTier) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[73] + mi := &file_vega_vega_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9086,7 +9263,7 @@ func (x *VolumeBenefitTier) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeBenefitTier.ProtoReflect.Descriptor instead. func (*VolumeBenefitTier) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{73} + return file_vega_vega_proto_rawDescGZIP(), []int{75} } func (x *VolumeBenefitTier) GetMinimumRunningNotionalTakerVolume() string { @@ -9123,7 +9300,7 @@ type BenefitTier struct { func (x *BenefitTier) Reset() { *x = BenefitTier{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[74] + mi := &file_vega_vega_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9136,7 +9313,7 @@ func (x *BenefitTier) String() string { func (*BenefitTier) ProtoMessage() {} func (x *BenefitTier) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[74] + mi := &file_vega_vega_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9149,7 +9326,7 @@ func (x *BenefitTier) ProtoReflect() protoreflect.Message { // Deprecated: Use BenefitTier.ProtoReflect.Descriptor instead. func (*BenefitTier) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{74} + return file_vega_vega_proto_rawDescGZIP(), []int{76} } func (x *BenefitTier) GetMinimumRunningNotionalTakerVolume() string { @@ -9191,7 +9368,7 @@ type VestingBenefitTiers struct { func (x *VestingBenefitTiers) Reset() { *x = VestingBenefitTiers{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[75] + mi := &file_vega_vega_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9204,7 +9381,7 @@ func (x *VestingBenefitTiers) String() string { func (*VestingBenefitTiers) ProtoMessage() {} func (x *VestingBenefitTiers) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[75] + mi := &file_vega_vega_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9217,7 +9394,7 @@ func (x *VestingBenefitTiers) ProtoReflect() protoreflect.Message { // Deprecated: Use VestingBenefitTiers.ProtoReflect.Descriptor instead. func (*VestingBenefitTiers) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{75} + return file_vega_vega_proto_rawDescGZIP(), []int{77} } func (x *VestingBenefitTiers) GetTiers() []*VestingBenefitTier { @@ -9239,7 +9416,7 @@ type VestingBenefitTier struct { func (x *VestingBenefitTier) Reset() { *x = VestingBenefitTier{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[76] + mi := &file_vega_vega_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9252,7 +9429,7 @@ func (x *VestingBenefitTier) String() string { func (*VestingBenefitTier) ProtoMessage() {} func (x *VestingBenefitTier) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[76] + mi := &file_vega_vega_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9265,7 +9442,7 @@ func (x *VestingBenefitTier) ProtoReflect() protoreflect.Message { // Deprecated: Use VestingBenefitTier.ProtoReflect.Descriptor instead. func (*VestingBenefitTier) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{76} + return file_vega_vega_proto_rawDescGZIP(), []int{78} } func (x *VestingBenefitTier) GetMinimumQuantumBalance() string { @@ -9298,7 +9475,7 @@ type StakingTier struct { func (x *StakingTier) Reset() { *x = StakingTier{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[77] + mi := &file_vega_vega_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9311,7 +9488,7 @@ func (x *StakingTier) String() string { func (*StakingTier) ProtoMessage() {} func (x *StakingTier) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[77] + mi := &file_vega_vega_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9324,7 +9501,7 @@ func (x *StakingTier) ProtoReflect() protoreflect.Message { // Deprecated: Use StakingTier.ProtoReflect.Descriptor instead. func (*StakingTier) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{77} + return file_vega_vega_proto_rawDescGZIP(), []int{79} } func (x *StakingTier) GetMinimumStakedTokens() string { @@ -9363,7 +9540,7 @@ type VolumeDiscountProgram struct { func (x *VolumeDiscountProgram) Reset() { *x = VolumeDiscountProgram{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[78] + mi := &file_vega_vega_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9376,7 +9553,7 @@ func (x *VolumeDiscountProgram) String() string { func (*VolumeDiscountProgram) ProtoMessage() {} func (x *VolumeDiscountProgram) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[78] + mi := &file_vega_vega_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9389,7 +9566,7 @@ func (x *VolumeDiscountProgram) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountProgram.ProtoReflect.Descriptor instead. func (*VolumeDiscountProgram) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{78} + return file_vega_vega_proto_rawDescGZIP(), []int{80} } func (x *VolumeDiscountProgram) GetVersion() uint64 { @@ -9440,7 +9617,7 @@ type ActivityStreakBenefitTiers struct { func (x *ActivityStreakBenefitTiers) Reset() { *x = ActivityStreakBenefitTiers{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[79] + mi := &file_vega_vega_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9453,7 +9630,7 @@ func (x *ActivityStreakBenefitTiers) String() string { func (*ActivityStreakBenefitTiers) ProtoMessage() {} func (x *ActivityStreakBenefitTiers) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[79] + mi := &file_vega_vega_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9466,7 +9643,7 @@ func (x *ActivityStreakBenefitTiers) ProtoReflect() protoreflect.Message { // Deprecated: Use ActivityStreakBenefitTiers.ProtoReflect.Descriptor instead. func (*ActivityStreakBenefitTiers) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{79} + return file_vega_vega_proto_rawDescGZIP(), []int{81} } func (x *ActivityStreakBenefitTiers) GetTiers() []*ActivityStreakBenefitTier { @@ -9493,7 +9670,7 @@ type ActivityStreakBenefitTier struct { func (x *ActivityStreakBenefitTier) Reset() { *x = ActivityStreakBenefitTier{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[80] + mi := &file_vega_vega_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9506,7 +9683,7 @@ func (x *ActivityStreakBenefitTier) String() string { func (*ActivityStreakBenefitTier) ProtoMessage() {} func (x *ActivityStreakBenefitTier) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[80] + mi := &file_vega_vega_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9519,7 +9696,7 @@ func (x *ActivityStreakBenefitTier) ProtoReflect() protoreflect.Message { // Deprecated: Use ActivityStreakBenefitTier.ProtoReflect.Descriptor instead. func (*ActivityStreakBenefitTier) Descriptor() ([]byte, []int) { - return file_vega_vega_proto_rawDescGZIP(), []int{80} + return file_vega_vega_proto_rawDescGZIP(), []int{82} } func (x *ActivityStreakBenefitTier) GetMinimumActivityStreak() uint64 { @@ -9555,7 +9732,7 @@ type StopOrder_SizeOverrideValue struct { func (x *StopOrder_SizeOverrideValue) Reset() { *x = StopOrder_SizeOverrideValue{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[81] + mi := &file_vega_vega_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9568,7 +9745,7 @@ func (x *StopOrder_SizeOverrideValue) String() string { func (*StopOrder_SizeOverrideValue) ProtoMessage() {} func (x *StopOrder_SizeOverrideValue) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[81] + mi := &file_vega_vega_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9606,7 +9783,7 @@ var file_vega_vega_proto_rawDesc = []byte{ 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, 0xf9, 0x0f, 0x0a, + 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, @@ -9692,7 +9869,7 @@ var file_vega_vega_proto_rawDesc = []byte{ 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, 0xa0, 0x04, 0x0a, 0x0f, + 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, @@ -9726,860 +9903,898 @@ var file_vega_vega_proto_rawDesc = []byte{ 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, 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, + 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, - 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, + 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, 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, + 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, 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, 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, + 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, + 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, 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, 0xfd, 0x05, 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, 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, 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, - 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, + 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, 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, + 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, 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, + 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, 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, 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, + 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, + 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, 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, 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, + 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, 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, + 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, 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, + 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, @@ -10591,265 +10806,325 @@ var file_vega_vega_proto_rawDesc = []byte{ 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, 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, 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, + 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, + 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, 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, 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, + 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, 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, + 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, @@ -10857,540 +11132,482 @@ var file_vega_vega_proto_rawDesc = []byte{ 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, 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, + 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, - 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, 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, - 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, 0x92, 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, 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, + 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, 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, 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, + 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, 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, 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, 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, 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, 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, + 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, + 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, 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, 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, + 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, 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, 0xe0, - 0x02, 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, 0x2a, 0x61, 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x70, 0x65, - 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, - 0x0a, 0x18, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x49, - 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, - 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x41, - 0x4d, 0x53, 0x10, 0x02, 0x2a, 0x8d, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, - 0x75, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x44, 0x49, - 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, - 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x41, - 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, - 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x41, 0x4d, - 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, - 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x54, 0x45, - 0x41, 0x4d, 0x10, 0x03, 0x2a, 0x81, 0x01, 0x0a, 0x14, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x25, 0x0a, - 0x21, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, - 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x50, 0x52, - 0x4f, 0x5f, 0x52, 0x41, 0x54, 0x41, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x44, 0x49, 0x53, 0x54, - 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, - 0x59, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x10, 0x02, 0x2a, 0x63, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, + 0x41, 0x54, 0x45, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4c, 0x4f, 0x57, 0x10, + 0x2f, 0x12, 0x26, 0x0a, 0x22, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x49, 0x53, 0x4f, 0x4c, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x47, + 0x49, 0x4e, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x30, 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x22, + 0x04, 0x08, 0x11, 0x10, 0x11, 0x2a, 0x85, 0x03, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x49, 0x53, 0x50, + 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x49, 0x53, + 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x4d, 0x41, 0x4b, + 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x50, 0x41, 0x49, 0x44, 0x10, 0x01, 0x12, 0x27, + 0x0a, 0x23, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, + 0x43, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x43, + 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x49, 0x53, 0x50, 0x41, + 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x4c, 0x50, 0x5f, 0x46, 0x45, + 0x45, 0x53, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x03, 0x12, 0x20, 0x0a, + 0x1c, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, + 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x04, 0x12, + 0x24, 0x0a, 0x20, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, + 0x49, 0x43, 0x5f, 0x41, 0x56, 0x45, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, + 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, + 0x45, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x10, 0x06, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, + 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x45, + 0x54, 0x55, 0x52, 0x4e, 0x5f, 0x56, 0x4f, 0x4c, 0x41, 0x54, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x10, + 0x07, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, + 0x54, 0x52, 0x49, 0x43, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x52, + 0x41, 0x4e, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x49, 0x53, 0x50, + 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x45, 0x41, 0x4c, + 0x49, 0x53, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x10, 0x09, 0x2a, 0x61, 0x0a, + 0x0b, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, + 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x4e, + 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x44, 0x49, 0x56, + 0x49, 0x44, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x4e, 0x54, 0x49, + 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x53, 0x10, 0x02, + 0x2a, 0x8d, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, + 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, + 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x01, + 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, + 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x02, 0x12, 0x20, + 0x0a, 0x1c, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, + 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x03, + 0x2a, 0x81, 0x01, 0x0a, 0x14, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, + 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, + 0x47, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x22, 0x0a, 0x1e, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x5f, 0x52, 0x41, + 0x54, 0x41, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x52, 0x41, + 0x4e, 0x4b, 0x10, 0x02, 0x2a, 0x63, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x19, 0x0a, 0x15, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x4e, 0x4f, + 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x56, 0x41, + 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x59, 0x0a, 0x0b, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x50, 0x4f, 0x43, + 0x48, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x50, 0x4f, 0x43, 0x48, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x01, 0x12, 0x14, + 0x0a, 0x10, 0x45, 0x50, 0x4f, 0x43, 0x48, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, + 0x4e, 0x44, 0x10, 0x02, 0x2a, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x21, + 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, 0x19, 0x0a, 0x15, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x1d, - 0x0a, 0x19, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, - 0x4e, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x59, 0x0a, - 0x0b, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x18, - 0x45, 0x50, 0x4f, 0x43, 0x48, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x50, - 0x4f, 0x43, 0x48, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, - 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x50, 0x4f, 0x43, 0x48, 0x5f, 0x41, 0x43, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x44, 0x10, 0x02, 0x2a, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x25, 0x0a, 0x21, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, - 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x54, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x20, 0x0a, - 0x1c, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x53, 0x41, 0x54, 0x5a, 0x10, 0x02, 0x12, - 0x21, 0x0a, 0x1d, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 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, + 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, } var ( @@ -11406,7 +11623,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, 82) +var file_vega_vega_proto_msgTypes = make([]protoimpl.MessageInfo, 84) var file_vega_vega_proto_goTypes = []interface{}{ (Side)(0), // 0: vega.Side (Interval)(0), // 1: vega.Interval @@ -11489,40 +11706,42 @@ var file_vega_vega_proto_goTypes = []interface{}{ (*EthereumL2Config)(nil), // 78: vega.EthereumL2Config (*EthereumL2Configs)(nil), // 79: vega.EthereumL2Configs (*EthereumConfig)(nil), // 80: vega.EthereumConfig - (*EthereumContractConfig)(nil), // 81: vega.EthereumContractConfig - (*EpochTimestamps)(nil), // 82: vega.EpochTimestamps - (*Epoch)(nil), // 83: vega.Epoch - (*EpochParticipation)(nil), // 84: vega.EpochParticipation - (*EpochData)(nil), // 85: vega.EpochData - (*RankingScore)(nil), // 86: vega.RankingScore - (*RewardScore)(nil), // 87: vega.RewardScore - (*Node)(nil), // 88: vega.Node - (*NodeSet)(nil), // 89: vega.NodeSet - (*NodeData)(nil), // 90: vega.NodeData - (*Delegation)(nil), // 91: vega.Delegation - (*Reward)(nil), // 92: vega.Reward - (*RewardSummary)(nil), // 93: vega.RewardSummary - (*EpochRewardSummary)(nil), // 94: vega.EpochRewardSummary - (*StateValueProposal)(nil), // 95: vega.StateValueProposal - (*KeyValueBundle)(nil), // 96: vega.KeyValueBundle - (*StateVarValue)(nil), // 97: vega.StateVarValue - (*ScalarValue)(nil), // 98: vega.ScalarValue - (*VectorValue)(nil), // 99: vega.VectorValue - (*MatrixValue)(nil), // 100: vega.MatrixValue - (*ReferralProgram)(nil), // 101: vega.ReferralProgram - (*VolumeBenefitTier)(nil), // 102: vega.VolumeBenefitTier - (*BenefitTier)(nil), // 103: vega.BenefitTier - (*VestingBenefitTiers)(nil), // 104: vega.VestingBenefitTiers - (*VestingBenefitTier)(nil), // 105: vega.VestingBenefitTier - (*StakingTier)(nil), // 106: vega.StakingTier - (*VolumeDiscountProgram)(nil), // 107: vega.VolumeDiscountProgram - (*ActivityStreakBenefitTiers)(nil), // 108: vega.ActivityStreakBenefitTiers - (*ActivityStreakBenefitTier)(nil), // 109: vega.ActivityStreakBenefitTier - (*StopOrder_SizeOverrideValue)(nil), // 110: vega.StopOrder.SizeOverrideValue - (CompositePriceType)(0), // 111: vega.CompositePriceType - (Market_TradingMode)(0), // 112: vega.Market.TradingMode - (Market_State)(0), // 113: vega.Market.State - (*PriceMonitoringTrigger)(nil), // 114: vega.PriceMonitoringTrigger + (*EVMBridgeConfig)(nil), // 81: vega.EVMBridgeConfig + (*EVMBridgeConfigs)(nil), // 82: vega.EVMBridgeConfigs + (*EthereumContractConfig)(nil), // 83: vega.EthereumContractConfig + (*EpochTimestamps)(nil), // 84: vega.EpochTimestamps + (*Epoch)(nil), // 85: vega.Epoch + (*EpochParticipation)(nil), // 86: vega.EpochParticipation + (*EpochData)(nil), // 87: vega.EpochData + (*RankingScore)(nil), // 88: vega.RankingScore + (*RewardScore)(nil), // 89: vega.RewardScore + (*Node)(nil), // 90: vega.Node + (*NodeSet)(nil), // 91: vega.NodeSet + (*NodeData)(nil), // 92: vega.NodeData + (*Delegation)(nil), // 93: vega.Delegation + (*Reward)(nil), // 94: vega.Reward + (*RewardSummary)(nil), // 95: vega.RewardSummary + (*EpochRewardSummary)(nil), // 96: vega.EpochRewardSummary + (*StateValueProposal)(nil), // 97: vega.StateValueProposal + (*KeyValueBundle)(nil), // 98: vega.KeyValueBundle + (*StateVarValue)(nil), // 99: vega.StateVarValue + (*ScalarValue)(nil), // 100: vega.ScalarValue + (*VectorValue)(nil), // 101: vega.VectorValue + (*MatrixValue)(nil), // 102: vega.MatrixValue + (*ReferralProgram)(nil), // 103: vega.ReferralProgram + (*VolumeBenefitTier)(nil), // 104: vega.VolumeBenefitTier + (*BenefitTier)(nil), // 105: vega.BenefitTier + (*VestingBenefitTiers)(nil), // 106: vega.VestingBenefitTiers + (*VestingBenefitTier)(nil), // 107: vega.VestingBenefitTier + (*StakingTier)(nil), // 108: vega.StakingTier + (*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 } var file_vega_vega_proto_depIdxs = []int32{ 30, // 0: vega.PartyProfile.metadata:type_name -> vega.Metadata @@ -11531,7 +11750,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 - 110, // 6: vega.StopOrder.size_override_value:type_name -> vega.StopOrder.SizeOverrideValue + 112, // 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 @@ -11579,62 +11798,65 @@ 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 - 111, // 54: vega.PerpetualData.internal_composite_price_type:type_name -> vega.CompositePriceType + 113, // 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 - 112, // 57: vega.MarketData.market_trading_mode:type_name -> vega.Market.TradingMode + 114, // 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 - 113, // 62: vega.MarketData.market_state:type_name -> vega.Market.State + 115, // 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 - 111, // 65: vega.MarketData.mark_price_type:type_name -> vega.CompositePriceType + 113, // 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 - 114, // 68: vega.PriceMonitoringBounds.trigger:type_name -> vega.PriceMonitoringTrigger + 116, // 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 76, // 72: vega.LiquidityProvision.buys:type_name -> vega.LiquidityOrderReference 28, // 73: vega.LiquidityProvision.status:type_name -> vega.LiquidityProvision.Status 78, // 74: vega.EthereumL2Configs.configs:type_name -> vega.EthereumL2Config - 81, // 75: vega.EthereumConfig.collateral_bridge_contract:type_name -> vega.EthereumContractConfig - 81, // 76: vega.EthereumConfig.staking_bridge_contract:type_name -> vega.EthereumContractConfig - 81, // 77: vega.EthereumConfig.token_vesting_contract:type_name -> vega.EthereumContractConfig - 81, // 78: vega.EthereumConfig.multisig_control_contract:type_name -> vega.EthereumContractConfig - 82, // 79: vega.Epoch.timestamps:type_name -> vega.EpochTimestamps - 88, // 80: vega.Epoch.validators:type_name -> vega.Node - 91, // 81: vega.Epoch.delegations:type_name -> vega.Delegation - 83, // 82: vega.EpochParticipation.epoch:type_name -> vega.Epoch - 15, // 83: vega.RankingScore.previous_status:type_name -> vega.ValidatorNodeStatus - 15, // 84: vega.RankingScore.status:type_name -> vega.ValidatorNodeStatus - 15, // 85: vega.RewardScore.validator_status:type_name -> vega.ValidatorNodeStatus - 85, // 86: vega.Node.epoch_data:type_name -> vega.EpochData - 13, // 87: vega.Node.status:type_name -> vega.NodeStatus - 91, // 88: vega.Node.delegations:type_name -> vega.Delegation - 87, // 89: vega.Node.reward_score:type_name -> vega.RewardScore - 86, // 90: vega.Node.ranking_score:type_name -> vega.RankingScore - 89, // 91: vega.NodeData.tendermint_nodes:type_name -> vega.NodeSet - 89, // 92: vega.NodeData.ersatz_nodes:type_name -> vega.NodeSet - 89, // 93: vega.NodeData.pending_nodes:type_name -> vega.NodeSet - 96, // 94: vega.StateValueProposal.kvb:type_name -> vega.KeyValueBundle - 97, // 95: vega.KeyValueBundle.value:type_name -> vega.StateVarValue - 98, // 96: vega.StateVarValue.scalar_val:type_name -> vega.ScalarValue - 99, // 97: vega.StateVarValue.vector_val:type_name -> vega.VectorValue - 100, // 98: vega.StateVarValue.matrix_val:type_name -> vega.MatrixValue - 99, // 99: vega.MatrixValue.value:type_name -> vega.VectorValue - 103, // 100: vega.ReferralProgram.benefit_tiers:type_name -> vega.BenefitTier - 106, // 101: vega.ReferralProgram.staking_tiers:type_name -> vega.StakingTier - 105, // 102: vega.VestingBenefitTiers.tiers:type_name -> vega.VestingBenefitTier - 102, // 103: vega.VolumeDiscountProgram.benefit_tiers:type_name -> vega.VolumeBenefitTier - 109, // 104: vega.ActivityStreakBenefitTiers.tiers:type_name -> vega.ActivityStreakBenefitTier - 105, // [105:105] is the sub-list for method output_type - 105, // [105:105] is the sub-list for method input_type - 105, // [105:105] is the sub-list for extension type_name - 105, // [105:105] is the sub-list for extension extendee - 0, // [0:105] is the sub-list for field type_name + 83, // 75: vega.EthereumConfig.collateral_bridge_contract:type_name -> vega.EthereumContractConfig + 83, // 76: vega.EthereumConfig.staking_bridge_contract:type_name -> vega.EthereumContractConfig + 83, // 77: vega.EthereumConfig.token_vesting_contract:type_name -> vega.EthereumContractConfig + 83, // 78: vega.EthereumConfig.multisig_control_contract:type_name -> vega.EthereumContractConfig + 83, // 79: vega.EVMBridgeConfig.collateral_bridge_contract:type_name -> vega.EthereumContractConfig + 83, // 80: vega.EVMBridgeConfig.multisig_control_contract:type_name -> vega.EthereumContractConfig + 81, // 81: vega.EVMBridgeConfigs.configs:type_name -> vega.EVMBridgeConfig + 84, // 82: vega.Epoch.timestamps:type_name -> vega.EpochTimestamps + 90, // 83: vega.Epoch.validators:type_name -> vega.Node + 93, // 84: vega.Epoch.delegations:type_name -> vega.Delegation + 85, // 85: vega.EpochParticipation.epoch:type_name -> vega.Epoch + 15, // 86: vega.RankingScore.previous_status:type_name -> vega.ValidatorNodeStatus + 15, // 87: vega.RankingScore.status:type_name -> vega.ValidatorNodeStatus + 15, // 88: vega.RewardScore.validator_status:type_name -> vega.ValidatorNodeStatus + 87, // 89: vega.Node.epoch_data:type_name -> vega.EpochData + 13, // 90: vega.Node.status:type_name -> vega.NodeStatus + 93, // 91: vega.Node.delegations:type_name -> vega.Delegation + 89, // 92: vega.Node.reward_score:type_name -> vega.RewardScore + 88, // 93: vega.Node.ranking_score:type_name -> vega.RankingScore + 91, // 94: vega.NodeData.tendermint_nodes:type_name -> vega.NodeSet + 91, // 95: vega.NodeData.ersatz_nodes:type_name -> vega.NodeSet + 91, // 96: vega.NodeData.pending_nodes:type_name -> vega.NodeSet + 98, // 97: vega.StateValueProposal.kvb:type_name -> vega.KeyValueBundle + 99, // 98: vega.KeyValueBundle.value:type_name -> vega.StateVarValue + 100, // 99: vega.StateVarValue.scalar_val:type_name -> vega.ScalarValue + 101, // 100: vega.StateVarValue.vector_val:type_name -> vega.VectorValue + 102, // 101: vega.StateVarValue.matrix_val:type_name -> vega.MatrixValue + 101, // 102: vega.MatrixValue.value:type_name -> vega.VectorValue + 105, // 103: vega.ReferralProgram.benefit_tiers:type_name -> vega.BenefitTier + 108, // 104: vega.ReferralProgram.staking_tiers:type_name -> vega.StakingTier + 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 } func init() { file_vega_vega_proto_init() } @@ -12269,7 +12491,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EthereumContractConfig); i { + switch v := v.(*EVMBridgeConfig); i { case 0: return &v.state case 1: @@ -12281,7 +12503,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EpochTimestamps); i { + switch v := v.(*EVMBridgeConfigs); i { case 0: return &v.state case 1: @@ -12293,7 +12515,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Epoch); i { + switch v := v.(*EthereumContractConfig); i { case 0: return &v.state case 1: @@ -12305,7 +12527,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EpochParticipation); i { + switch v := v.(*EpochTimestamps); i { case 0: return &v.state case 1: @@ -12317,7 +12539,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EpochData); i { + switch v := v.(*Epoch); i { case 0: return &v.state case 1: @@ -12329,7 +12551,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RankingScore); i { + switch v := v.(*EpochParticipation); i { case 0: return &v.state case 1: @@ -12341,7 +12563,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RewardScore); i { + switch v := v.(*EpochData); i { case 0: return &v.state case 1: @@ -12353,7 +12575,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Node); i { + switch v := v.(*RankingScore); i { case 0: return &v.state case 1: @@ -12365,7 +12587,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeSet); i { + switch v := v.(*RewardScore); i { case 0: return &v.state case 1: @@ -12377,7 +12599,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeData); i { + switch v := v.(*Node); i { case 0: return &v.state case 1: @@ -12389,7 +12611,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Delegation); i { + switch v := v.(*NodeSet); i { case 0: return &v.state case 1: @@ -12401,7 +12623,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Reward); i { + switch v := v.(*NodeData); i { case 0: return &v.state case 1: @@ -12413,7 +12635,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RewardSummary); i { + switch v := v.(*Delegation); i { case 0: return &v.state case 1: @@ -12425,7 +12647,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EpochRewardSummary); i { + switch v := v.(*Reward); i { case 0: return &v.state case 1: @@ -12437,7 +12659,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateValueProposal); i { + switch v := v.(*RewardSummary); i { case 0: return &v.state case 1: @@ -12449,7 +12671,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeyValueBundle); i { + switch v := v.(*EpochRewardSummary); i { case 0: return &v.state case 1: @@ -12461,7 +12683,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateVarValue); i { + switch v := v.(*StateValueProposal); i { case 0: return &v.state case 1: @@ -12473,7 +12695,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ScalarValue); i { + switch v := v.(*KeyValueBundle); i { case 0: return &v.state case 1: @@ -12485,7 +12707,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VectorValue); i { + switch v := v.(*StateVarValue); i { case 0: return &v.state case 1: @@ -12497,7 +12719,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatrixValue); i { + switch v := v.(*ScalarValue); i { case 0: return &v.state case 1: @@ -12509,7 +12731,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReferralProgram); i { + switch v := v.(*VectorValue); i { case 0: return &v.state case 1: @@ -12521,7 +12743,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeBenefitTier); i { + switch v := v.(*MatrixValue); i { case 0: return &v.state case 1: @@ -12533,7 +12755,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BenefitTier); i { + switch v := v.(*ReferralProgram); i { case 0: return &v.state case 1: @@ -12545,7 +12767,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VestingBenefitTiers); i { + switch v := v.(*VolumeBenefitTier); i { case 0: return &v.state case 1: @@ -12557,7 +12779,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VestingBenefitTier); i { + switch v := v.(*BenefitTier); i { case 0: return &v.state case 1: @@ -12569,7 +12791,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StakingTier); i { + switch v := v.(*VestingBenefitTiers); i { case 0: return &v.state case 1: @@ -12581,7 +12803,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeDiscountProgram); i { + switch v := v.(*VestingBenefitTier); i { case 0: return &v.state case 1: @@ -12593,7 +12815,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActivityStreakBenefitTiers); i { + switch v := v.(*StakingTier); i { case 0: return &v.state case 1: @@ -12605,7 +12827,7 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActivityStreakBenefitTier); i { + switch v := v.(*VolumeDiscountProgram); i { case 0: return &v.state case 1: @@ -12617,6 +12839,30 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActivityStreakBenefitTiers); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_vega_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActivityStreakBenefitTier); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_vega_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StopOrder_SizeOverrideValue); i { case 0: return &v.state @@ -12644,9 +12890,9 @@ func file_vega_vega_proto_init() { (*ProductData_PerpetualData)(nil), } file_vega_vega_proto_msgTypes[37].OneofWrappers = []interface{}{} - file_vega_vega_proto_msgTypes[60].OneofWrappers = []interface{}{} - file_vega_vega_proto_msgTypes[63].OneofWrappers = []interface{}{} - file_vega_vega_proto_msgTypes[68].OneofWrappers = []interface{}{ + file_vega_vega_proto_msgTypes[62].OneofWrappers = []interface{}{} + file_vega_vega_proto_msgTypes[65].OneofWrappers = []interface{}{} + file_vega_vega_proto_msgTypes[70].OneofWrappers = []interface{}{ (*StateVarValue_ScalarVal)(nil), (*StateVarValue_VectorVal)(nil), (*StateVarValue_MatrixVal)(nil), @@ -12657,7 +12903,7 @@ func file_vega_vega_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vega_vega_proto_rawDesc, NumEnums: 29, - NumMessages: 82, + NumMessages: 84, NumExtensions: 0, NumServices: 0, }, diff --git a/protos/vega/vega_ext.go b/protos/vega/vega_ext.go index aba2fe6627..92706a8fb0 100644 --- a/protos/vega/vega_ext.go +++ b/protos/vega/vega_ext.go @@ -104,3 +104,95 @@ func (t *Trade) SetIDs(aggressive, passive *Order, idx int) { t.SellOrder = aggressive.Id t.BuyOrder = passive.Id } + +func (DispatchMetric) GetEnums() map[int32]string { + return DispatchMetric_name +} + +func (Side) GetEnums() map[int32]string { + return Side_name +} + +func (Asset_Status) GetEnums() map[int32]string { + return Asset_Status_name +} + +func (Market_TradingMode) GetEnums() map[int32]string { + return Market_TradingMode_name +} + +func (Market_State) GetEnums() map[int32]string { + return Market_State_name +} + +func (NodeStatus) GetEnums() map[int32]string { + return NodeStatus_name +} + +func (ValidatorNodeStatus) GetEnums() map[int32]string { + return ValidatorNodeStatus_name +} + +func (Deposit_Status) GetEnums() map[int32]string { + return Deposit_Status_name +} + +func (Withdrawal_Status) GetEnums() map[int32]string { + return Withdrawal_Status_name +} + +func (Proposal_State) GetEnums() map[int32]string { + return Proposal_State_name +} + +func (ProposalError) GetEnums() map[int32]string { + return ProposalError_name +} + +func (Vote_Value) GetEnums() map[int32]string { + return Vote_Value_name +} + +func (PositionStatus) GetEnums() map[int32]string { + return PositionStatus_name +} + +func (DataSourceSpec_Status) GetEnums() map[int32]string { + return DataSourceSpec_Status_name +} + +func (LiquidityProvision_Status) GetEnums() map[int32]string { + return LiquidityProvision_Status_name +} + +func (TransferType) GetEnums() map[int32]string { + return TransferType_name +} + +func (MarginMode) GetEnums() map[int32]string { + return MarginMode_name +} + +func (StopOrder_ExpiryStrategy) GetEnums() map[int32]string { + return StopOrder_ExpiryStrategy_name +} + +func (StopOrder_TriggerDirection) GetEnums() map[int32]string { + return StopOrder_TriggerDirection_name +} + +func (StopOrder_Status) GetEnums() map[int32]string { + return StopOrder_Status_name +} + +func (StopOrder_RejectionReason) GetEnums() map[int32]string { + return StopOrder_RejectionReason_name +} + +func (CompositePriceType) GetEnums() map[int32]string { + return CompositePriceType_name +} + +func (AuctionTrigger) GetEnums() map[int32]string { + return AuctionTrigger_name +} diff --git a/version/version.go b/version/version.go index d0a7a390aa..c2846d4b3b 100644 --- a/version/version.go +++ b/version/version.go @@ -22,7 +22,7 @@ import ( var ( cliVersionHash = "" - cliVersion = "v0.75.0" + cliVersion = "v0.76.0" ) func init() { diff --git a/wallet/pkg/send_transaction.go b/wallet/pkg/send_transaction.go new file mode 100644 index 0000000000..887dd5cd7b --- /dev/null +++ b/wallet/pkg/send_transaction.go @@ -0,0 +1,84 @@ +// 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 pkg + +import ( + "context" + "fmt" + + "code.vegaprotocol.io/vega/commands" + vgcrypto "code.vegaprotocol.io/vega/libs/crypto" + apipb "code.vegaprotocol.io/vega/protos/vega/api/v1" + commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" + walletpb "code.vegaprotocol.io/vega/protos/vega/wallet/v1" + "code.vegaprotocol.io/vega/wallet/api" + wcommands "code.vegaprotocol.io/vega/wallet/commands" + "code.vegaprotocol.io/vega/wallet/wallet" +) + +type Node interface { + SendTransaction(context.Context, *commandspb.Transaction, apipb.SubmitTransactionRequest_Type) (*apipb.SubmitTransactionResponse, error) + LastBlock(context.Context) (*apipb.LastBlockHeightResponse, error) +} + +func SendTransaction(ctx context.Context, w wallet.Wallet, pubKey string, request *walletpb.SubmitTransactionRequest, node Node) (*apipb.SubmitTransactionResponse, error) { + request.PubKey = pubKey + request.Propagate = true + if errs := wcommands.CheckSubmitTransactionRequest(request); !errs.Empty() { + return nil, errs + } + + lastBlockData, err := node.LastBlock(ctx) + if err != nil { + return nil, api.ErrCouldNotGetLastBlockInformation + } + + marshaledInputData, err := wcommands.ToMarshaledInputData(request, lastBlockData.Height) + if err != nil { + return nil, fmt.Errorf("could not marshal the input data: %w", err) + } + + signature, err := w.SignTx(pubKey, commands.BundleInputDataForSigning(marshaledInputData, lastBlockData.ChainId)) + if err != nil { + return nil, fmt.Errorf("could not sign the transaction: %w", err) + } + + // Build the transaction. + tx := commands.NewTransaction(pubKey, marshaledInputData, &commandspb.Signature{ + Value: signature.Value, + Algo: signature.Algo, + Version: signature.Version, + }) + + // Generate the proof of work for the transaction. + txID := vgcrypto.RandomHash() + powNonce, _, err := vgcrypto.PoW(lastBlockData.Hash, txID, uint(lastBlockData.SpamPowDifficulty), lastBlockData.SpamPowHashFunction) + if err != nil { + return nil, fmt.Errorf("could not compute the proof-of-work: %w", err) + } + + tx.Pow = &commandspb.ProofOfWork{ + Nonce: powNonce, + Tid: txID, + } + + result, err := node.SendTransaction(ctx, tx, apipb.SubmitTransactionRequest_TYPE_SYNC) + if err != nil { + return nil, err + } + + return result, nil +}